Pytest - Fixture(5) - 作用域(scope)

发布时间 2023-05-27 10:29:14作者: 粥雨

Pytest - Fixture作用域(scope)

  • 之前讲过,fixture里面有个 scop 参数,这个参数就是填写fixture作用域的;

    • function:每一个函数或方法都会调用;

    • class:每一个类调用一次,一个类中可以有多个方法;

    • module:每一个.py 文件调用一次,该文件内又有多个 function class

    • session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module


function

  • fixture默认作用域function,即 scope="function",scope可以不写。

    • 每一个函数或方法执行前都会调用,每个测试用例执行前都会执行一次function级别的fixture;

test_py.py

import pytest

"""用例级别fixture,作用域单个用例"""
@pytest.fixture(autouse=True)
def login_func():
    print("\n--- function级别的作用域前置操作 ---")
    yield
    print("=== function级别的作用域后置操作 ===")

# 调用login的fixture函数
def test_s1(login_func):
    print("\n用例test_s1:调用login_func的fixture函数")

# 不调用login函数,也会运行fixture
def test_s2():
    print("\n用例test_s2:不调用login_func函数,也会运行fixture")

if __name__ == '__main__':
    pytest.main(['-q', 'test_py.py'])

class

  • class级别的fixture,在整个测试类中的所有测试用例——都会调用fixture函数。

    • 在类中的测试用例,任意一个用例引用fixture即可:

    test_py.py

    import pytest
    
    """类级别fixture,作用域整个类"""
    @pytest.fixture(scope="class")
    def login_cls():
        print("\n--- class级别的作用域前置操作 ---")
        yield
        print("=== class级别的作用域后置操作 ===")
    
    
    class Test_cls():
    
        # class级别的fixture任意一个用例引用即可
        def test_s1(self, login_cls):
            print("\n用例test_s1:在类中的测试用例")
    
        def test_s2(self):
            print("\n用例test_s2:在类中的测试用例")
    
    if __name__ == '__main__':
        pytest.main(['-q', 'test_py.py'])
        
    

    • 在类外的测试用例调用fixture,相当于function级别的fixture:

    test_py.py

    import pytest
    
    """类级别fixture,作用域整个类"""
    @pytest.fixture(scope="class", autouse=True)
    def login_cls():
        print("\n--- class级别的作用域前置操作 ---")
        yield
        print("=== class级别的作用域后置操作 ===")
    
    """类外调用class级别的作用域,相当于function级别的作用域"""
    def test_s1(login_cls):
        print("\n用例test_s1:在类外的测试用例,调用login_cls的fixture函数")
    
    def test_s2():
        print("\n用例test_s2:在类外的测试用例,不调用login_cls函数,也会运行fixture")
    
    if __name__ == '__main__':
        pytest.main(['-q', 'test_py.py'])
        
    

module

  • 在Python中 modulexx.py文件;当fixture定义为module时,则此fixture将在当前py文件中起作用

    • 当fixture定义为module作用域时,只要当前文件中有一个测试用例使用了fixture,不管这个用例是在类外,还是在类中,都会在当前文件(模块)的所有测试用例执行之前去执行fixture定义的行为;

    • 以及当前文件的所有用例结束之后同样去执行fixture定义的对应操作。

test_py.py

import pytest

"""模块级别fixture,作用域整个py文件"""
@pytest.fixture(scope="module")
def login_module():
    print("\n--- module级别的作用域前置操作 ---")
    yield
    print("=== module级别的作用域后置操作 ===")


# 测试类外和测试类内的函数方法都调用了相同module级别的fixture,但整个py文件只会生效一次fixture。
def test_s2(login_module):
    print("\n用例test_s2:在类外的测试用例")


class Test_cls():
    # module级别的fixture任意一个用例引用即可
    def test_s1(self, login_module):
        print("\n用例test_s1:在类中的测试用例")

    def test_s3(self):
        print("\n用例test_s3:在类中的测试用例")

if __name__ == '__main__':
    pytest.main(['-q', 'test_py.py'])


session

  • session级别的fixture,是指在当前目录下的所有用例之前和之后执行fixture对应的操作;

    • fixture为session级别是可以跨.py模块调用的,如果多个用例只需调用一次fixture,那就可以设置为scope="session",并且写到conftest.py文件里。

conftest.py

import pytest

"""会话级别fixture,作用域当前目录"""
@pytest.fixture(scope="session")
def login_session():
    """作用于整个py文件"""
    print("\n--- session级别的作用域前置操作 ---")
    yield
    print("=== session级别的作用域后置操作 ===")

test_py.py

def test_s2(login_session):
    print("\n用例test_s2:在类外的测试用例")

class Test_cls():
    # session级别的fixture任意一个用例引用即可
    def test_s1(self, login_session):
        print("\n用例test_s1:在类中的测试用例")

    def test_s3(self):
        print("\n用例test_s3:在类中的测试用例")

if __name__ == '__main__':
    pytest.main(['-q', 'test_py.py'])