Python接口自动化

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 模块的子接口模块.

  1. 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
    
  2. 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'))
    
  3. 接口响应的断言
    将接口响应的断言单独写了个模块, 在这里实现了将测试结果回写进测试数据文件(这里可能会存在一个问题, 在用例很多的时候, 并发跑用例, 可能会出现多个线程都要写入结果, 那这个时候会出现只有一个线程能更新, 其余的都会报权限错误. )

    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):
                            
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值