一、接口自动化测试中,会用到测试账号,如何合理运用账号?
账号一般用于接口登录、接口用例传参、操作sql等,目前账号是写到yaml配置文件里,如果1个账户使用会出现资源冲突,可以配置多个账号使用,登录脚本中、用例脚本中、sql脚本中,先将读取过来的账号设为全局变量,然后用到的地方进行替换就。保证了账号的更换至需要动配置文件就可以了
二、接口自动化测试中,接口依赖前置数据较多,如何处理?
根据实际情况进行sql初始化数据或调前置接口
1、sql初始化数据
可能某个接口传参数据依赖很多前置接口响应或很多前置条件,首先需要对业务非常熟悉,且相关数据表很熟悉,然后构造合理的sql操作,setup时进行数据初始化前置插入,teardown时清理掉产生的数据,还原环境,保证不对环境进行数据污染,下次可继续复用
2、调前置接口
如果我当前接口依赖5个接口,调这5个接口,其中1个失败,继续重复执行多次,还是失败就失败掉当前接口
三、接口自动化测试中,接口是如何断言?
1、固定单值,用例中写四和响应结果断言
2、固定多值,用例中写四和响应结果断言
3、变动单值,查库与响应结果断言
4、变动多值,列表展示数据,断言前端用到展示出来的字段
2、变动多值,动态的多条列表数据断言
例如:二手房源列表,有单价、总价、面积、朝向、多少人关注等字段
我是把功能用到的字段,多条数据同类型的分别append到一个列表里与数据库查出来多条数据同类型的append到列表里进行断言对比,这样有多少个字段就要断言对比多少次
四、断言是如何封装的?
可以根据不同类型进行归类断言:
1、code msg类 {"code":0,"msg":"成功"} 、{"code":2603,"msg":"手机号错误"}
2、data列表数据类
json_data={
'count_tab_4': 13,
'total': 13,
'list': [{
'created_at': '2019-12-19 16:10:01',
'updated_at': '2019-12-19 16:15:01',
'company': {
'full_name': '项目',
'short_name': '项目简'
},
'task_sex': 1,
'task_user_id_card': '610523198806273676',
'task': {
'type_child_name': '软件开发',
'users_type_txt': '用户'
}
}, {
'created_at': '2019-12-17 11:25:02',
'updated_at': '2019-12-17 11:30:02',
'company': {
'full_name': '项目',
'short_name': '项目简'},
'task_sex': 1,
'task_name': '啊啊啊任务啊啊',
'task': {
'type_child_name': '软件开发',
'users_type_txt': '用户'}
}],
'page_size': 10,
'page': 1
}
class Assertion(object):
sql_values_list = []
response_values = []
def __init__(self):
self.test=ExecSql().exec_sql
def get_sql_data(self,project,sql_type,sql):
'''
查询sql数据组合成list
:param project:
:param sql_type:
:param sql:
:return:
'''
sql_values=self.test(project,sql_type,sql)
for i in sql_values:
for j in i:
self.sql_values_list.append(j)
def get_response_data(self,response_data, keys=[]):
'''
获取接口响应数据组合成list
:param response_data:
:param keys:
:return:
'''
if isinstance(response_data, list):
for value in response_data:
if isinstance(value, list) or isinstance(value, dict):
self.get_response_data(value, keys)
elif isinstance(response_data, dict):
for i, j in sorted(response_data.items()):
if i in keys:
self.response_values.append(j)
else:
self.get_response_data(j, keys)
else:
pass
def asser(self,expect,response_data,assert_type=None):
'''
断言
:param assert_type:
:param expect:
:param response_data:
:return:
'''
print(self.sql_values_list,self.response_values)
if assert_type=='type1':
assert self.sql_values_list==self.response_values
assert eval(expect)['code'] == response_data['code']
assert eval(expect)['msg'] == response_data['msg']