点击上方蓝字关注我!
最近在学pytest的使用,不同于httprunner自动化测试框架,创建项目的时候就能把所有的项目文件目录整理出来,需要手动创建文件分类,不管怎么样,先学会用,在去了解它的底层原理。
这篇文章我把pytest+yaml+参数化一起讲解了。
一个简单的接口案例
# def test_movie_check():
# url = 'http://api.douban.com/v2/movie/in_theaters'
# params = {
# 'apikey': '0df993c66c0c636e29ecbb5344252a4a',
# 'start': 0,
# 'count': 10
# }
# headers = {
# "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
# }
# r = requests.get(url=url, params=params, headers=headers)
# response = r.json()
# assert response['count'] == params['count']
# assert response['start'] == params['start']
# assert response['title'] == '正在上映的电影-北京'
以上就是一个简单的python自带的requests的请求接口,并通过assert做断言,判断脚本运行是否正确。
pytest+yaml
看过我httprunner的应该都知道,httprunner主要就是通过yaml文件来进行接口调用的,原来pytest也能调用yaml文件,这里我们把yaml文件作为我们的接口数据准备文件,如下代码所示:
yaml方法的使用:
◆ yaml.load() : 读取yaml文件;
◆ yaml.load_all() : 生成迭代器,若存在多块yaml文档的时候,使用解析全部文档;
◆ yaml.dump(params1,params2) : yaml.dump将python对象生成yaml文档 params1 json格式的文档 ,params2 打卡一个文本或二进制文件,将生成的yaml文件写到文件中;
◆ yaml.dump_all() 将多个段输出到一个文件;
第一步:编写yaml文件,准备测试接口数据
test:
- case: 验证响应参数是否一致
requests:
method: GET
path: /v2/movie/in_theaters
headers:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
params:
apikey: 0df993c66c0c636e29ecbb5344252a4a
start: 0
count: 10
validate:
title: 正在上映的电影-北京
count: 10
start: 0
第二步:编写test_movie.py文件,get_test_data方法返回测试数据
python的zip用法:
☆ 将可迭代的对象作为参数,打包成元祖,然后返回元祖组成的对象
☆ 若每个迭代器的元素个数不一样,返回列表长度最短的对象
☆ 利用zip(*)将元祖解压成列表
☆ 通过list(zipped)来打印出压缩结果
☆ 好处:节省内存
def get_test_data(filepath):
case = [] # 存放测试用例名
requests = [] # 存放http请求对象
validate = [] # 存放断言
with open(filepath, encoding='utf-8') as f:
data = yaml.load(f.read(), Loader=yaml.SafeLoader)
case.append(data.get('test'))
requests.append(data.get('requests'))
validate.append(data.get('validate'))
params = zip(case, requests, validate)
return case, params
cases, parameters = comm_function.get_test_data('D:/workFile/test/pytest_demo/data/test_movie.yaml')
list_params = list(parameters)
print(list_params[0][1])
第三步:判断测试案例是否通过
@pytest.mark.parametrize 参数化,若yaml中有多条案例,会执行多次。
class TestInTheaters(object):
@pytest.mark.parametrize('case,http,validate', list(list_params), ids=cases)
def test_in_theaters(self, case, http, validate):
host = 'http://api.douban.com'
res = requests.request(http['method'], url=host+http['path'], headers=http['headers'],
params=http['params'])
response = res.json()
assert response['count'] == validate['count']
assert response['start'] == validate['start']
assert response['title'] == validate['title']
结果如下:
欢迎小伙伴们进群一起学习,一起加油!
END