4. Pytest自定义前置后置:fixture简单应用

一、前言

前面讲到用例加 setup 和 teardown 可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现指定某一个执行前置,另一个不执行前置,则需要自定义测试用例的预置条件。

二、学习目标

1.conftest.py文件介绍

2.fixture的简单应用

3.fixture前置传参

三、知识点

1.conftest.py文件介绍

fixture实际应用需要结合conftest.py文件来使用,我们将前置函数写在conftest.py中,可以跨文件调用前置。conftest.py是fixture函数的一个集合,可以理解为公共的提取出来放在一个文件里,然后供其它模块调用。不同于普通被调用的模块,conftest.py使用时不需要导入,Pytest会自动查找

  • conftest.py特点:

    (一)文件名必须是conftest.py,不得改变。

    (二)不需要import导入 conftest.py,pytest用例会自动识别该文件。

    (三)放到项目的根目录下就可以全局目录调用,放在某个文件夹下则只能在文件夹内的测试用例调用。

  • conftest.py的使用场景

    (一)接口自动化公用的session或token

    (二)web自动化时driver实例化操作

2.【fixture的简单应用】

  • 语法:

    @pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None)
    
  • 参数说明:

    fixture里面有个scope参数可以控制fixture的作用范围,scope:有四个级别参数"function"(默认),"class","module","session

    params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它。
    autouse:如果True,则为所有测试激活fixture func可以看到它。如果为False则显示需要参考来激活fixture
    ids:每个字符串id的列表,每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成
    name:fixture的名称。这默认为装饰函数的名称

  • 代码示例:

    #conftest.py文件
    import pytest
    
    @pytest.fixture(scope="function")
    def init_function1():
        print("用例前置1")
        yield
        print("用例后置1")
    
    @pytest.fixture(scope="function")
    def init_function2():
        print("用例前置2")
        yield
        print("用例后置2")
    
    @pytest.fixture(scope="function")
    def init_function3():
        print("用例前置3")
        yield
        print("用例后置3")
    
    #测试用例文件test_XXX.py
    import pytest
    
    class TestCase():
    
        def test_case_01(self):
            num = 1 + 1
            print("打印计算结果:{}".format(num))
            assert num == 2
    
        @pytest.mark.usefixtures('init_function1')#调用前置
        def test_case_02(self):
            num = 1 + 2
            print("打印计算结果:{}".format(num))
            assert num == 3
    
        def test_case_03(self,init_function1): #也可以用传参方式调用
            num = 1 + 3
            print("打印计算结果:{}".format(num))
            assert num == 4
    
        @pytest.mark.usefixtures('init_function3')#调用前置
        @pytest.mark.usefixtures('init_function1','init_function2')#调用前置
        def test_case_03(self): #usefixtures可以传多个前置,也可以叠加(最近的先执行)
            num = 1 + 4
            print("打印计算结果:{}".format(num))
            assert num == 5
    

说明:conftest.py文件定义前置函数,在测试用例方法调用,调用方式有两种,一种是直接往用例方法中传如前置函数的函数名;一种是通过usefixtures调用,这种方式可以传多个前置,也可以叠加调用前置(遵循就近原则执行前置)。

3.【fixture前置传参】

当前置操作中产生的返回值需要被用例使用,需要用到前置传参。如在web自动化中可以将driver浏览器对象写入前置并传入测试用例中使用。我们在定义前置函数时可以用yield关键字返回参数,供测试用例方法使用。

conftest.py文件:

@pytest.fixture(scope="function")
def init_function():
    print("用例前置")
    a = '这是一个前置参数'
    yield a
    print("用例后置")

测试用例文件:

    def test_case_03(self,init_function): #传入前置函数的方法名
        num = 1 + 2
        print("打印前置传参结果:{}".format(init_function)) #方法名init_function就是yield返回的a参数
        assert num == 3
posted @ 2023-01-17 10:24  测开星辰  阅读(143)  评论(0编辑  收藏  举报