在自动化测试中很重要的一个环节就是处理测试数据,在测试框架中,测试数据与功能函数分离,单独存储,运行自动化测试时,框架会读取数据源模块中的数据,把数据作为参数传递到功能函数中,由于测试用例一般覆盖多条不同输入,根据不同的前置条件,选取多条数据执行多次功能函数,以减少重复代码;不同输入条件之间的测试结果互相之间不受影响,来实现数据驱动。
数据驱动的数据源形式可以是函数外的数据集合:如CSV 文件、Excel 、json、txt 文件,以及数据库等多种形式。
下面先结合简单案例分享小编学习到的pytest一个应用比较广泛的数据驱动框架: parameterize,一看秒懂,一看秒懂,一看秒懂!!!
pytest.mark.parametrize 是 pytest 的内置装饰器,它允许在 function 或者 class 上定义多组参数和 fixture来实现数据驱动。
@pytest.mark.parametrize() 装饰器接收两个参数:第一个参数以字符串的形式存在,表示被被测试函数接受的参数,假如被测试函数有多个参数,则以逗号分开。第二个参数用于保存测试数据。假如只有一组数据,则以列表的形式存在如[0,1],如果有多组数据,以列表嵌套元组的形式存在(如[(0,1), (1,2)])。
举例。
pytest.mark.parametrize单参数
运行结果
以上是单参数的一个例子,在这个例子中,test_equal函数接收一个参数 num,这个参数有三条数据,分别是1,2,3 。
pytest.mark.parametrize多参数
通常在工作中进行测试的参数不止一个,多参数还是比较常见的,因为不仅仅包括用于测试的数据, 还包括用于验证的数据。
示例1
运行结果
以上是对功能函数sum(num)自然数列求和(功能函数一个入参)的简单验证,包含 两条测试用例的测试case和预期结果
示例2
运行结果
以上是对功能函数sum_of_two(num1,num2)两数之和(功能函数两个入参)的简单验证,包含三条测试用例和预期结果
总结pytest 进行数据驱动的基本思路
pytest可以通过 pytest.mark.parametrize 来实现数据驱动,而 pytest.mark.parametrize 接受的数据格式要求为:
a.如果只有一组数据,以列表的形式存在;
b.如果有多组数据,以列表嵌套元组的形式存在(如[0,1] 或者 [(0,1), (1,2)])。
根据以上规则,可以联想到只需要创建一个方法,在该方法里解析所提供的数据格式CSV 文件、Excel 、json、txt 文件等,解析后返回 pytest.mark.parametrize 支持的格式就行,
具体解析方法根据实际数据源的格式进行编写即可。