httprunner 2.x学习6-参数化与数据驱动

前言

从 2.0.0 版本开始,HttpRunner 不再支持在测试用例文件中进行参数化配置;
参数化的功能需要在 testsuite 中实现。变更的目的是让测试用例(testcase)的概念更纯粹

环境:httprunner==2.5.7

参数配置

参数化机制需要在测试用例集(testsuite)中实现。如需实现数据驱动机制,需要创建一个 testsuite,在 testsuite 中引用测试用例,并定义参数化配置。

测试用例集(testsuite)的格式如下所示:

config:
    name: testsuite description

testcases:
    testcase1_name:
        testcase: /path/to/testcase1

    testcase2_name:
        testcase: /path/to/testcase2

如需对某测试用例(testcase)实现参数化数据驱动,需要使用 parameters 关键字,定义参数名称并指定数据源取值方式。

参数名称的定义分为两种情况:

  • 独立参数单独进行定义;
  • 多个参数具有关联性的参数需要将其定义在一起,采用短横线(-)进行连接。

数据源指定支持三种方式:

  • 在 YAML/JSON 中直接指定参数列表:该种方式最为简单易用,适合参数列表比较小的情况
  • 通过内置的 parameterize(可简写为P)函数引用 CSV 文件:该种方式需要准备 CSV 数据文件,适合数据量比较大的情况
  • 调用 debugtalk.py 中自定义的函数生成参数列表:该种方式最为灵活,可通过自定义 Python 函数实现任意场景的数据驱动机制,当需要动态生成参数列表时也需要选择该种方式

三种方式可根据实际项目需求进行灵活选择,同时支持多种方式的组合使用。
假如测试用例中定义了多个参数,那么测试用例在运行时会对参数进行笛卡尔积组合,覆盖所有参数组合情况。

单个参数时参数化

先准备测试数据,准备四组登录用的账号和密码,账号为test1,test2,test3,test4,密码统一设置为123456。

参数user账号数据,设置对应的值 ["test1", "test2", "test3", "test4"],定义单个参数用variables,定义参数化用parameters

        variables:
            user: test
            password: 123456
        parameters:
            user: ["test1", "test2", "test3", "test4"]

如果参数化里面的数据只有一个,比如psw对应的值只有一个,parameters 也可以设置 password的值

        variables:
            user: test
            password: 123456
        parameters:
            user: ["test1", "test2", "test3", "test4"]

完整的 testsuites/test_parameters.yml 脚本如下

# testsuites/test_parameters.yml
# 上海-悠悠,httprunner QQ交流群:1121184576
config:
    name: "test userinfo"

testcases:
   login-参数化:
        testcase: case/test_login.yml
        variables:
            user: test
            password: 123456
        parameters:
            user: ["test1", "test2", "test3", "test4"]  # 参数化
            password: [123456]

运行用例,会自动生成四个测试用例

(venv_hrun) D:softvenu_hrun>hrun testsuites/test_parameters.yml
INFO     HttpRunner version: 2.5.7
INFO     Start to run testcase: login-参数化
login-setup
INFO     POST http://127.0.0.1:8000/api/v1/login/
INFO     status_code: 200, response_time(ms): 170.15 ms, response_length: 109 bytes

.

----------------------------------------------------------------------
Ran 1 test in 0.175s

OK
INFO     Start to run testcase: login-参数化
login-setup
INFO     POST http://127.0.0.1:8000/api/v1/login/
INFO     status_code: 200, response_time(ms): 138.63 ms, response_length: 109 bytes

.

----------------------------------------------------------------------
Ran 1 test in 0.140s

OK
INFO     Start to run testcase: login-参数化
login-setup
INFO     POST http://127.0.0.1:8000/api/v1/login/
INFO     status_code: 200, response_time(ms): 147.59 ms, response_length: 109 bytes

.

----------------------------------------------------------------------
Ran 1 test in 0.154s

OK
INFO     Start to run testcase: login-参数化
login-setup
INFO     POST http://127.0.0.1:8000/api/v1/login/
INFO     status_code: 200, response_time(ms): 136.7 ms, response_length: 109 bytes

.

----------------------------------------------------------------------
Ran 1 test in 0.140s

OK
INFO     Start to render Html report ...
INFO     Generated Html report: D:softvenu_hrun
eports20200612T164223.834696.html

关联参数

上面的案例多个账号,密码都是一样的,如果密码不一样呢?上面的就行不通了,所以针对于一个账号对应一个密码,这种一一对应的关系,可以用关联性的参数化

# 上海-悠悠,httprunner QQ交流群:1121184576
config:
    name: "test userinfo"

testcases:
   login-参数化:
        testcase: case/test_login.yml
        parameters:
            user-password:
            -  ["test1", "123456"]
            -  ["test2", "123456"]
            -  ["test3", "123456"]
            -  ["test4", "123456"]

笛卡尔积组合

比如测试账号有四种["test1", "test2", "test3", "test4"],密码也有四种 ["123456", "123456", "123456", "123456"]
用笛卡尔积组合的话,就是4*4=16种组合

# 上海-悠悠,httprunner QQ交流群:1121184576
config:
    name: "test userinfo"

testcases:
   login-参数化:
        testcase: case/test_login.yml
        parameters:
            user: ["test1", "test2", "test3", "test4"]
            password: ["123456", "123456", "123456", "123456"]

这样运行会生成16组用例,很显然,这种不适用与登录-密码一对一的情况。可以用在其它的测试场景

原文地址:https://www.cnblogs.com/yoyoketang/p/13110266.html