fixture是处理前后置处理的,也叫测试固件,只需要使用@pytest.fixture() 即可定义
@pytest.fixture() # fixture装饰器
def first(): # 定义一个函数
print("setup...") # 函数内容
定义好fixture函数后,如何应用呢?通常我们只需要在测试函数中,传入Fixture的这个函数名即可
import pytest # 导入pytest
@pytest.fixture()
def first():
print("setup...")
def test_pytest(first): # 定义测试函数,在此处引用fixture函数名即可
print("first test")
if __name__ == '__main__': # 定义主函数
pytest.main() # 调用pytest
说明:在执行test_pytest函数之前,会先执行first函数,因为first是前置函数,会在测试函数之前执行。如果需要每个测试函数都自动执行,则可以设置autouse的参数为True,即autouse=True
@pytest.fixture(autouse=True) # 传入autouse参数
def first():
print("setup...")
@pytest.fixture()中scope参数是控制Fixture的作用域的,可根据实际需要,调整运行方式,scope支持以下四种作用域,从大到小依次是:
session (会话)
module (模块)
class (类)
function (函数)
fixture默认的scope=function,所以我们不传的时候,默认对测试函数生效
将scope指定为class,可以实现每个测试类前执行一次
module指的是,在某个py文件执行前,执行一次,一个py文件就是一个模块
session是指pytest的会话,即所有的测试执行开始到结束,只会执行一次的操作
如果想在多个py文件中都可以引用这个前置操作,那么可以使用公共文件进行处理,即conftest.py,这个是固定文件名称,不可修改。
这个文件在pytest中被大量使用,用于定义一些Hook相关函数以及注册全局的Fixture函数。定义在conftest.py中的Fixture,都是全局的Fixture,可以在多个py文件中去使用
conftest.py
@pytest.fixture(autouse=True) # 传入autouse参数
def first():
print("setup...")
test_first.py
def test_pytest(first): # 定义测试函数,在此处引用fixture函数名即可
print("first test")
fixture的后置处理直接使用yield即可,可以帮助我们来做分割,在yield之前的属于setup,而之后的就是teardown。
@pytest.fixture()
def first():
print("setup...")
yield
print("teardown...")
说明:yield后的内容是执行完测试用例才会执行的,放在最后