前言
从 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:\soft\venu_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:\soft\venu_hrun\reports\20200612T164223.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组用例,很显然,这种不适用与登录-密码一对一的情况。可以用在其它的测试场景