前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >httprunner3.x入门 -3 实现数据驱动

httprunner3.x入门 -3 实现数据驱动

作者头像
孟船长
发布2022-04-12 14:34:44
7000
发布2022-04-12 14:34:44
举报

后台几个留言问:既然httprunner3这么多坑,为什么要学这个啊?

学这个不一定你熟练应用,但是要学习httprunner的设计思想。httprunner是兼容了pytest/json/yaml的。也就是目前比较火的框架基本都能用上,即使不会使用,也要了解到底是怎么回事。我的httprunner版本是3.1.6。

------------正文------------

.env文件的应用

代码语言:javascript
复制
# .env文件
# onlineOps=192.168.0.1
# onlineOps=192.168.0.2
onlineOps=https://api.weixin.qq.com

我们将开发环境、测试环境、生产环境分别配置到.env文件中,然后再yaml文件通过${ENV(环境名)}进行引用。当需要修改环境的时候只需要去.env文件修改一下配置就可以了,不需要去动代码。

2、批量执行

之前我们执行的方式都是先转到对应的目录然后hrun执行单个yml文件

代码语言:javascript
复制
cd 文件夹
hrun -s xxx.yml

如果要批量执行可以新建一个all.py文件,然后通过命令执行

代码语言:javascript
复制
# coding: utf-8

import os

if __name__ == '__main__':
    os.system("hrun testsuites/tags_suits.yml")

3、数据驱动

httprunner实现数据驱动必须要安装3.x版本。2.x版本没有实现数据驱动。

使用parameterize关键字定义数据源应用于测试套件层,只能是套件层!有两种方式实现数据驱动:

方式一:直接在套件脚本里指定参数列表

当数据量比较小的时候,可以直接在脚本里指定参数列表,实现数据驱动。

在执行的时候看不到输出,很头疼,改一下all.py,增加一个生成报告:

all.py文件

代码语言:javascript
复制
# coding: utf-8
import os

if __name__ == '__main__':
    os.system("hrun testsuites/tags_suits.yml --html=reports/report.html")

这样就可以在报告里查看返回值了。

在testsuites下面的文件里通过

代码语言:javascript
复制
parameters:
    grant_type-appid-secret:
        - ["数据","数据","数据"]
        - ["数据","数据","数据"]

实现数据驱动;注意变量名要跟parameters变量名一致。

tags_suits.yml文件

代码语言:javascript
复制
config:
    name: 获取access_token
    parameters:
        grant_type-appid-secret:
            - ["client_credential","wx4d8f7a501","d096e2数据改了哈246"]
            - [ "","wx4d8f501","d096e22数据改了哈7246" ]
teststeps:
-   name: 获取access_token
    testcase: testcases/get_access_token_case_params.yml

get_access_token_case_params.yml文件

代码语言:javascript
复制
config:
    name: get_access_token
teststeps:
-   name: 获取access_token
    api: api/get_access_token.yml

get_access_token.yml文件

这里要把variables取值改成去变量模式

代码语言:javascript
复制
config:
    name: 获取access_token
    variables:
        grant_type: $grant_type
        appid: $appid
        secret: $secret
    verify: False
    base_url: ${ENV(onlineOps)}
teststeps:
-   name: /cgi-bin/token
    request:
        method: GET
        params:
            appid: $appid
            grant_type: $grant_type
            secret: $secret
        url: /cgi-bin/token
    extract:
        access_token: content.access_token

这里还有一个坑,就是你的pydantic版本要求是1.8.2的。一旦高于这个版本,数据就只能读取第一行了。这也是不管在用例文件还是CSV等做数据驱动时,用例数据只读取第一行数据的解决办法。

然后执行all.py文件,就可以在测试报告中看到结果了

点开下面Passed就能看到具体数据了

第二个

为了方便判断,我们加上断言

断言可以参考这里httprunner 3.x 入门 -1

这里断言比较适合用contains;断言既不能放到testsuites里也不能放在testcases里,放这两个任何一个都会报错,只能放在api文件夹下的对应文件里。

代码语言:javascript
复制
config:
    name: 获取access_token
    variables:
        grant_type: $grant_type
        appid: $appid
        secret: $secret
    verify: False
    base_url: ${ENV(onlineOps)}
teststeps:
-   name: /cgi-bin/token
    request:
        method: GET
        params:
            appid: $appid
            grant_type: $grant_type
            secret: $secret
        url: /cgi-bin/token
    extract:
        access_token: content.access_token
    validate:
    - contains:
          - body
          - $assert_txt

我们在最后添加了包含断言。然后修改一下tags_suits.yml数据,变量之间加个 -

