我在conftest.py中拥有治具
@pytest.fixture(scope="function", autouse=True)
@pytest.mark.usefixtures
def pause_on_assert():
yield
if hasattr(sys, 'last_value') and isinstance(sys.last_value, AssertionError):
tkinter.messagebox.showinfo(sys.last_value)
类似地,conftest.py中还有许多其他固定方式,范围分别为session
,module
我的测试用例看起来像这样
test.py
@pytest.fixture(scope="function", autouse=True)
def _wrapper:
print("pre condition")
yield
print("post condition")
def test_abc():
assert 1==0
问题是我希望conftest.py中的固定装置在测试用例中的yield
固定装置之前运行
如何更改夹具的执行顺序
答案 0 :(得分:3)
如果要确保在测试功能之后但在所有固定装置拆除之前运行一段代码,我建议改用pytest_runtest_teardown
钩子。将pause_on_assert
中的conftest.py
固定装置替换为:
def pytest_runtest_teardown(item, nextitem):
if hasattr(sys, 'last_value') and isinstance(sys.last_value, AssertionError):
tkinter.messagebox.showinfo(sys.last_value)
答案 1 :(得分:2)
这里是运行在打印“ B”的测试函数之前打印“ A”的conftest.py函数的示例。
cd到父目录,在此示例中为py_tests并运行。
pytest -s -v
输出为:
A
setting up
B
PASSED
具有目录结构:
py_tests
-conftest.py
-tests
--tests.py
文件:
conftest.py
import pytest
@pytest.fixture(scope="function")
def print_one():
print("\n")
print("A")
test.py
import pytest
class Testonething:
@pytest.fixture(scope="function", autouse=True)
def setup(self, print_one):
print("setting up")
def test_one_thing(self):
print("B")
assert True
答案 2 :(得分:2)
由于您的_wrapper
是功能范围的自动使用灯具:它将在相同作用域中的其他灯具之前实例化。因此,修复方法是定义_wrapper
而不包含autouse=True
,并尝试隐式调用该装饰器,例如:
def test_abc(_wrapper):
assert 1==0
[更新]如果您无法更改测试套件,建议您擦除所有本地特定的_wrapper
并重构conftest指定的固定装置以调用_wrapper
,因为固定装置功能可以自己使用其他固定装置。您的conftest.py
如下所示:
# conftest.py
@pytest.fixture(scope="function", autouse=True)
def _wrapper(pause_on_assert):
print("pre condition")
yield
print("post condition")
@pytest.fixture()
def pause_on_assert():
yield
if hasattr(sys, 'last_value') and isinstance(sys.last_value, AssertionError):
tkinter.messagebox.showinfo(sys.last_value)