質問
test
ディレクトリにパッケージを作成せずに、テストファイルにヘルパー関数をインポートするにはどうすればよいですか?
コンテキスト
いくつかのテストでインポートできるテストヘルパー関数を作成したいと思います。次のように言います:
# In common_file.py
def assert_a_general_property_between(x, y):
# test a specific relationship between x and y
assert ...
# In test/my_test.py
def test_something_with(x):
some_value = some_function_of_(x)
assert_a_general_property_between(x, some_value)
Python 3.5、py.test 2.8.2を使用)
現在の「ソリューション」
私は現在、プロジェクトのtest
ディレクトリ(現在はパッケージです)内にモジュールをインポートすることでこれを行っていますが、可能であれば他のメカニズムでそれを行いたいです(したがって、test
ディレクトリにはパッケージがありませんが、推奨されているように、インストールされたバージョンのパッケージでテストを実行できます こちらのpy.testの優れた実践に関するドキュメント )。
私のオプションは、tests
dirに追加のディレクトリを作成し、conftestのpythonpathに追加することです。
tests/
helpers/
utils.py
...
conftest.py
setup.cfg
の中に conftest.py
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), 'helpers'))
setup.cfg
[pytest]
norecursedirs=tests/helpers
このモジュールはimport utils
、名前の衝突にのみ注意してください。
Conftest.pyでヘルパークラスを定義し、そのクラス(または必要に応じてそのインスタンス)を返すフィクスチャを作成できます。
import pytest
class Helpers:
@staticmethod
def help_me():
return "no"
@pytest.fixture
def helpers():
return Helpers
次に、テストでフィクスチャを使用できます。
def test_with_help(helpers):
helpers.help_me()
この問題の解決策を探しているときに、このSOの質問に遭遇し、同じアプローチを採用することになりました。ヘルパーパッケージの作成、sys.path
インポート可能にしてからインポートするだけです...
これは最善のアプローチとは思えなかったので、 pytest-helpers-namespace を作成しました。このプラグインを使用すると、conftest.py
:
import pytest
pytest_plugins = ['helpers_namespace']
@pytest.helpers.register
def my_custom_assert_helper(blah):
assert blah
# One can even specify a custom name for the helper
@pytest.helpers.register(name='assertme')
def my_custom_assert_helper_2(blah):
assert blah
# And even namespace helpers
@pytest.helpers.asserts.register(name='me')
def my_custom_assert_helper_3(blah):
assert blah
そして、テストケースの関数本体内で次のように使用します。
def test_this():
assert pytest.helpers.my_custom_assert_helper(blah)
def test_this_2():
assert pytest.helpers.assertme(blah)
def test_this_3():
assert pytest.helpers.asserts.me(blah)
その非常にシンプルで、ドキュメントは非常に小さいです。問題を解決できるかどうかを確認してください。
パッケージを作成せずに異なるモジュールからメソッドにアクセスし、その関数をヘルパー関数として動作させるには、次のことが役立ちました。
conftest.py:
@pytest.fixture
def compare_test_vs_actual():
def a_function(test, actual):
print(test, actual)
return a_function
test_file.py:
def test_service_command_add(compare_test_vs_actual):
compare_test_vs_actual("hello", "world")
Testsフォルダーにヘルパーパッケージを作成します。
tests/
helpers/
__init__.py
utils.py
...
# make sure no __init__.py in here!
setup.cfg
setup.cfgで:
[pytest]
norecursedirs=tests/helpers
ヘルパーはimport helpers
。