数据驱动概览
为什么要用数据驱动
举个简单例子,当我们在测试一个输入框的功能时,可能需要输入不同的参数,此时,我们不需要设计多个用例,而只需要将输入值参数化,将不同的参数作为一个列表通过数据驱动的方式进行加载即可。
httprunner 的数据驱动
通过上篇文章,我们已经知道 httprunner
的数据驱动需要在 testsuite
中使用关键字 parameters
来定义。
定义数据源的三种方式
- 在
testsuite
的yaml/json
文件中直接定义。 - 通过内置的
parameterize
函数引用外部csv
文件,适用大数据场景。 - 调用
debugtalk.py
定义的函数(动态)生成参数列表,此方式最灵活。
定义参数的两种方式
- 独立参数定义
config: name: testcase description testcases: create user: testcase: demo-quickstart-6.yml parameters: user_id: [1001, 1002, 1003, 1004] 复制代码
进行该配置后,测试用例在运行时就会对 user_id
实现数据驱动,即分别使用 [1001, 1002, 1003, 1004]
四个值运行测试用例。测试用例总共会运行 4
次,并且每次运行时都采用不同的 user_id
。
- 多个具有关联性的参数定义
config: name: "demo" testcases: testcase1_name: testcase: /path/to/testcase1 parameters: username-password: - ["user1", "111111"] - ["user2", "222222"] - ["user3", "333333"] 复制代码
进行该配置后,测试用例在运行时就会对 username
和 password
实现数据驱动,即分别使用 {"username": "user1", "password": "111111"}、{"username": "user2", "password": "222222"}、{"username": "user3", "password": "333333"}
运行 3
次测试,并且保证参数值总是成对使用。
通过以上内容,我们可以知道,在 HttpRunner
的数据驱动中,我们有 6
种方式进行实现。即:
三种数据源*两种参数定义方式
编号 | 驱动模式 |
1 | 独立参数 & 直接指定参数列表 |
2 | 关联参数 & 直接指定参数列表 |
3 | 独立参数 & 引用 CSV 文件 |
4 | 关联参数 & 引用 CSV 文件 |
5 | 独立参数 & 引用自定义函数 |
6 | 关联参数 & 引用自定义函数 |
数据驱动实例
在上面我们已经介绍了 6
中驱动模式,而且也学习了直接在 yml
文件中定义参数的两种场景,那怎么使用 CSV
文件实行数据驱动呢?
独立参数 & 引用 CSV 文件
当我们需要对 user_id(1000 个)
进行数据驱动时,首先,需要准备 user_id.csv
文件,文件内容如下:
user_id 1001 1002 ... 1999 2000 复制代码
然后,我们在 testsuite
中就可以通过内置的 parameterize
(可简写为 P
)函数引用 CSV
文件:
假设
user_id.csv
在项目根目录的data
目录下
config: name: "demo" testcases: testcase1_name: testcase: /path/to/testcase1 parameters: user_id: ${P(data/user_id.csv)} 复制代码
即 P 函数的参数(CSV
文件路径)是相对于项目根目录的相对路径。当然,这里也可以使用 CSV
文件在系统中的绝对路径,不过这样的话在项目路径变动时就会出现问题,因此推荐使用相对路径的形式。
关联参数 & 引用 CSV 文件
当我们需要对 username-password(1000 个)
进行数据驱动时,首先,需要准备 account.csv
文件,文件内容如下:
username,password test1,111111 test2,222222 test3,333333 ... test1000,999999 复制代码
然后,我们在 testsuite
中就可以通过内置的 parameterize
(可简写为 P
)函数引用 CSV
文件:
假设
account.csv
在项目根目录的data
目录下
config: name: "demo" testcases: testcase1_name: testcase: /path/to/testcase1 parameters: username-password: ${P(data/account.csv)} 复制代码
需要说明的是,在 parameters
中指定的参数名称必须与 CSV
文件中第一行的参数名称一致,顺序可以不一致,参数个数也可以不一致。
例如,在 account.csv
文件中可以包含多个参数,username、password、phone、age
:
username,password,phone,age test1,111111,18600000001,21 test2,222222,18600000002,22 test3,333333,18600000003,23 ... test1000,999999,18600000003,99 复制代码
独立参数 & 引用自定义函数
当我们想要动态生成 100
个 user_id
的时候,我们可以使用 debugtalk.py
的自定义函数动态生成。
在 debugtalk.py
中定义函数:
def get_user_id(): ret = [] for nu in range(101): ret.append({"user_id": nu}) return ret 复制代码
然后,在 YAML/JSON
的 parameters
中就可以通过调用自定义函数的形式来指定数据源:
config: name: "demo" testcases: testcase1_name: testcase: /path/to/testcase1 parameters: user_id: ${get_user_id()} 复制代码
另外,通过函数的传参机制,还可以实现更灵活的参数生成功能,在调用函数时指定需要生成的参数个数。
关联参数 & 引用自定义函数
当我们想要动态生成 100
个账号的时候,我们可以使用 debugtalk.py
的自定义函数动态生成。
在 debugtalk.py
中定义函数:
def get_account(num): ret = [] for nu in range(num): name = 'user-{}'.format(nu) pwd = 'pwd-{}'.format(nu) ret.append({"username": name,'password':pwd}) return ret 复制代码
那么在 YAML/JSON
的 parameters
中就可以调用自定义函数生成指定数量的参数列表:
config: name: "demo" testcases: testcase1_name: testcase: /path/to/testcase1 parameters: username-password: ${get_account(10)} 复制代码
数据驱动在
testsuite
中的testcases
下使用关键字parameters
定义,这些数据在testcase
中的teststeps
中使用关键字variables
直接使用即可。
实例
测试项目源码
demo_api
文件:
name: demo api variables: var1: value1 var2: value2 request: url: /phyger method: GET headers: User-Agent: $user_agent Content-Type: "application/json" json: key: $var2 username: $username pwd: $password 复制代码
demo_api2
类似。
用例文件:
config: name: "demo testcase" variables: device_sn: "ABC" base_url: "https://getman.cn/mock" output: [ "username", "password" ] teststeps: - name: demo step 1 api: api/demo_api.yml variables: user_agent: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36' device_sn: $device_sn username: $username password: $password validate: - eq: ["status_code", 200] setup_hooks: - ${hook_print(setup)} teardown_hooks: - ${hook_print(teardown)} - name: demo step 2 api: api/demo_api2.yml variables: token: ${get_token()} validate: - eq: [reason, OK] 复制代码
测试套文件:
config: name: "demo testsuite" variables: device_sn: "XYZ" base_url: "http://127.0.0.1:5000" testcases: - name: call demo_testcase with data 1 testcase: testcases/demo_testcase.yml variables: device_sn: $device_sn parameters: - username-password: ${get_account(10)} 复制代码
执行测试
测试报告
我们可以看到共执行用例
10
条,测试步骤20
,全部通过。测试用例遍历了测试套中获取的数据源10
条,又因为测试用例中有两个步骤,所以总共有1*10*2=20
个步骤。感谢您的阅读,别忘了关注,点赞,评论,转发四连哟!