如果说 pytest 中哪些标记使用得最多,那无疑是 parametrize
了,
它为用例实现了参数化测试的能力,进而实现了数据驱动测试的能力。
1. 使用标记
parametrize 的使用需要提高两个内容:
-
参数名
-
参数值
pytest 在执行用例时,会分别将参数值,传递给参数名,以此自动生成多个用例。
所以参数化测试的显著结果是:用例执行数量等于参数值的数量。
test_name: 参数化测试
mark:
- parametrize:
- n # 第一个 是参数名
- [1,2,3] # 第二个是参数值
steps:
- request:
method: get
url: http://baidu.com
执行结果如下:
图 1.parametrize 标记让用例执行多次
由结果可见,使用了 parametrize 标记的用例一共执行了 3 次,与 parametrize 标记中的参数值的数量是相同的
2. 使用参数
parametrize 中的参数并不仅仅是用来控制数量的,
正如前文所述,pytest 在执行用例时,会分别将参数值传递给参数名。
那么在用例中如何使用参数的?可以使用 ${参数名}
的格式来使用,比如这样
test_name: 参数化测试
mark:
- parametrize:
- n
- [1,2,3]
steps:
- request:
method: get
url: https://baidu.com?o=${n} # 使用n参数
执行结果如下:
图 2. 在用例中使用 parametrize 标记的参数值
由结果可见,每个用例都得到的 n 是不同的参数值。
3. 加载数据文件
如果参数值较多,yaml 用例文件可能会臃肿,不便于维护。
此时,可将参数值保存在单独数据文件中,并在 yaml 用例中加载该数据文件。
test_name: 从文件中加载数据
mark:
- parametrize:
- n
- !include ddt_n.yaml
steps:
- request:
method: get
url: https://baidu.com?o=${n} # 使用n参数
执行结果如下
图 3. 从数据文件中加载参数值
关于 !include
有几点需要注意:
-
会从当前所在的目录中加载文件文件
-
也支持相对路径和绝对路径
-
相对路径是相对于当前 yaml 用例
4. 传递多个参数
在使用参数化时,可以同时传递多个参数,
为了实现这一目标,需要将多个参数放在共一个列表中
test_name: 参数化测试
mark:
- parametrize:
- x,y,z # 每次传递3个参数
- [
[1,2,3],
["a","b","c"],
["!","?","#"],
]
steps:
- request:
method: get
url: https://baidu.com?o=${x}-${y}-${z}
执行结果如下
图 4. 一个标记传递多个参数
5. 使用多个标记
除了同时传递多个参数之外,也可以使用多个标记
test_name: 参数化测试
mark:
- parametrize:
- x
- [1,2,3]
- parametrize:
- y
- ["a","b","c"]
- parametrize:
- z
- ["!","?","#"]
steps:
- request:
method: get
url: https://baidu.com?o=${x}-${y}-${z}
执行结果如下
图 5. 多标记会生成更多的用例数量
由结果可知,当使用多个标记时,用例数量不再是参数值的数量,而是所有标记参数的笛卡儿积