我正在使用pytest。我在目录中有两个文件。在其中一个文件中有一个长时间运行的测试用例,它会生成一些输出。在另一个文件中有一个读取该输出的测试用例。如何确保两个测试用例的正确执行顺序?除了以正确的顺序将测试用例放在同一个文件中之外,还有其他选择吗?
答案 0 :(得分:22)
通常,您可以使用well-specified hooks来配置pytest的任何部分的行为。
在您的情况下,您需要“pytest_collection_modifyitems”挂钩,它允许您重新订购已收集的测试。
那就是说,看起来好像订购你的测试应该更容易 - 毕竟这是Python!所以我写了一个用于订购测试的插件:"pytest-ordering"。查看docs或从pypi安装。现在我建议使用@ pytest.mark.first和@ pytest.mark.second,或@ pytest.mark.order#markers之一,但我对更有用的API有一些想法。建议欢迎:)
答案 1 :(得分:7)
还有一个似乎符合您要求的插件pytest-ordering。
答案 2 :(得分:7)
看起来pytest按字母顺序运行测试。所以你可以尝试这种方式:
def test_a_first_test():
pass
def test_b_second_test():
pass
def test_o_middle_test():
pass
答案 3 :(得分:1)
也许您可以考虑使用dependency pytest插件,您可以在其中轻松设置测试依赖项:
@pytest.mark.dependency()
def test_long():
pass
@pytest.mark.dependency(depends=['test_long'])
def test_short():
pass
这种方式test_short
只有在test_long
成功且强制执行序列时才会执行。
答案 4 :(得分:1)
试试这个:
@pytest.fixture(xxx)
def test_A():
pass
yield
pass
@pytest.mark.usefixtures('test_A')
def test_B():
pass
答案 5 :(得分:1)
main.py:
import functools
import pytest
from demo import test_foo,test_hi
def check_depends(depends):
try:
for dep in depends:
dep()
except Exception as e:
return dep
else:
return True
def pytest_depend(depends):
def pytest_depend_decorator(func):
stat = check_depends(depends)
if stat is True:
return func
else:
return pytest.mark.skip(True, reason="%s[skip] --> %s[Failed]" % (func.__name__, stat.__name__))(func)
return pytest_depend_decorator
@pytest_depend([test_foo,test_hi])
def test_bar():
pass
@pytest_depend([test_foo,test_hi])
def test_bar2():
pass
demo.py:
def test_hi():
pass
def test_foo():
assert False
平台linux-Python 3.5.2,pytest-3.8.2,py-1.6.0,pluggy-0.7.1-/ usr / bin / python3
pytest -vrsx ./plugin.py
答案 6 :(得分:0)
确保已安装pytest-ordering软件包。 要确认,请转到Pycharm设置>>项目解释器>>,然后查找pytest-ordering: 如果不可用,请安装它。 Pycharm设置>>项目解释器>>单击+按钮并搜索pytest-ordering安装它。 瞧!肯定会工作。
答案 7 :(得分:0)
使用'-randomly-dont-reorganize'选项或 pytest-randomly 中可用的'-p no:randomly' >插件,它将按照您在模块中提到的顺序运行测试。
模块:
import pytest
def test_three():
assert True
def test_four():
assert True
def test_two():
assert True
def test_one():
assert True
执行:
(tmp.w95BqE188N) rkalaiselvan@dev-rkalaiselvan:~/$ py.test --randomly-dont-reorganize test_dumm.py
======================================================================== test session starts ========================================================================
platform linux2 -- Python 2.7.12, pytest-3.10.1, py-1.5.4, pluggy-0.7.1 -- /tmp/tmp.w95BqE188N/bin/python2
cachedir: .pytest_cache
Using --randomly-seed=1566829391
rootdir: /home/rkalaiselvan, inifile: pytest.ini
plugins: randomly-1.2.3, timeout-1.3.1, cov-2.6.0, mock-1.10.0, ordering-0.6
collected 4 items
test_dumm.py::test_three PASSED
test_dumm.py::test_four PASSED
test_dumm.py::test_two PASSED
test_dumm.py::test_one PASSED
(tmp.w95BqE188N) rkalaiselvan@dev-rkalaiselvan:~/$ py.test -p no:randomly test_dumm.py
======================================================================== test session starts ========================================================================
platform linux2 -- Python 2.7.12, pytest-3.10.1, py-1.5.4, pluggy-0.7.1 -- /tmp/tmp.w95BqE188N/bin/python2
cachedir: .pytest_cache
Using --randomly-seed=1566829391
rootdir: /home/rkalaiselvan, inifile: pytest.ini
plugins: randomly-1.2.3, timeout-1.3.1, cov-2.6.0, mock-1.10.0, ordering-0.6
collected 4 items
test_dumm.py::test_three PASSED
test_dumm.py::test_four PASSED
test_dumm.py::test_two PASSED
test_dumm.py::test_one PASSED
答案 8 :(得分:0)
请务必记住,在尝试修复 pytest 排序“问题”时,按照指定的顺序运行测试似乎是 pytest 的默认设置。
事实证明,由于这些包之一 - pytest-dependency
、pytest-depends
、pytest-order
,我的测试没有按顺序进行。一旦我用 pip uninstall package_name
将它们全部卸载,问题就消失了。好像有副作用
答案 9 :(得分:0)
Pytest
默认情况下它随机执行步骤。所以使用这个选项来按顺序执行。
安装方式:
pip install pytest-order
编写测试方法如下:
import pytest
@pytest.mark.order(1)
def test_foo():
assert True
@pytest.mark.order(2)
def test_bar():
assert True
答案 10 :(得分:0)
对我来说,修复测试执行顺序的最简单方法是将它们用作固定装置,按设计顺序执行。
@pytest.fixture()
def test_a():
print("running test a first")
pass
def test_b(test_a):
print("running test b after test a")
pass
将测试依赖标记为fixture并将其作为参数传递给依赖。