web-dev-qa-db-ja.com

pytestでのテストケースの実行順序

私はpytestを使用しています。ディレクトリに2つのファイルがあります。ファイルの1つに、出力を生成する長時間実行テストケースがあります。他のファイルには、その出力を読み取るテストケースがあります。 2つのテストケースの適切な実行順序を確認するにはどうすればよいですか?テストケースを同じファイルに適切な順序で配置する以外に他に方法はありますか?

33
Kocka

一般に、pytestの基本的な部分の動作は、その よく指定されたフック を使用して構成できます。

あなたの場合、「pytest_collection_modifyitems」フックが必要です。これにより、収集されたテストを所定の位置に並べ替えることができます。

とは言っても、テストの順序付けがより簡単になるように見えます-これはPython結局のところ!テストを順序付けるためのプラグインを作成しました: "pytest-ordering" =。 docs を確認するか、または pypi からインストールします。現在、@ pytest.mark.firstおよび@ pytest.mark.second、または@のいずれかを使用することをお勧めしますpytest.mark.order#マーカーですが、より有用なAPIについていくつかのアイデアがあります。

24
Frank T

Pytestはテストをアルファベット順に実行するようです。だからあなたはこの方法を試すことができます:

def test_a_first_test():
    pass

def test_b_second_test():
    pass

def test_o_middle_test():
    pass
7
Yaroslav Luchyt

プラグイン pytest-ordering もあり、要件を満たしているようです。

6
funky-future

たぶん dependency pytestプラグインの使用を検討して、テストの依存関係を簡単に設定できます:

@pytest.mark.dependency()
def test_long():
    pass

@pytest.mark.dependency(depends=['test_long'])
def test_short():
    pass

こちらです test_shortは、test_longは成功で、実行シーケンスも強制します

5

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

1
zhihao he

これを試して:

@pytest.fixture(xxx)
def test_A():
    pass
    yield
    pass

@pytest.mark.usefixtures('test_A')
def test_B():
    pass
1
Ali Zwd

Pytest-orderingパッケージがインストールされていることを確認してください。確認するには、Pycharmの設定>>プロジェクトインタープリター>>に移動してpytest-orderingを探します。使用できない場合はインストールしてください。 Pycharm設定>>プロジェクトインタープリター>> +ボタンをクリックし、pytest-orderingを検索してインストールします。出来上がり!それは間違いなく動作します。

0
Amol Kumar

'-randomly-dont-reorganize'オプションまたは'-p no:randomly'pytest-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
0
Ravichandran K