pytest-数据驱动

什么是数据驱动?

在自动化测试中很重要的一个环节就是处理测试数据,在自动化测试中测试数据与功能函数相分离,单独存储,运行自动化测试用例时,框架会读取数据源中的数据,把数据作为参数传递到功能函数中。由于一般测试用例覆盖多条不同输入,根据不同的前置条件选取多条数据执行多次同一功能函数,这样减少重复代码,不同输入条件之间的测试结果互相不受影响,这就是数据驱动。

数据驱动的方法?

pytest一个应用比较广泛的数据驱动框架就是 parameterized:
pytest.mark.parametrize 是 pytest 的内置装饰器
数据驱动的数据源可以是函数外的数据集合、CSV 文件、Excel 表格、TXT 文件,以及数据库等多种形式。
@pytest.mark.parametrize() 装饰器接收两个参数:
第一个参数以字符串的形式存在,表示用例函数的参数,假如测试函数函数有多个参数,则以逗号分开。
第二个参数用于保存测试数据。
假如只有一组数据,则以列表的形式存在如[0,1],如果有多组数据,以列表嵌套元组的形式存在(如[(0,1), (1,2)])。

1.pytest.mark.parametrize 单参数

import pytest


@pytest.mark.parametrize('num',[1,2,3])
def test_equal(num):
    """验证输入是1,2,3时,断言是否正确"""
    assert num == 1

这里有个需要注意的地方,装饰器 pytest.mark.parametrize 的第一个参数里的参数名称必须与测试函数中的参数称保持一致
运行结果如下:

image.png

2.pytest.mark.parametrize 多参数
通常在工作中进行测试的参数不止一个,不仅仅包括用于被测函数的数据输入, 还包括用于验证的数据,所以多参数还是比较常见的。如下面
一个函数功能时输入一个数字,计算出1到该自然数的和,要测试此函数,输入一个参数,一个期望返回参数来进行断言,如下面用例输入1期望1,输入5期望15,输入100期望5050

import pytest

def sum_of_num(num):
    sum = 0
    for i in range(1,num+1):
        sum = sum +i
    return sum


class TestSumOfNum(object):


    @pytest.mark.parametrize('test_num,expect_num',[(1,1),(5,15),(100,5050)])
    def test_equal(self,test_num,expect_num):
        actural_num = sum_of_num(test_num)
        assert actural_num == expect_num

以此类推,如果需要三个参数,如两个函数的入参,一个断言预期结果,则格式是('param1,param2,param3',[(test1,test2,test3),(test1',test2',test3')])等
所以@pytest.mark.parametrize()的两个参数中,第一个则是对应参数的字符串以逗号分隔,按顺序填对应的数据

pytest 进行数据驱动的基本思路

pytest 可以通过 pytest.mark.parametrize 来实现数据驱动,而 pytest.mark.parametrize 接受的数据格式要求为:
a.如果只有一组数据,以列表的形式存在;
b.如果有多组数据,以列表嵌套元组的形式存在(如 [0,1] 或者 [(0,1), (1,2)])。
根据这种规则,可以联想到只需要创建一个方法,在这个方法里解析我们提供的各种数据格式解析到对应的参数位置,然后解析后返回 pytest.mark.parametrize 支持的格式就好。

你可能感兴趣的:(pytest-数据驱动)