一、使用背景
当我们在设计用例的时候,经常会出现需要不同参数的情况,例如一个登录的用例,我们需要测试它登录名正常、为空、长度过长、过短、特殊字符等情况,因此就需要有不同情况下的参数,而当这些参数过多时,我们如果要一步一步的输入,便会显得有点繁琐,因此就需要有参数化的概念。这里用到pytest里的parametrize+yaml来实现参数化。
二、parametrize
首先我们需要知道parametrize的用法。下面是官方文档中的说明
这里我总结了一下:
@pytest.mark.parametrize("参数名",列表数据)
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。
接下来直接用代码说明:
@pytest.mark.parametrize("a, b, c", [(1, 2, 3), (4, 5, 9), (1, 3, 6)]) def test_add01(a, b, c): res = a + b assert res == c
这里是比较a+b是否等于c,显然只有2个满足该条件,故断言只有2个通过
运行结果:
三、yaml
能用来做参数化的形式其实有很多种,可以用xlrd读取excel表做参数化也可以。这里我选择用yaml来做参数化。因为yaml是一个可读性高,用来表达数据序列化的格式,它不是一门语言,跟json有点类似,是一种储存数据的载体,且支持多种语言,也比较容易理解。需要注意的是yaml比较注重格式,下面是yaml格式的一些基本语法:
示例:
- - 1 - 2 - 3 - - 3 - 4 - 7
- case1: - search_key: "python" - case2: - search_key: "ddt" - case3: - search_key: "selenium"
四、将yaml数据转换成parametrize可读的列表形式
从上面我们知道了parametrize需要传一个数据参数 ,所以现在的关键点是怎么把yaml格式的数据转换成parametrize可接受的数据格式。
import yaml def get_yaml(yaml_file): with open(yaml_file, "r", encoding="utf-8") as fp: f = fp.read() # 读出来是字符串 print(type(f)) d = yaml.load(f) # 转列表 print("读取到yaml文件数据") print(d) print(type(d)) return d
封装一个方法,该方法用来将yaml中的数据转换成列表。上面的两个yaml示例转换成列表后如下:
知道了yaml格式和如何转换yaml数据之后,接下来要实现用例的参数化就好办多了。
test_parametrize.py
import pytest from testyaml import get_yaml file = get_yaml("D:\\python project\\test\\test.yaml") @pytest.mark.parametrize("a, b, c", file) def test_add02(a, b, c): res = a + b assert res == c
test_yaml
- - 1 - 2 - 3 - - 3 - 4 - 7
运行测试用例后,可以看到有两组用例测试通过
如果后续想继续加数据,可直接将数据写再yaml文件里即可。即实现了参数化功能,做到数据与代码分离。