美文网首页python
Pytest 参数化

Pytest 参数化

作者: 猫与测试 | 来源:发表于2019-12-24 22:32 被阅读0次

    参数化,就是把测试过程中的数据提取出来,通过参数传递不同的数据来驱动用例运行。其实也就是数据驱动的概念。

    在 Unittest 中,我们讲过使用 ddt 库配合 unittest 实现数据驱动。在 Pytest 中并不需要额外的库,通过 pytest.mark.parametrize()即可实现参数化。

    单个参数

    在使用pytest.mark.parametrize()传递参数化数据时,测试用例本身必须有参数。

    import pytest
    
    # 待测函数
    def add(a, b):
        return a + b
    
    # 单个参数的情况
    @pytest.mark.parametrize('a', (1,2,3,4,5))
    def test_add(a):  # => 作为用例参数,接收装饰器传入的数据
        print('\na的值:', a)
        assert add(a, 1) == a+1
    

    注意用法,@pytest.mark.parametrize() 装饰器接收两个参数,一个参数是以字符串的形式标识用例函数的参数,第二个参数以列表或元组的形式传递测试数据。

    运行命令:

    pytest test_params.py -v -s
    

    运行后的效果:


    多个参数

    多个参数,@pytest.mark.parametrize()第一个参数依然是字符串, 对应用例的多个参数用逗号分隔。

    # 多个参数的情况
    @pytest.mark.parametrize('a, b, c', [(1,2,3), (4,5,9), ('1', '2', '12')])
    def test_add(a, b, c):
        print(f'\na,b,c的值:{a},{b},{c}')
        assert add(a, b) == c
    

    运行结果如下:


    对测试类参数化

    测试类的参数化,其实际上也是对类中的测试方法进行参数化。类中的测试方法的参数必须与@pytest.mark.parametrize()中的标识的参数个数一致。

    # 测试类参数化
    @pytest.mark.parametrize('a, b, c', [(1,2,3), (4,5,9)])
    class TestAdd():
        def test_add1(self, a, b, c):
            assert add(a, b) == c
    
        def test_add2(self, a, b, c):
            assert add(a, b) == c
    

    参数化会作用于每个测试方法,比如上面两个用例,参数化了两条数据,那么就会执行 4 次。



    运行结果如下:


    修改结果显示名称

    通过上面的运行结果,我们可以看到,为了区分参数化的运行结果,在结果中都会显示数据组合而成的名称。

    数据短小还好说,如果数据比较长而复杂的话,那么就会很难看。

    @pytest.mark.parametrize() 还提供了第三个 ids 参数来自定义显示结果。

    test_add1[4-5-9]这是结果中显示的名称,ids 的修改会作用于[]中的显示。

    我们下面的示例只是简单的为数据编了一个号:

    # ids 的作用
    data = [(1,2,3), (4,5,9), ('1', '2', '12')]
    ids = [f'data{d}' for d in range(len(data))] # => 生成与数据数量相同的名称列表
    @pytest.mark.parametrize('a, b, c', data, ids=ids)
    def test_add(a, b, c):
        print(f'\na,b,c的值:{a},{b},{c}')
        assert add(a, b) == c
    

    ids必须是与数据数量相同的名称(必须是字符串)列表。

    显示结果如下:


    相关文章

      网友评论

        本文标题:Pytest 参数化

        本文链接:https://www.haomeiwen.com/subject/vpynnctx.html