Contenido: Guía
-
- prefacio
- 1. De la entrada al dominio de la programación en Python
- 2. Proyecto de automatización de interfaz de combate real.
- 3. Combate real del proyecto de automatización web
- 4. Combate real del proyecto de automatización de aplicaciones
- 5. Hoja de vida de los fabricantes de primer nivel
- 6. Probar y desarrollar el sistema DevOps
- 7. Herramientas de prueba automatizadas de uso común
- Ocho, prueba de rendimiento JMeter
- 9. Resumen (pequeña sorpresa al final)
prefacio
Httprunner usa archivos yaml para implementar el marco de automatización de la interfaz. Es muy útil. Recientemente, estuve mirando el marco pytest, así que escribí un marco simple similar a la versión pytest al referirme al formato de caso de uso de httprunner.
diseño de la estructura del proyecto
La estructura del proyecto está completamente en línea con la estructura del proyecto de pytest. Pytest está buscando el archivo test_.py. Aquí estoy buscando el archivo test_.yml. La única diferencia es este lugar.
Referencia de la estructura del proyecto
Solo se puede realizar en conftest.py, y la cantidad de código es muy pequeña.La
última versión 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 y superior
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
versiones de pytest por debajo de 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
Afirme esta parte, actualmente solo escriba el juicio de igualdad, solo como referencia, admita jsonpath para extraer datos json
Casos de uso para el formato yaml
En cualquier directorio del proyecto, siempre que sea un archivo yml que comience con test_, lo consideramos un caso de prueba.El
contenido de test_login.yml es el siguiente
- 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]
Ejecutar el caso de uso
Ejecute el caso de uso, cumpla completamente con el estilo de caso de uso simple de pytest, admita el informe 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 ====================
informe atractivo
pytest --alluredir ./report
El siguiente es el diagrama de sistema de arquitectura de conocimiento de aprendizaje de ingeniero de prueba de software más completo en 2023 que compilé |
1. De la entrada al dominio de la programación en Python
2. Proyecto de automatización de interfaz de combate real.
3. Combate real del proyecto de automatización web
4. Combate real del proyecto de automatización de aplicaciones
5. Hoja de vida de los fabricantes de primer nivel
6. Probar y desarrollar el sistema DevOps
7. Herramientas de prueba automatizadas de uso común
Ocho, prueba de rendimiento JMeter
9. Resumen (pequeña sorpresa al final)
Con un sueño en mente, escala con valentía la cima, la lucha es el ritmo del logro. Sin miedo a las dificultades, adhiérase a la intención original y cree brillantez con persistencia. Cada esfuerzo es el poder para cambiar. Cree en tu propia energía, sigue adelante y deja que el trabajo duro y el sudor florezcan las brillantes flores de la vida.
Persevera en la búsqueda, avanza con valentía y la lucha es el ritmo de la danza de la vida. Sin miedo a las dificultades, sigue adelante y crea brillantez con sabiduría y sudor. Cree en tu propia fuerza, fortalece tus creencias y escribe tus propias obras maestras con diligencia.
Acepta el desafío, ve más allá del límite, la lucha es una oportunidad de transformación. Sigue trabajando duro, agudiza tu carácter y deja que tu pasión te impulse. Cree en tu propia fuerza, aventúrate valientemente en el futuro, riega las flores en crecimiento con sudor y crea tu propia vida brillante en la búsqueda.