ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-03-03 02:00:41  阅读:243  来源: 互联网

标签:入门 grant secret token access httprunner3 appid 驱动 type


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

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

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

.env文件的应用

# .env文件
# onlineOps=192.168.0.1
# onlineOps=192.168.0.2
onlineOps=https://api.weixin.qq.com

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

2、批量执行

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

cd 文件夹
hrun -s xxx.yml

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

# 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文件

​# coding: utf-8
import os
​
if __name__ == '__main__':
    os.system("hrun testsuites/tags_suits.yml --html=reports/report.html")

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

在testsuites下面的文件里通过

parameters:
    grant_type-appid-secret:
        - ["数据","数据","数据"]
        - ["数据","数据","数据"]

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

tags_suits.yml文件

​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文件

config:
    name: get_access_token
teststeps:
-   name: 获取access_token
    api: api/get_access_token.yml
get_access_token.yml文件

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

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文件夹下的对应文件里。

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数据,变量之间加个 -

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

这里还是有几个坑:

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

{'errcode': 40002, 'errmsg': 'invalid grant_type rid: 621f8c59-2e45c94d-06149b34'}

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

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,第一组数据最后改成这样:

- ["","wx4d省略a501","d096e省略6246","errcode"]

再去执行就成功了。

方式二:使用CSV文件

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

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

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文件内容

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

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

get_access_token.yml文件内容不变

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文件新建一个方法:

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文件变量调用${方法名()}这种就是热加载方式。
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

执行以后也是成功的。

公众号:自动化测试实战

标签:入门,grant,secret,token,access,httprunner3,appid,驱动,type
来源: https://www.cnblogs.com/captainmeng/p/15957955.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有