代码语言:javascript
复制
config:
    name: 数据驱动
    parameters:
        grant_type-appid-secret-assert_txt:
            - ["","wx4d8appaca501","d096e2值9d917a517c6246",40002]
            - [ "client_credential","wx4d8ppaca501","d096e22047key246","access_token"]
teststeps:
-   name: 获取access_token
    testcase: testcases/get_access_token_case_params.yml
#-   name: 查询标签
#    testcase: testcases/select_tags_case.yml
#-   name: 删除标签
#    testcase: testcases/select_tags_case.yml

这里还是有几个坑:

首先看一下接口文档的返回

代码语言:javascript
复制
{'errcode': 40002, 'errmsg': 'invalid grant_type rid: 621f8c59-2e45c94d-06149b34'}(

可以看到40002是一个int类型,所以我在数据最后一个没有加双引号,这样做是没问题的。但是执行后仍然会报错

代码语言:javascript
复制
E   httprunner.exceptions.ValidationFailure: assert body contains 40002(int)  ==> fail
E   check_item: body
E   check_value: {'errcode': 40002, 'errmsg': 'invalid grant_type rid: 621f8c59-2e45c94d-06149b34'}(dict)
E   assert_method: contains
E   expect_value: 40002(int)

这是因为这个contains关键字也是有问题的,就像pydantic新版本有问题一样,这个关键字虽然判断是包含,但是它只能判断key值,不判断values值

所以只能判断那个key,第一组数据最后改成这样:

代码语言:javascript
复制
- ["","wx4d省略a501","d096e省略6246","errcode"]

再去执行就成功了。

方式二:使用CSV文件

这种方式也是用的比较多的

先在data文件夹新建一个get_token_data.csv文件,写用例数据

代码语言:javascript
复制
grant_type,appid,secret,assert_txt
"client_credential","wx4d8省略a501","d096e2省略46","access_token"
"","wx4d8省略501","d096e省略c6246","errcode"

注意:

1、csv文件第一行必须放参数名称,并且参数名称必须和测试用例里面的名称一致;

2、csv第二行开始放数据,并且每一组数据占一行

3、tags_suits.yml文件里的parameters下的变量名顺序没有要求。

然后将tags_suits.yml文件改成调用CSV文件内容

代码语言:javascript
复制
config:
    name: 获取access_token
    parameters:
        grant_type-appid-secret-assert_txt: ${P(data/get_token_data.csv)}
teststeps:
-   name: 获取access_token
    testcase: testcases/get_access_token_case_params.yml
#-   name: 查询标签
#    testcase: testcases/select_tags_case.yml
#-   name: 删除标签
#    testcase: testcases/select_tags_case.yml

注意,还是要保留变量,然后使用{P(csv文件路径)}进行调用。P是大写的,代表parameterize,写{parameterize(csv文件路径)}也可以。

get_access_token.yml文件内容不变

代码语言:javascript
复制
config:
    name: 获取access_token
    variables:
        grant_type: $grant_type
        appid: $appid
        secret: $secret
    verify: False
    base_url: ${ENV(onlineOps)}
teststeps:
-   name: /cgi-bin/token
    request:
        method: GET
        params:
            appid: $appid
            grant_type: $grant_type
            secret: $secret
        url: /cgi-bin/token
    extract:
        access_token: content.access_token
    validate:
    - contains:
          - body
          - $assert_txt

执行一下也是通过的

方式三:使用函数生成数据

适用于数据变化比较大的情况,跟热加载差不多

我们这里举个简单的例子

我们在debugtalk.py文件新建一个方法:

代码语言:javascript
复制
def get_access_token():
    return [
    {"grant_type": "client_credential",
    "appid": "wx4d8f7de320aca501",
     "secret": "d096e22047235cad799d917a517c6246",
     "assert_txt": "access_token"},
     {"grant_type": "",
     "appid": "wx4d8f7de320aca501",
     "secret": "d096e22047235cad799d917a517c6246",
     "assert_txt": "errcode"}
     ]

为了方便大家看我都换行了。其实就是返回一个dict列表。然后修改一下tags_suits.yml文件变量调用${方法名()}这种就是热加载方式。

代码语言:javascript
复制
config:
    name: 获取access_token
    parameters:
        grant_type-appid-secret-assert_txt: ${get_access_token()}
#        grant_type-appid-secret-assert_txt: ${parameterize(data/get_token_data.csv)}
teststeps:
-   name: 获取access_token
    testcase: testcases/get_access_token_case_params.yml

执行以后也是成功的。

使用函数生成数据的的方法,就是把生成数据的方法写在debugtalk.py文件里,然后在需要调用的地方通过${方法名()}进行调用。

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

本文分享自 自动化测试实战 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档