42

py.testはどこでどのようにフィクスチャを探しますか?同じフォルダ内の2つのファイルに同じコードがあります。conftest.pyを削除すると、test_conf.pyを実行しているcmdoptが見つかりません(これも同じフォルダーにあります。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

conftest.pyのコンテンツ

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")

sonoftest.pyの内容

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

  1. pytestは、test_プレフィックスが原因でtest_ehloを検出します。テスト関数には、smtpという名前の関数引数が必要です。一致するフィクスチャ関数は、smtpという名前のフィクスチャマーク付き関数を探すことによって検出されます。
  2. smtp()は、インスタンスを作成するために呼び出されます。
  3. test_ehlo()が呼び出され、テスト関数の最後の行で失敗します。
4

3 に答える 3

36

py.testは、デフォルトで、パターンにconftest.py一致するすべてのPythonファイルをインポートします。テストフィクスチャがある場合は、それに依存するテストファイルからインクルードまたはインポートする必要があります。python_filestest_*.pyconftest.py

from sonoftest import pytest_addoption, cmdopt
于 2012-11-30T10:17:24.343 に答える
23

py.testがフィクスチャ(およびテスト)を探す順序と場所は次のとおりです(ここから取得)。

py.testは、ツールの起動時に次の方法でプラグインモジュールをロードします。

  1. すべての組み込みプラグインをロードする

  2. setuptoolsエントリポイントを介して登録されたすべてのプラグインをロードします。

  3. オプションのコマンドラインを事前にスキャンし、-p name実際のコマンドライン解析の前に指定されたプラグインをロードします。

  4. conftest.pyコマンドライン呼び出しによって推測されるすべてのファイル(テストファイルとそのすべての親ディレクトリ)をロードする。conftest.pyサブディレクトリのファイルは、デフォルトではツールの起動時にロードされない ことに注意してください 。

  5. pytest_plugins変数で指定されたすべてのプラグインをconftest.pyファイルに再帰的にロードする

于 2012-12-03T15:19:40.073 に答える
4

私は同じ問題を抱えていて、簡単な解決策を見つけるために多くの時間を費やしました。この例は、私と同じような状況にある他の人のためのものです。

  • conftest.py:
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")
  • some_package / sonoftest.py:
import pytest

@pytest.fixture
def sono_cmdopt(request):
  return request.config.getoption("--cmdopt")
  • some_package / test_sample.py
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

参照されるそれぞれのディレクトリに は、プラグインをロードするためのファイルsome_package.test_sample"が必要であることに注意してください。__init__.pypytest

于 2019-02-17T18:19:14.833 に答える