【Pytest】fixture

用法

类似setup和teardown的用法,可以起任意名称,并且使用更加灵活。

yield之前的操作相当于setup,yield之前的操作相当于teardown。

@pytest.fixture
def fixture_name():
    setup操作 
    yield 返回值
    teardown操作

作用域

使用scope控制fixture的作用域,默认为function级别。

function  函数级或者方法级
class  类级
module  模块级
package 包级
session 会话级

@pytest.fixture(scope="class")
def a():
    print("start")
    yield
    print("end")

class TestA:
    def test_a(self, a):
        assert True

三种调用方法

1.函数或方法中直接传入fixture函数名。

@pytest.fixture()
def a():
    print("start")
    yield
    print("end")

class TestA:
    def test_a(self, a):
        assert True

2.使用装饰器@pytest.mark.usefixtures()

@pytest.fixture()
def a():
    print("start")
    yield
    print("end")

@pytest.mark.usefixtures("a")
class TestA:
    def test_a(self):
        assert True

3.使用多个fixture方法

如果方法或者函数想要同时调用多个fixture,可使用@pytest.mark.usefixture()进行叠加。注意叠加顺序,先执行的放底层,后执行的放上层。

@pytest.fixture()
def login():
    print("完成登录操作")
    token = "123456789"
    username = "zhangsan"
    yield token, username  #yield用法相当于return
    print("完成登出操作")

@pytest.fixture()
def a():
    print("start")
    yield
    print("end")

@pytest.mark.usefixtures("login")
@pytest.mark.usefixtures("a") #优先执行
class TestA:
    def test_a(self):
        assert True

4.直接传入函数中和使用装饰器@pytest.mark.usefixtures()的区别。

当yield后有返回值时,使用@pytest.mark.usefixtures()无法得到返回值。必须直接传入函数。

@pytest.fixture(scope="function")
def login():
    print("完成登录操作")
    token = "123456789"
    username = "zhangsan"
    yield token, username  #yield用法相当于return
    print("完成登出操作")

def test_a(login):
    token, username = login
    print(token, username)

5.也可以使用autouse自动使用。默认值为False,改为True时所有测试函数和方法会自动使用此fixture函数而无需调用。

@pytest.fixture(scope="class", autouse=True)
def a():
    print("start")
    yield
    print("end")

class TestA:
    def test_a(self):
        assert True

conftest的使用

在conftest.py配置里写方法实现数据共享,不需要import导入,可跨文件共享。 

将定义的fixture方法放入conftest.py中,放置在公共目录中,测试代码可以直接调用conftest.p中的fixture方法,而不需要放在同一个测试文件中。多人协作中可是实现共用方法。

猜你喜欢

转载自blog.csdn.net/Yocczy/article/details/129289810