私はpytestを使用しています。ディレクトリに2つのファイルがあります。ファイルの1つに、出力を生成する長時間実行テストケースがあります。他のファイルには、その出力を読み取るテストケースがあります。 2つのテストケースの適切な実行順序を確認するにはどうすればよいですか?テストケースを同じファイルに適切な順序で配置する以外に他に方法はありますか?
一般に、pytestの基本的な部分の動作は、その よく指定されたフック を使用して構成できます。
あなたの場合、「pytest_collection_modifyitems」フックが必要です。これにより、収集されたテストを所定の位置に並べ替えることができます。
とは言っても、テストの順序付けがより簡単になるように見えます-これはPython結局のところ!テストを順序付けるためのプラグインを作成しました: "pytest-ordering" =。 docs を確認するか、または pypi からインストールします。現在、@ pytest.mark.firstおよび@ pytest.mark.second、または@のいずれかを使用することをお勧めしますpytest.mark.order#マーカーですが、より有用なAPIについていくつかのアイデアがあります。
Pytestはテストをアルファベット順に実行するようです。だからあなたはこの方法を試すことができます:
def test_a_first_test():
pass
def test_b_second_test():
pass
def test_o_middle_test():
pass
プラグイン pytest-ordering もあり、要件を満たしているようです。
たぶん dependency pytestプラグインの使用を検討して、テストの依存関係を簡単に設定できます:
@pytest.mark.dependency()
def test_long():
pass
@pytest.mark.dependency(depends=['test_long'])
def test_short():
pass
こちらです test_short
は、test_long
は成功で、実行シーケンスも強制します。
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
これを試して:
@pytest.fixture(xxx)
def test_A():
pass
yield
pass
@pytest.mark.usefixtures('test_A')
def test_B():
pass
Pytest-orderingパッケージがインストールされていることを確認してください。確認するには、Pycharmの設定>>プロジェクトインタープリター>>に移動してpytest-orderingを探します。使用できない場合はインストールしてください。 Pycharm設定>>プロジェクトインタープリター>> +ボタンをクリックし、pytest-orderingを検索してインストールします。出来上がり!それは間違いなく動作します。
'-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