接口自动化测试思路和实战(3):测试库框架
测试库框架
与模块化测试脚本框架很类似,并且具有同样的优点。不同的是测试库框架把待测应用程序分解为过程和函数而不是脚本(而测试脚本中只是包含调用函数的用例即可)。这个框架需要创建描述模块、片断以及待测应用程序的功能库文件。
场景: 在模块化框架中,我们发现常用的获取 token过程由于调用频繁,经常改动导致不好维护,所以做成一个函数进行调用,而其它所有的接口都可能会进行变更;
比如: 用例如下:
获取token---创建标签。
获取token---创建标签---删除刚创建的标签
获取token---创建标签---查询标签进行查询
下面通过测试库框架修改代码,改动的比较大,建议把上方写的项目重新复制一份,做个备份
步骤1、在common文件夹下新建common_api_info.py文件,把所有的api接口做个封装
方法封装,类封装都可以
编写代码:
# 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 # 修改标签接口信息 # 查询标签接口信息
步骤2、修改common_function.py文件
编写代码:
# 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
步骤3、修改test_get_access_token_api.py文件
编写代码:
# 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)
查看执行结果:
步骤4、修改test_create_user_tag_api.py文件代码;
编写代码:
# 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)
查看执行结果:
步骤5、再执行run_api_tests.py文件,执行所有用例;
好处: 1、易于维护2、测试用例脚本更多的去关注测试过程而淡化接口细节3、减少代码冗余