Chaud sur tout le réseau, interface automation framework-pytest+yaml combat réel (finition super fine)


avant-propos

Httprunner utilise des fichiers yaml pour implémenter le framework d'automatisation d'interface.C'est très utile.Récemment, je regardais le framework pytest, donc en me référant au format de cas d'utilisation de httprunner, j'ai écrit un framework simple similaire à la version pytest.

conception de la structure du projet

La structure du projet est complètement conforme à la structure du projet de pytest. pytest recherche le fichier test_.py. Ici, je recherche le fichier test_.yml. La seule différence est cet endroit

Référence de la structure du projet

C1

Cela ne peut être réalisé que dans conftest.py, et la quantité de code est super petite.La
dernière version de pytest 7.x

def pytest_collect_file(parent, file_path):
    # 获取文件.yml 文件,匹配规则
    if file_path.suffix == ".yml" and file_path.name.startswith("test"):
        return YamlFile.from_parent(parent, path=file_path)

pytest 5.x et supérieur

import pytest
import requests


def pytest_collect_file(parent, path):
    # 获取文件.yml 文件,匹配规则
    if path.ext == ".yml" and path.basename.startswith("test"):
        # print(path)
        # print(parent)
        # return YamlFile(path, parent)
        return YamlFile.from_parent(parent, fspath=path)


class YamlFile(pytest.File):
    # 读取文件内容
    def collect(self):
        import yaml
        raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))
        for yaml_case in raw:
            name = yaml_case["test"]["name"]
            values = yaml_case["test"]
            yield YamlTest.from_parent(self, name=name, values=values)

class YamlTest(pytest.Item):
    def __init__(self, name, parent, values):
        super(YamlTest, self).__init__(name, parent)
        self.name = name
        self.values = values
        self.request = self.values.get("request")
        self.validate = self.values.get("validate")
        self.s = requests.session()

    def runtest(self):
        # 运行用例
        request_data = self.values["request"]
        # print(request_data)
        response = self.s.request(**request_data)
        print("\n", response.text)
        # 断言
        self.assert_response(response, self.validate)

    def assert_response(self, response, validate):
        '''设置断言'''
        import jsonpath
        for i in validate:
            if "eq" in i.keys():
                yaml_result = i.get("eq")[0]
                actual_result = jsonpath.jsonpath(response.json(), yaml_result)
                expect_result = i.get("eq")[1]
                print("实际结果:%s" % actual_result)
                print("期望结果:%s" % expect_result)
                assert actual_result[0] == expect_result

version pytest inférieure à 4.x

import pytest
import requests


def pytest_collect_file(parent, path):
    # 获取文件.yml 文件,匹配规则
    if path.ext == ".yml" and path.basename.startswith("test"):
        # print(path)
        # print(parent)
        return YamlFile(path, parent)



class YamlFile(pytest.File):
    # 读取文件内容
    def collect(self):
        import yaml
        raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))
        for yaml_case in raw:
            name = yaml_case["test"]["name"]
            values = yaml_case["test"]
            yield YamlTest(name, self, values)


class YamlTest(pytest.Item):
    def __init__(self, name, parent, values):
        super(YamlTest, self).__init__(name, parent)
        self.name = name
        self.values = values
        self.request = self.values.get("request")
        self.validate = self.values.get("validate")
        self.s = requests.session()

    def runtest(self):
        # 运行用例
        request_data = self.values["request"]
        # print(request_data)
        response = self.s.request(**request_data)
        print("\n", response.text)
        # 断言
        self.assert_response(response, self.validate)

    def assert_response(self, response, validate):
        '''设置断言'''
        import jsonpath
        for i in validate:
            if "eq" in i.keys():
                yaml_result = i.get("eq")[0]
                actual_result = jsonpath.jsonpath(response.json(), yaml_result)
                expect_result = i.get("eq")[1]
                print("实际结果:%s" % actual_result)
                print("期望结果:%s" % expect_result)
                assert actual_result[0] == expect_result

Affirmer cette partie, n'écrire actuellement que le jugement d'égalité, à titre de référence uniquement, prendre en charge jsonpath pour extraire les données json

Cas d'utilisation du format yaml

Dans n'importe quel répertoire du projet, tant qu'il s'agit d'un fichier yml qui commence par test_, nous le considérons comme un cas de test.
Le contenu de test_login.yml est le suivant

- test:
    name: login case1
    request:
        url: http://49.235.x.x:7000/api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: 123456
    validate:
        - eq: [$.msg, login success!]
        - eq: [$.code, 0]


- test:
    name: login case2
    request:
        url: 49.235.x.x:7000/api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: 123456
    validate:
        - eq: [$.msg, login success!]
        - eq: [$.code, 0]

Exécuter le cas d'utilisation

Exécutez le cas d'utilisation, respectez pleinement le style de cas d'utilisation simple de pytest, prenez en charge le rapport d'allure

pytest -v
D:\soft\api_pytest_1208>pytest -v
====================== test session starts ======================
platform win32 -- Python 3.6.6, pytest-4.5.0, py-1.9.0,
cachedir: .pytest_cache
rootdir: D:\soft\api_pytest_1208
plugins: allure-pytest-2.8.6
collected 4 items

data/test_login.yml::login case1 PASSED                    [ 25%]
data/test_login.yml::login case2 PASSED                    [ 50%]
data/test_login1.yml::login case1 PASSED                   [ 75%]
data/test_login1.yml::login case2 PASSED                   [100%]

=================== 4 passed in 1.34 seconds ====================

rapport d'attrait

pytest --alluredir ./report
Ce qui suit est le diagramme de système d'architecture de connaissances d'ingénieur de test logiciel le plus complet en 2023 que j'ai compilé

1. De l'entrée à la maîtrise de la programmation Python

Veuillez ajouter une description de l'image

2. Combat réel du projet d'automatisation de l'interface

Veuillez ajouter une description de l'image

3. Combat réel du projet d'automatisation Web

Veuillez ajouter une description de l'image

4. Combat réel du projet d'automatisation des applications

Veuillez ajouter une description de l'image

5. CV des fabricants de premier rang

Veuillez ajouter une description de l'image

6. Tester et développer le système DevOps

Veuillez ajouter une description de l'image

7. Outils de test automatisés couramment utilisés

Veuillez ajouter une description de l'image

Huit, test de performance JMeter

Veuillez ajouter une description de l'image

9. Résumé (petite surprise à la fin)

Avec un rêve en tête, gravissez courageusement le sommet, la lutte est le rythme de l'accomplissement. N'ayez pas peur des difficultés, respectez l'intention initiale et créez de la brillance avec persévérance. Chaque effort est le pouvoir de changer Croyez en votre propre énergie, travaillez dur et laissez le travail acharné et la sueur fleurir les brillantes fleurs de la vie.

Persévérez dans la poursuite, avancez courageusement et la lutte est le rythme de la danse hors de la vie. Ne craignez pas les difficultés, allez de l'avant et créez de l'éclat avec sagesse et sueur. Croyez en votre propre force, renforcez vos croyances et écrivez vos propres chefs-d'œuvre avec diligence.

Relevez le défi, dépassez la limite, la lutte est une opportunité de transformation. Continuez à travailler dur, aiguisez votre caractère et laissez votre passion vous faire avancer. Croyez en votre propre force, aventurez-vous courageusement dans le futur, arrosez les fleurs qui poussent avec de la sueur et créez votre propre vie brillante à la poursuite.

Guess you like

Origin blog.csdn.net/x2waiwai/article/details/132188190