Contenu : guide
-
- avant-propos
- 1. De l'entrée à la maîtrise de la programmation Python
- 2. Combat réel du projet d'automatisation de l'interface
- 3. Combat réel du projet d'automatisation Web
- 4. Combat réel du projet d'automatisation des applications
- 5. CV des fabricants de premier rang
- 6. Tester et développer le système DevOps
- 7. Outils de test automatisés couramment utilisés
- Huit, test de performance JMeter
- 9. Résumé (petite surprise à la fin)
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
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
2. Combat réel du projet d'automatisation de l'interface
3. Combat réel du projet d'automatisation Web
4. Combat réel du projet d'automatisation des applications
5. CV des fabricants de premier rang
6. Tester et développer le système DevOps
7. Outils de test automatisés couramment utilisés
Huit, test de performance JMeter
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.