pytest+yaml实现接口自动化


点击上方蓝字关注我!
python

最近在学pytest的使用,不一样于httprunner自动化测试框架,建立项目的时候就能把全部的项目文件目录整理出来,须要手动建立文件分类,无论怎么样,先学会用,在去了解它的底层原理。
这篇文章我把pytest+yaml+参数化一块儿讲解了。

一个简单的接口案例
sql


# 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
shell


看过我httprunner的应该都知道,httprunner主要就是经过yaml文件来进行接口调用的,原来pytest也能调用yaml文件,这里咱们把yaml文件做为咱们的接口数据准备文件,以下代码所示:
yaml方法的使用:

       ◆   yaml.load() : 读取yaml文件;json

       ◆   yaml.load_all() :  生成迭代器,若存在多块yaml文档的时候,使用解析所有文档;api

       ◆  yaml.dump(params1,params2) : yaml.dump将python对象生成yaml文档 params1 json格式的文档 ,params2 打卡一个文本或二进制文件,将生成的yaml文件写到文件中;微信

       ◆  yaml.dump_all() 将多个段输出到一个文件;app

第一步:编写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, paramscases, 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

本文分享自微信公众号 - 软件测试小助手(gh_2282fef3410c)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索