Marco de biblioteca de prueba
Similar a Modular Test Scripting Framework y tiene los mismos beneficios. La diferencia es que el marco de la biblioteca de prueba descompone la aplicación bajo prueba en procedimientos y funciones en lugar de scripts (y los scripts de prueba solo incluyen casos de uso que llaman a funciones). Este marco requiere la creación de archivos de biblioteca que describan los módulos, los fragmentos y la funcionalidad de la aplicación que se está probando.
Escenario: en el marco modular, encontramos que el proceso de adquisición de tokens de uso común no es fácil de mantener debido a las frecuentes llamadas y cambios, por lo que se convierte en una función para llamar, y todas las demás interfaces pueden cambiarse;
Por ejemplo: El caso de uso es el siguiente:
Obtener token --- crear una etiqueta.
Obtener token---crear etiqueta---eliminar la etiqueta que acaba de crear
Obtener token---crear etiqueta---etiqueta de consulta para consultar
A continuación, modifique el código a través del marco de la biblioteca de prueba. Los cambios son relativamente grandes. Se recomienda copiar el proyecto escrito anteriormente y hacer una copia de seguridad.
Paso 1. Cree un nuevo archivo common_api_info.py en la carpeta común y encapsule todas las interfaces api
Tanto la encapsulación de métodos como la encapsulación de clases están disponibles
Escribir código:
# encoding: utf-8
# @author: Jeffrey
# @file: common_api_info.py
# @time: 2022/7/26 22:05
# @desc: 测试库封装
import json
#该模块存放所有的接口定义及接口信息
class CommonApiInfo:
def __init__(self,session,hosts):
self.session = session
self.hosts = hosts
def get_access_token_api(self,grant_type,appid,secret):
"""获取token接口信息"""
url_params = {"grant_type": grant_type,
"appid": appid,
"secret": secret}
response = self.session.get(url="https://%s/cgi-bin/token" % self.hosts,
params=url_params)
return response
def create_user_tag_info(self,token_value,tag_name):
'''创建标签接口信息'''
url_params = {"access_token": token_value}
tag_info = { "tag": { "name": tag_name } }
tag_str = json.dumps(tag_info, ensure_ascii=False)
response = self.session.post(url="https://%s/cgi-bin/tags/create" % self.hosts,
params = url_params,
data=tag_str.encode('utf-8'))
return response
# 修改标签接口信息
# 查询标签接口信息
Paso 2. Modifique el archivo common_function.py
Escribir código:
# encoding: utf-8
# @author: Jeffrey
# @file: common_function.py
# @time: 2022/7/26 21:01
# @desc: 模块化框架
import jsonpath
from common.common_api_info import CommonApiInfo
def get_access_token_value(session_obj,hosts):
"""获取access_token的值"""
response = CommonApiInfo(session_obj,hosts).get_access_token_api('client_credential',
'wxf14419077f707856',
'92a113bd4b5ffdc72144740dc7123c99')
# 获取响应json中的access_token的值
token_value = jsonpath.jsonpath(response.json(), "$.access_token")[0]
return token_value
Paso 3. Modifique el archivo test_get_access_token_api.py
Escribir código:
# encoding: utf-8
# @author: Jeffrey
# @file: test_get_access_token_api.py
# @time: 2022/7/24 18:08
# @desc:
# 导入模块顺序:内置模块、第三方模块、自定义模块
import unittest
import requests
import jsonpath
from common import local_config
from common.common_api_info import CommonApiInfo
class TestGetAccessTokenApi(unittest.TestCase):
def setUp(self) -> None:
self.session = requests.session()
self.hosts = local_config.HOSTS
def tearDown(self) -> None:
self.session.close()
def test_case_01(self):
'''[api_case_01] 测试获取access_token能否正常调用'''
response = CommonApiInfo(self.session,self.hosts).get_access_token_api(
'client_credential','wxf14419077f707856','92a113bd4b5ffdc72144740dc7123c99'
)
# 获取响应json中的access_token的值
actual_result = jsonpath.jsonpath(response.json(), "$.access_token")
self.assertTrue(actual_result, "api_case_01 执行失败") #非空,非0 都返回True为真
def test_case_02(self):
'''[api_case_02] 测试获取access_token接口在appid错误时,能否正常处理错误'''
response = CommonApiInfo(self.session,self.hosts).get_access_token_api(
'client_credential','wxf14419077f707','92a113bd4b5ffdc72144740dc7123c99'
)
# 获取响应json中的errcode的值,因为jsonpath返回的是列表,故加上下标0
actual_result = jsonpath.jsonpath(response.json(), "$.errcode")[0]
self.assertEqual(actual_result,40013, "api_case_02 执行失败")
if __name__ == '__main__':
unittest.main(verbosity=2)
Ver resultados de ejecución:
Paso 4. Modifique el código del archivo test_create_user_tag_api.py;
Escribir código:
# encoding: utf-8
# @author: Jeffrey
# @file: test_create_user_tag_api.py
# @time: 2022/7/24 19:02
# @desc:
import unittest
import requests
import jsonpath
import json
from common import common_function
from common import local_config
from common.common_api_info import CommonApiInfo
class TestCreateUserTagApi(unittest.TestCase):
def setUp(self) -> None:
self.session = requests.session()
self.hosts = local_config.HOSTS
def tearDown(self) -> None:
self.session.close()
def test_case_01(self):
'''[api_case_03] 测试正常进行创建标签接口调用'''
#获 取access_token
token_value = common_function.get_access_token_value(self.session,self.hosts)
# 解决中文乱码问题;模拟post请求时,携带json 数据包含中文发送给服务器会转码
# 方式一:json.dumps()
# 获取创建标签接口
response = CommonApiInfo(self.session,self.hosts).create_user_tag_info(
token_value,'深圳人5'
)
# # 方式二:修改requests中的models.py中的源码,修改完后
# response = self.session.post(url="https://api.weixin.qq.com/cgi-bin/tags/create",
# params=tag_url_params,
# json=tag_boby)
# print(response.json())
# 获取响应json的tag的name值,因为jsonpath返回的是列表,故加上下标0
actual_result = jsonpath.jsonpath(response.json(), "$.tag.name")[0]
self.assertEqual(actual_result,"深圳人5", "api_case_03 执行失败")
if __name__ == '__main__':
unittest.main(verbosity=2)
Ver resultados de ejecución:
Paso 5. Ejecute el archivo run_api_tests.py nuevamente para ejecutar todos los casos de uso;
Beneficios: 1. Fácil de mantener 2. Los scripts de casos de prueba prestan más atención al proceso de prueba y minimizan los detalles de la interfaz 3. Reduce la redundancia de código
Caso práctico
La teoría óptica no sirve de nada, hay que aprender a seguirla, y hay que hacerlo uno mismo, para poder aplicar lo aprendido a la práctica, en este momento se puede aprender de algunos casos prácticos.
Si te es útil, dale me gusta y recógelo para alentar al autor. También es conveniente que lo encuentre rápidamente la próxima vez.
Si no lo entiende, consulte la pequeña tarjeta a continuación. El blogger también espera aprender y progresar con evaluadores de ideas afines.
A la edad adecuada, elija la posición correcta e intente aprovechar al máximo sus propias ventajas.
Mi camino de desarrollo de pruebas automatizadas es inseparable del plan de cada etapa del camino, porque me gusta planificar y resumir,
¡Pruebe y desarrolle tutoriales en video, notas de estudio y portales de recepción! ! !