ファイルから実行するpytestテストを指定する方法はありますか?


190

pytestファイルから実行するテストを選択する方法はありますか?たとえば、foo.txt実行するテストのリストを含むファイル:

tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

または、pytestの異なるディレクトリから、テスト名に共通のパターンがない複数のテストを選択する方法はありますか?

pytest -k <pattern> 単一のパターンを許可します。

1つのオプションは、 pytest.mark各テストに対してことですが、私の要件は、異なるファイルから異なる組み合わせのテストを実行することです。

複数のパターンと各パターンのテストファイル名を指定する方法はありますか?

または

ファイルに正確なテストパスを指定し、そのファイルを入力としてフィードする方法はありますか pytestか?

または

この目的で利用できるフック関数はありますか?

回答:


231

-kオプションを使用して、さまざまなパターンでテストケースを実行できます。

py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'

これにより、test_001およびtest_some_other_testという名前のテストケースが実行され、残りのテストケースの選択が解除されます。

注:これにより、test_001またはtest_some_other_testで始まるすべてのテストケースが選択されます。たとえば、テストケースtest_0012がある場合は、それも選択されます。


1
ありがとう。しかし、foo.pyとbar.pyに同じ名前のテストがある場合(たとえばtest_001)、両方から実行されます。
Sharad

2
はい、そうです、パターンに一致するものはすべて、ノートで述べたように実行されます
supamaze

しかし、それは私にとって問題です。どのファイルからどのテストを実行するかを選択したいのですが。
Sharad

@NamGVU `-k <テストメソッド名>`
supamaze

4
それはする必要がありますpy.test path/to/test/file.py -k function_name_test
LittleZero

91

テストの指定/テストの選択

Pytestは、コマンドラインからテストを実行および選択するいくつかの方法をサポートしています。

モジュールでテストを実行する

pytest test_mod.py

ディレクトリでテストを実行する

pytest testing/

キーワード式でテストを実行する

pytest -k "MyClass and not method"

これは、指定された文字列式に一致する名前を含むテストを実行します。これには、ファイル名、クラス名、関数名を変数として使用するPython演算子を含めることができます。上記の例は実行されますTestMyClass.test_somethingが、実行されませんTestMyClass.test_method_simple

ノードIDでテストを実行する

収集された各テストにはnodeid、モジュールファイル名と、それに続くクラス名、関数名、パラメーター化からのパラメーターなどの指定子が、::文字。

モジュール内で特定のテストを実行するには:

pytest test_mod.py::test_func

コマンドラインでテストメソッドを指定する別の例:

pytest test_mod.py::TestClass::test_method

マーカー式でテストを実行する

pytest -m slow

@pytest.mark.slowデコレーターで装飾されたすべてのテストを実行します。

詳細については、マークを参照してください。

パッケージからテストを実行する

pytest --pyargs pkg.testing

これはpkg.testing、ファイルシステムの場所をインポートして使用し、そこからテストを見つけて実行します。

出典:https : //docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests


test_mod.py::TestClass::test_methodが最も効果的でした
StephenGodderidge

1
これを承認済みのanserとしてマークする必要があります
Adam Hughes

13

2つの異なるクラスに同じメソッド名があり、そのうちの1つだけを実行したい場合、これは機能します。

pytest tests.py -k 'TestClassName and test_method_name'

6

方法1:ランダムに選択されたテスト。長くて醜い。

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

方法2:キーワード式を使用します。

注:私はテストケース名で検索しています。同じことがTestClass名にも当てはまります。

ケース1:以下が検出された方を実行します。「OR」を使用しているため。

python -m pytest -k 'test_password_valid or test_no_configuration'

上記の2つが実際に正しいとすると、2つのテストが実行されます。

ケース2:正しくない名前と別の正しい名前。

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

1つだけが見つかり、実行されます。

ケース3:すべてのテストを実行するか、誰も実行しない場合は、ANDを使用します

python -m pytest -k 'test_password_valid and test_no_configuration'

どちらかが正しい場合、または何も実行されない場合に実行されます。

ケース4: 1つのフォルダーでのみテストを実行します。

python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'

ケース5: 1つのファイルのみからテストを実行します。

python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'

ケース6:一致を除くすべてのテストを実行します。

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'

1

ノードIDによるテストの実行に関するドキュメントによると

foo.txtにすべてのノードIDがあるので、実行するだけです

pytest `cat foo.txt | tr '\n' ' '`

これは以下のコマンドと同じです(問題のファイルの内容を含む)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test

1

私の答えは、さまざまなシナリオでテストのサブセットを実行する方法を提供します。

プロジェクト内のすべてのテストを実行する

pytest

単一のディレクトリでテストを実行する

1つのディレクトリからすべてのテストを実行するには、ディレクトリをパラメータとして使用します pytest

pytest tests/my-directory

単一のテストファイル/モジュールでテストを実行する

テストが満載のファイルを実行するには、相対パスをパラメータとしてファイルをリストしますpytest

pytest tests/my-directory/test_demo.py

単一のテスト関数を実行する

単一のテスト関数を実行するに::は、テスト関数名を追加します。

pytest -v tests/my-directory/test_demo.py::test_specific_function

-v どの関数が実行されたかを確認できるように使用されます。

単一のテストクラスを実行する

クラスのみを実行するには、関数で実行したようにしてを追加し::、次にクラス名をファイルパラメータに追加します。

pytest -v tests/my-directory/test_demo.py::TestClassName

テストクラスの単一のテストメソッドを実行する

すべてのテストクラスを実行したくない場合は、1つのメソッドだけを追加し、別::のメソッドとメソッド名を追加します。

pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method

テスト名に基づいて一連のテストを実行する

この-kオプションを使用すると、式を渡して、式で指定された特定の名前がテスト名のサブストリングとして含まれるテストを実行できます。使用することが可能であるまたは、そしてない複雑な式を作成します。

たとえば、名前に_raisesが含まれるすべての関数を実行するには:

pytest -v -k _raises


0

テストスクリプトの選択のみが可能で、それらのスクリプト内の個々のテストは許可されないため、考えられる部分的な答えは次のとおりです。

また、レガシー互換性モードとunittestスクリプトの使用によって制限されるため、ネイティブのpytestで動作することを保証しません。

ここに行く:

  1. たとえば、新しい辞書を作成しますsubset_tests_directory
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. ファイルがにあると暗黙的に想定しているインポートに注意してくださいtest_directorypython foo.py内からを実行し、subset_tests_directory必要に応じて修正することで、それらのいくつかを修正する必要がありました。

  5. テストスクリプトが正しく実行されるcd subset_tests_directoryと、すぐpytestそこにあります。Pytestは、検出したスクリプトのみを取得します。

別の可能性は、あなたの現在のテストディレクトリにシンボリックリンクされた、と言ってln -s foo.py subset_foo.py、その後pytest subset*.py。これにより、インポートを調整する必要がなくなりますが、シンボリックリンクを削除するまで、混乱が生じます。私のためにも働いた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.