web-dev-qa-db-ja.com

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

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

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

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

py.test -k <pattern>は単一のパターンを許可します。

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

複数のパターンと各パターンのテストファイル名を指定する方法はありますか?それとも、ファイル内の正確なテストパスを指定してそのファイルをpytestへの入力としてフィードする方法はありますか?それともこの目的のために利用できるフック機能はありますか?

102
Sharad

さまざまなパターンでテストケースを実行するために -k option を使うことができます。

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

これは、test_001test_some_other_testという名前でテストケースを実行します。テストケース.

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

141
supamaze

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

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

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

pytest test_mod.py

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

pytest testing/

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

pytest -k "MyClass and not method"

これは与えられた文字列式にマッチする名前を含むテストを実行するでしょう。それは変数としてファイル名、クラス名と関数名を使うPythonオペレータを含むことができます。上記の例はTestMyClass.test_somethingを実行しますが、TestMyClass.test_method_simpleは実行しません。

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

収集された各テストには、::文字で区切られた、クラスfilename、関数名、およびパラメーター化からのパラメーターなどの指定子が後に続くモジュールfilenameで構成された固有の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

26
Amritpal Singh

たぶんpytest_collect_file()フックを使ってあなたが望むようにテストが指定されている.txtまたは.yamlファイルの内容を解析してそれらをpytestコアに返すことができます。

いい例が pytestのドキュメント にあります。私はあなたが探しているものだと思います。

0

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

pytest tests.py -k 'TestClassName and test_method_name'
0
Peter

ノード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
0
接口夏季

部分的な答えがあります。テストスクリプトを選択することしかできず、それらのスクリプト内の個々のテストを選択することはできないためです。

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

これが行きます:

  1. subset_tests_directoryのように新しい辞書を作ります。
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. 暗黙のうちにファイルがtest_directoryにあると仮定するインポートには注意してください。 python foo.py内からsubset_tests_directoryを実行し、必要に応じて修正することで、それらのいくつかを修正しなければなりませんでした。

  5. テストスクリプトが正しく実行されたら、そこにcd subset_tests_directorypytestを付けます。 Pytestはそれが見るスクリプトだけを拾います。

もう一つの可能​​性はあなたの現在のテストディレクトリ内でシンボリックリンクすることです、例えばln -s foo.py subset_foo.pyそしてpytest subset*.pyのように。インポートを調整する必要はありませんが、シンボリックリンクを削除するまでは混乱します。私のためにも働きました。

0
JL Peyret