Python 接口自动化
公司项目有不少接口, 后期还会有更多的接口需要测试, 为了提升工作效率, 在新代码提交后, 尽早确保已有接口的正常工作, 所以安排上了接口自动化.
思维导图

具体实现
env config 文件
将环境数据放入yaml 文件管理, 方便在不同环境, 只需要修改配置文件就能跑用例. 考虑到以后要是有另外的接口什么的需要测试, 就写成了下面格式.
wechat_api:
base_URL: https://qyapi.weixin.qq.com/
define_path: config/api_relate/api_define/demo_wechat.yaml
test_data_path: testdata/api_cases/api_test_cases_demo.xlsx
sheet_name: WeChat_APIs
certificate_check: True
timeout: 2
API 相关
使用了类似于 UI 自动化 page object 的思维, 写了 BaseAPI 模块, 集成 BaseAPI 模块的子接口模块.
-
base api 模块实现以下功能
#执行测试用例 def run_cases(self, case_data, **kwargs): """ 根据测试数据来发送响应的request. 做断言. :param case_data: 测试用例数据 :param kwargs: 其他的一些可能用到的参数 :return: """ if isinstance(case_data, dict): logger.debug('case data is a dict') self.update_temp_variables(case_data) run_api = case_data.get('api_name') self.update_request_by_case(case_data) getattr(self, run_api)(**kwargs) logger.debug('self resp value is: ') logger.debug(self.resp) self.common_asserts.assert_response(self.resp, case_data, self.env_data) if case_data.get('export_data'): # TODO 这里将增加 response 数据中取出特定数据放入变量中. 供后面测试用例使用. pass else: logger.debug("case data type is: ") logger.debug(type(case_data)) ``` ```python # 发送request 请求. def send_request(self, api_define) -> Response: """ 发送 request 请求 :param api_define: api 的相关定义数据 :return: 返回 response """ self.update_req_var_api_define(api_define) self.req = self.replace_req_variables(self.req) logger.info('send request as: ') logger.info(self.req) resp = requests.request( url=self.req.get('url'), method=self.req.get('method'), params=self.req.get('params'), data=self.req.get('data'), json=self.req.get('json'), files=self.req.get('files'), auth=self.req.get('auth'), timeout=self.req.get('timeout'), verify=self.req.get('verify') ) self.format_resp(resp) self.req.clear() # 清空 request 中的数据 return resp -
xxx_api 模块
每一个 xxx_api 都有对应的接口, 在调用时, 会从对应的配置文件中取到接口配置信息.WeChat: /cgi-bin/user/simplelist: endpoint: /cgi-bin/user/simplelist method: get /cgi-bin/user/get: endpoint: /cgi-bin/user/get method: get#每一个方法都会自己发送请求 def simplelist(self): self.send_request(self.api_define['WeChat'].get('/cgi-bin/user/simplelist')) -
接口响应的断言
将接口响应的断言单独写了个模块, 在这里实现了将测试结果回写进测试数据文件(这里可能会存在一个问题, 在用例很多的时候, 并发跑用例, 可能会出现多个线程都要写入结果, 那这个时候会出现只有一个线程能更新, 其余的都会报权限错误. )from requests import Response import json import jsonpath as jsonpath import logging from src.common.file_path_generator import GenerateFilePath from src.common.file_operation import FileOperation logger = logging.getLogger(__name__) class CommonAsserts: """ 断言类 提供各类的断言方法 """ # logger = log_utils.Logs() def __init__(self): self.file_path = GenerateFilePath() self.file_opr = FileOperation() def assert_response(self, resp: Response, case_data: dict, env_data: dict): """ response 的断言方法. :param resp: 接口响应 :param case_data: 测试用例数据 :param env_data: 环境数据 :return: """ checkpoint = case_data.get('check_point') if checkpoint: resp_json = resp.json() checkpoints = self.check_status_code(resp, checkpoint, case_data, env_data) if isinstance(checkpoints, dict): for key in checkpoints.keys(): # 遍历测试数据中的checkpoint if isinstance(checkpoints[key], list):

最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



