前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pytest+yaml实现接口自动化

pytest+yaml实现接口自动化

作者头像
小雯子打豆豆
发布2020-06-16 16:21:34
1.7K0
发布2020-06-16 16:21:34
举报

点击上方蓝字关注我!

最近在学pytest的使用,不同于httprunner自动化测试框架,创建项目的时候就能把所有的项目文件目录整理出来,需要手动创建文件分类,不管怎么样,先学会用,在去了解它的底层原理。

这篇文章我把pytest+yaml+参数化一起讲解了。

一个简单的接口案例

代码语言:javascript
复制
# 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文件,准备测试接口数据

代码语言:javascript
复制
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)来打印出压缩结果

好处:节省内存

代码语言:javascript
复制
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中有多条案例,会执行多次。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档