用法
类似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方法,而不需要放在同一个测试文件中。多人协作中可是实现共用方法。