pytest中的测试用例执行顺序

时间:2013-07-10 13:06:42

标签: python pytest

我正在使用pytest。我在目录中有两个文件。在其中一个文件中有一个长时间运行的测试用例,它会生成一些输出。在另一个文件中有一个读取该输出的测试用例。如何确保两个测试用例的正确执行顺序?除了以正确的顺序将测试用例放在同一个文件中之外,还有其他选择吗?

11 个答案:

答案 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-dependencypytest-dependspytest-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并将其作为参数传递给依赖。