web-dev-qa-db-ja.com

py.testを使用してテストディレクトリにパッケージを作成せずに、テストでヘルパー関数を作成およびインポートします

質問

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の優れた実践に関するドキュメント )。

33

私のオプションは、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、名前の衝突にのみ注意してください。

26
sax

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()
15
augurar

この問題の解決策を探しているときに、この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)

その非常にシンプルで、ドキュメントは非常に小さいです。問題を解決できるかどうかを確認してください。

15
s0undt3ch

パッケージを作成せずに異なるモジュールからメソッドにアクセスし、その関数をヘルパー関数として動作させるには、次のことが役立ちました。

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

Testsフォルダーにヘルパーパッケージを作成します。

tests/
    helpers/
      __init__.py
      utils.py
      ...
    # make sure no __init__.py in here!
setup.cfg

setup.cfgで:

[pytest]
norecursedirs=tests/helpers

ヘルパーはimport helpers

2
guyskk