最近在公司做接口测试,原来都是通过 excel 表格管理接口和参数,用 postman 做接口验证,jmeter 也可以做接口测试,之前自己做过一点接口自动化,对这方面有点积累,这样做的效率太低了,自己就想办法去采用工具去解决。
在这里看了 flystar 的一篇文章,很有收获,自己也想倒腾下,大致的思路是采用数据驱动去做接口测试,数据根据方法名去注入,公司的接口都是采用 http 协议,没有加密和解密,业务接口之前的关联性也比较小,独立接口测试,大部分处理逻辑都是相似的。数据采用 yml 格式,测试框架采用 python 自带的 unittest 框架,测试方法定义模板,依据测试数据自动生成用例,核心代码:
def get_params(func):
@wraps(func)
def func_with_params(self, *args, **kwargs):
class_name = self.__class__.__name__
method_name = func.__name__
print('class_name', class_name)
print('method_name', method_name)
params = data[class_name][method_name]['params']
#add module share data process
class_data_name = 'base_%s_data' % class_name.lower()
if class_data_name in data[class_name]:
params['post_data'] = dict(data[class_name][class_data_name]['params']['post_data'], **params['post_data'])
res = data[class_name][method_name]['return']
path = data[class_name][method_name]['path']
self.res = res
self.path = path
func(self, *args, **kwargs)
return func_with_params
yml 数据格式:
Interface_Test:
test_file:
path: '/api/path'
params:
{'method': 'POST', 'post_data': {'name':'jeky'},
}
return:
{'code': 'SUCCESS'}
test_normal:
path: '/api/login'
params:
{'method': 'PUT', 'post_data': {'password':'123'}}
return:
{'code': 'SUCCESS'}
入口程序根据 yml 文件去遍历测试数据,一级为文件,二级为接口方法,下面是路径,参数和返回值的验证。只需要维护 yml 格式文件就可以根据相应的请求类型 post/put/get 去生成对应模板的测试用例文件,由于检查点的多样性和业务差异,自动生成的脚本文件可以进行根据需要添加新的检查点,比如查询数据库字段进行验证。
为了达到用例脚本复用的目的,将同类数据文件放在同一个方法下面,post_data 参数可以是一个列表,比如异常密码有很多种情况,写成列表的形式,程序会自动识别 post_data 的类型,如果有多个参数就运行多次用例方法。这里使用的 unittest 的框架,框架会自动识别.py 文件中 test 开头的方法并进行运行.
下一步是测试数据管理,建立接口测试数据集,初始数据通过接口生成或从数据库构造, 通过这些初始公共数据去渲染测试数据文件,测试数据文件可以按照规则自动化生成,这样测试数据和接口测试方法都可以自动化生成,便于维护和减少编写成本,降低使用门槛。