目录
2:将接口数据写到 yaml 文件中 然后读取测试其实很简单 和 excel 操作一样,只需要封装一些操作 yaml 文件的函数即可.但是如果用 pytest 框架将如何实现多个接口驱动呢?
5:测试中总不可能只涉及到一个被测系统 比如需要修改一些配置等 那肯定要设计到后台的一些功能 当然用 selenium 的方式也可以实现 这里还是统一风格 用接口吧
7:用例不通过 如何快速定位 当日是通过详细的 log 了 我的 log 信息 记录了每一个接口的输入输出 以及对用例步骤进行了日志的区分 如下
前言:
pytest 框架 +yaml 文件驱动是一个非常方便的接口自动化测试方法。它可以让我们通过 yaml 文件来配置测试用例,简化测试代码的编写和维护。
先看下 yaml 文件的设计 yaml 文件我也比较喜欢 可以用& * 等符合定义和引用变量 很方便 这样这个接口数据会比较少
---
Test:
desc: "登录"
parameters:
-
#测试登录
desc: 测试登录
method: post
url: /gw-driver/zhuanche-driver/driver/login
data:
-
request-ts: '1574940616636'
sign: 0841B69FB087643979BF464E34350AA3
type: '2'
··-
request-ts: '1574940616636'
sign: 0841B69FB087643979BF464E34350AA3
type: '1'
header: &header
car-pf: ANDROID_DRIVER
car-ps: shouqi
car-sv: 8.1.0
car-mv: OPPO OPPO PACM00
appCode: android_special_driver
assert_code: 200
assert_in_text: 登录成功
assert_contents:
code: 0
1:如何获取 yaml 文件中的数据 这个真的够啰嗦
class GetData():
def __init__(self,file_name):
'''
获取filename.yaml 配置文件的所有数据
'''
self.desc = []
self.method = []
self.url = []
self.data = []
self.header = []
self.assert_code = []
self.assert_text = []
self.assert_in_text = []
self.assert_body_has = []
log.info('解析yaml文件 path:' + str(path) + ' Param/Yaml/'+file_name+'.yaml')
param = get_param(file_name)
for i in range(0, len(param)):
self.method.append(param[i]['method'])
self.url.append(param[i]['url'])
self.header.append(param[i]['header'])
if 'desc' in param[i]:
self.desc.append(param[i]['desc'])
else:
self.desc.append(None)
if 'data' in param[i]:
self.data.append(param[i]['data'])
else:
self.data.append(None)
if 'assert_code' in param[i]:
self.assert_code.append(param[i]['assert_code'])
else:
self.assert_code.append(None)
if 'assert_text' in param[i]:
self.assert_text.append(param[i]['assert_text'])
else:
self.assert_text.append(None)
if 'assert_body_has' in param[i]:
self.assert_body_has.append(param[i]['assert_body_has'])
else:
self.assert_body_has.append(None)
# 断言数据列表化
if 'assert_in_text' in param[i]:
text = param[i]['assert_in_text']
Ltext = list(text.split(' '))
self.assert_in_text.append(Ltext)
else:
self.assert_in_text.append(None)
我以抛出问题的方式讲述吧
2:将接口数据写到 yaml 文件中 然后读取测试其实很简单 和 excel 操作一样,只需要封装一些操作 yaml 文件的函数即可.但是如果用 pytest 框架将如何实现多个接口驱动呢?
毕竟有很多接口其实都没有依赖性的 我们没有必要一个接口写一个 test 那样效率太堪忧 其实基于 pytest 的 parameterize 特性 一切就可以解决了
#urls 为读取到yaml文件中的所有url type:list 如何获取数据 查看 title1
@pytest.mark.parametrize('url',urls)
def test_home_page(self,url):
'''
:param url:
:return:
'''
request = Request.Request(res)
#获取测试数据在yaml文件中的索引 关于重复的url目前还没有解决 所以只支持不同的url
index=urls.index(url)
log.info('测试接口描述:'+str(descs[index])) #打印日志
response=request.send_request(methods[index],urls[index],params[index],headers[index])
assert test.assert_code(response['code'], assert_codes[index])
if assert_in_texts[index] is not None:
assert test.assert_in_text(response['body'],*assert_in_texts[index])
@pytest.mark.parametrize('url',base_conf.urls)
def test_home_page_config(self,get_init_data,url):
'''
测试首页单接口
:param get_init_data:
:param url:
:return:
'''
res=get_init_data
request = Request.Request(res)
#获取测试数据在yaml文件中的索引
index=base_conf.urls.index(url)
if base_conf.run[index] == False:
pytest.skip('skip')
base_conf.log.info('测试接口描述:'+str(base_conf.descs[index]))
replace_data(res,base_conf.headers[index],base_conf.params[index])
#处理一个接口有多个用例数据
if type(base_conf.params[index])==list:
for i in base_conf.params[index]:
response&