ai didi

python - 在pytest中,如何确保在类级之前调用模块级 fixture

转载 作者:太空狗 更新时间:2023-10-30 02:55:37 24 4
gpt4 key购买 nike

我的 pytest 很旧(版本 2.8.3)。

pytestmark = pytest.mark.usefixtures("module_level")

@pytest.fixture(scope='module')
def module_level(request):
print("module start")
def fin():
print("module end")
request.addfinalizer(fin)

@pytest.fixture(scope='class')
def class_level(request):
print("class start")
def fin():
print("class end")
request.addfinalizer(fin)

@pytest.mark.usefixtures("class_level")
class TestMyClass:
def test_func(self):
pass

然而,我得到的顺序是:

class start
module start
class end
module end

这不是我想要的。那么编写模块级设置/清理装置的正确方法是什么(并确保它在一切之前进行设置并在一切之后进行清理)?

最佳答案

pytest 按照在测试文件中编写的顺序处理测试,并在需要时按顺序加载 fixture。请参阅有关 fixtures 的文档.

在您的示例中,pytest 首先从类测试开始,然后加载模块依赖项。

如果您想先设置“模块”,有多种可能性

a) module_level被class_level作为参数使用,因此加载在前面(不需要pytestmark)

import pytest

@pytest.fixture(scope='module')
def module_level(request):
print("module start")
def fin():
print("module end")
request.addfinalizer(fin)

@pytest.fixture(scope='class')
def class_level(request, module_level):
print("class start")
def fin():
print("class end")
request.addfinalizer(fin)

@pytest.mark.usefixtures("class_level")
class TestMyClass:
def test_func(self):
pass

b) 使用@pytestmark 作为类测试的要求,因此它被加载在前面

import pytest

pytestmark = pytest.mark.usefixtures("module_level")

@pytest.fixture(scope='module')
def module_level(request):
print("module start")
def fin():
print("module end")
request.addfinalizer(fin)

@pytest.fixture(scope='class')
def class_level(request):
print("class start")
def fin():
print("class end")
request.addfinalizer(fin)

@pytest.mark.usefixtures("class_level")
@pytestmark
class TestMyClass:
def test_func(self):
pass

c) 在类测试之前设置一个功能测试,这将首先执行 module_level

import pytest

pytestmark = pytest.mark.usefixtures("module_level")

@pytest.fixture(scope='module')
def module_level(request):
print("module start")
def fin():
print("module end")
request.addfinalizer(fin)

@pytest.fixture(scope='class')
def class_level(request):
print("class start")
def fin():
print("class end")
request.addfinalizer(fin)

def test_case():
assert True

@pytest.mark.usefixtures("class_level")
class TestMyClass:
def test_func(self):
pass

这在每种情况下都在“类”前面加载“模块”(pytest-2.8.7):

一)

::TestMyClass::test_func module start
class start
class end
module end

二)

::TestMyClass::test_func module start
class start
class end
module end

c)

::test_case module start
::TestMyClass::test_func class start
class end
module end

关于python - 在pytest中,如何确保在类级之前调用模块级 fixture ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42032084/

24 4 0
文章推荐: python - Python 中的 Scraper 给出 "Access Denied"
文章推荐: python - 让 Flask-Migrate 忽略映射为 Flask-SQLAlchemy 模型的 SQL View
文章推荐: python - 如何在 Pandas 中有效地执行相当于 Excel MATCH 功能(小于)的功能?
文章推荐: python - 用于在 Powershell 中退出 Python 的 Ctrl-C 现在不起作用
太空狗
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
全站热门文章
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com