Py.testはフィクスチャをどこでどのように探しますか?同じフォルダの2つのファイルに同じコードがあります。 conftest.pyを削除すると、cmdoptがtest_conf.pyを実行しているのを見つけることができません(同じフォルダーにあります。sonoftest.pyが検索されないのはなぜですか?)
# content of test_sample.py
def test_answer(cmdopt):
if cmdopt == "type1":
print ("first")
Elif cmdopt == "type2":
print ("second")
assert 0 # to see what was printed
import pytest
def pytest_addoption(parser):
parser.addoption("--cmdopt", action="store", default="type1",
help="my option: type1 or type2")
@pytest.fixture
def cmdopt(request):
return request.config.getoption("--cmdopt")
import pytest
def pytest_addoption(parser):
parser.addoption("--cmdopt", action="store", default="type1",
help="my option: type1 or type2")
@pytest.fixture
def cmdopt(request):
return request.config.getoption("--cmdopt")
ドキュメントは言う
http://pytest.org/latest/fixture.html#fixture-function
- pytestは、test_プレフィックスがあるため、test_ehloを検出します。テスト関数には、smtpという名前の関数引数が必要です。一致するフィクスチャ関数は、smtpという名前のフィクスチャが付けられた関数を探すことによって発見されます。
- smtp()は、インスタンスを作成するために呼び出されます。
- test_ehlo()が呼び出され、テスト関数の最終行で失敗します。
py.testはconftest.py
とすべてのPythonファイル、python_files
パターンに一致します。デフォルトではtest_*.py
です。テストフィクスチャがある場合、 conftest.py
から、またはそれに依存するテストファイルからインポートまたはインポートするには:
from sonoftest import pytest_addoption, cmdopt
以下は、py.testがフィクスチャ(およびテスト)を探す順序と場所です(- here から取得):
py.testは、ツールの起動時に次の方法でプラグインモジュールをロードします。
すべての組み込みプラグインをロードする
setuptoolsエントリポイントを通じて登録されたすべてのプラグインをロードする。
-p name
オプションのコマンドラインを事前スキャンし、実際のコマンドライン解析の前に指定されたプラグインをロードする。コマンドラインの呼び出しで推測されたすべての
conftest.py
ファイルをロードする(テストファイルとそのすべての親ディレクトリ)。サブディレクトリのconftest.py
ファイルは、デフォルトではツールの起動時にロードされないことに注意してください。
conftest.py
ファイルのpytest_plugins変数で指定されたすべてのプラグインを再帰的にロードする
私は同じ問題を抱えており、簡単な解決策を見つけるために多くの時間を費やしました。この例は、私と同じような状況にある他の人のためのものです。
import pytest
pytest_plugins = [
"some_package.sonoftest"
]
def pytest_addoption(parser):
parser.addoption("--cmdopt", action="store", default="type1",
help="my option: type1 or type2")
@pytest.fixture
def cmdopt(request):
return request.config.getoption("--cmdopt")
import pytest
@pytest.fixture
def sono_cmdopt(request):
return request.config.getoption("--cmdopt")
def test_answer1(cmdopt):
if cmdopt == "type1":
print ("first")
Elif cmdopt == "type2":
print ("second")
assert 0 # to see what was printed
def test_answer2(sono_cmdopt):
if sono_cmdopt == "type1":
print ("first")
Elif sono_cmdopt == "type2":
print ("second")
assert 0 # to see what was printed
ここで同様の例を見つけることができます: https://github.com/pytest-dev/pytest/issues/3039#issuecomment-464489204 と他のここ https://stackoverflow.com/a/54736376/6655459
公式のpytestドキュメントの説明: https://docs.pytest.org/en/latest/reference.html?highlight=pytest_plugins#pytest-plugins
pytest
によってプラグインをロードするには、some_package.test_sample"
で参照されるそれぞれのディレクトリに__init__.py
ファイルが必要であることに注意してください。