これはconftest.pyの正しい使い方ですか?
はい、そうです。器具はの潜在的で一般的な使用法ですconftest.py
。定義するフィクスチャは、テストスイートのすべてのテストで共有されます。ただし、ルートでフィクスチャを定義してconftest.py
も役に立たない場合があり、そのようなフィクスチャがすべてのテストで使用されていない場合は、テストの速度が低下します。
他の用途はありますか?
はい、そうです。
フィクスチャ:テストで使用される静的データのフィクスチャを定義します。特に明記されていない限り、このデータにはスイート内のすべてのテストからアクセスできます。これは、データと、すべてのテストに渡されるモジュールのヘルパーです。
外部プラグインのロード:conftest.py
外部プラグインまたはモジュールをインポートするために使用されます。次のグローバル変数を定義することにより、pytestはモジュールをロードし、テストに使用できるようにします。プラグインは通常、プロジェクトで定義されたファイル、またはテストで必要になる可能性のある他のモジュールです。ここで説明するように、事前定義されたプラグインのセットをロードすることもできます。
pytest_plugins = "someapp.someplugin"
フック:テストを改善するために、セットアップやティアダウンメソッドなどのフックを指定できます。利用可能なフックのセットについては、こちらをご覧ください。例:
def pytest_runtest_setup(item):
""" called before ``pytest_runtest_call(item). """
#do some stuff`
ルートパスのテスト:これは少し隠された機能です。conftest.py
ルートパスで定義することにより、をpytest
指定せずにアプリケーションモジュールを認識できますPYTHONPATH
。バックグラウンドで、py.testは、ルートパスsys.path
から見つかったすべてのサブモジュールを含めることにより、を変更します。
conftest.pyファイルを複数持つことはできますか?
はい、可能です。テスト構造が多少複雑な場合は強くお勧めします。conftest.py
ファイルにはディレクトリスコープがあります。したがって、対象となるフィクスチャとヘルパーを作成することをお勧めします。
いつそれをしたいですか?例は高く評価されます。
いくつかのケースが当てはまる可能性があります:
特定のテストグループ用のツールまたはフックのセットを作成する。
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
test root/mod2/test.py will NOT produce "I am mod"
一部のテストではフィクスチャのセットをロードしていますが、他のテストではロードしていません。
root / mod / conftest.py
@pytest.fixture()
def fixture():
return "some stuff"
root / mod2 / conftest.py
@pytest.fixture()
def fixture():
return "some other stuff"
root / mod2 / test.py
def test(fixture):
print(fixture)
「他の何か」を印刷します。
ルートから継承されたフックのオーバーライドconftest.py
。
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
root / conftest.py
def pytest_runtest_setup(item):
print("I am root")
#do some stuff
内部root/mod
でテストを実行すると、「I am mod」のみが出力されます。
詳細については、conftest.py
こちらをご覧ください。
編集:
異なるモジュールのいくつかのテストから呼び出されるプレーンなヘルパー関数が必要な場合はどうしたらよいですか-conftest.pyに配置すると、それらを使用できますか?または、単にそれらをhelpers.pyモジュールに入れて、インポートしてテストモジュールで使用する必要がありますか?
を使用conftest.py
してヘルパーを定義できます。ただし、一般的な方法に従う必要があります。ヘルパーは、少なくともでフィクスチャとして使用できますpytest
。たとえば、私のテストでは、モックのredisヘルパーを使用して、この方法でテストに注入しています。
root / helper / redis / redis.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / tests / stuff / conftest.py
pytest_plugin="helper.redis.redis"
root / tests / stuff / test.py
def test(mock_redis):
print(mock_redis.get('stuff'))
これは、テストに自由にインポートできるテストモジュールになります。NOTEあなたが潜在的に名前を付けることができることredis.py
としてconftest.py
、あなたのモジュールがあればredis
より多くのテストが含まれています。ただし、あいまいさがあるため、この方法は推奨されません。
を使用する場合conftest.py
は、ヘルパーをルートに配置conftest.py
して、必要に応じて挿入するだけです。
root / tests / conftest.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / tests / stuff / test.py
def test(mock_redis):
print(mock_redis.get(stuff))
あなたができる別のことは、インストール可能なプラグインを書くことです。その場合、ヘルパーはどこにでも書くことができますが、あなたや他の潜在的なテストフレームワークにインストールするエントリポイントを定義する必要があります。参照してくださいこれを。
フィクスチャを使用したくない場合は、もちろん単純なヘルパーを定義して、必要な場所でプレーンな古いインポートを使用できます。
root / tests / helper / redis.py
class MockRedis():
# stuff
root / tests / stuff / test.py
from helper.redis import MockRedis
def test():
print(MockRedis().get(stuff))
ただし、モジュールがテストの子フォルダーにないため、ここではパスに問題がある可能性があります。あなたは__init__.py
あなたのヘルパーにを追加することでこれをテストすることができます(テストされていません)
root / tests / helper / __ init__.py
from .redis import MockRedis
または、ヘルパーモジュールをに追加するだけPYTHONPATH
です。
It seems great. However, I feel the documentation could be better.