fixture
firture相对于setup和teardown来说应该有以下几点优势:
命名方式灵活,不局限于setup和teardown这几个命名
conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置
scope="module" 可以实现多个.py跨文件共享前置
scope="session" 以实现多个.py跨文件使用一个session来完成多个用例
import pytest
@pytest.fixture()
def login(request):
print('请登录~~~~~~~~~')
def test_1():
print('用例 》 1')
def test_2(login):
print('用例 》 2')
def test_3(login):
print('用例 》 3')
if __name__ == '__main__':
pytest.main(['-q', 'test_class.py'])
test_class.py .用例 》 1
请登录~~~~~~~~~
.用例 》 2
请登录~~~~~~~~~
.用例 》 3
@pytest.fixture() 不带参数的时候 默认是 : scope=”function”
相当于setup、teardown,只要用例调用了,就会走login方法,当 fixture参数scope=”module” 的时候,那么它只会在第一个调用的时候才会走login方法,而后续的不会运行, 如下图所示:
import pytest
@pytest.fixture(scope='module')
def login(request):
print('请登录~~~~~~~~~')
def test_1(login):
print('用例 》 1')
def test_2(login):
print('用例 》 2')
def test_3(login):
print('用例 》 3')
if __name__ == '__main__':
pytest.main(['-q', 'test_class.py'])
test_class.py 请登录~~~~~~~~~
.用例 》 1
.用例 》 2
.用例 》 3
上述所述相当于setup,下面我们来说一下fixture中的teardown
yield,我们可以通过yied 来唤醒执行teardown,如下图:
import pytest
@pytest.fixture(scope='module')
def login(request):
print('请登录~~~~~~~~~')
yield
print('关闭状态~~~~~~~')
def test_1(login):
print('用例 》 1')
def test_2(login):
print('用例 》 2')
def test_3(login):
print('用例 》 3')
if __name__ == '__main__':
pytest.main(['-q', 'test_class.py'])
test_class.py 请登录~~~~~~~~~
.用例 》 1
.用例 》 2
.用例 》 3
关闭状态~~~~~~~
addfinalizer终结函数
import pytest
@pytest.fixture(scope='module')
def login(request):
print('请登录~~~~~~~~~')
def end():
print('关闭~~~~~~')
request.addfinalizer(end)
def test_1(login):
print('用例 》 1')
def test_2(login):
print('用例 》 2')
def test_3(login):
print('用例 》 3')
if __name__ == '__main__':
pytest.main(['-q', 'test_class.py'])
test_class.py 请登录~~~~~~~~~
.用例 》 1
.用例 》 2
.用例 》 3
关闭~~~~~~
yield和addfinalizer方法都是在测试完成后呼叫相应的代码。但是addfinalizer不同的是:
他可以注册多个终结函数。
这些终结方法总是会被执行,无论在之前的setup code有没有抛出错误。这个方法对于正确关闭所有的fixture创建的资源非常便利,即使其一在创建或获取时失败