2015-11-03 11 views
24

質問使用して、テストディレクトリ内のパッケージを作成することなく、テスト中の関数を作成し、インポートヘルパーpy.test

がどのように私はtestディレクトリにパッケージを作成せずにテストファイルにおけるヘルパー関数をインポートすることができますか?


コンテキスト

私はいくつかのテストにインポートすることができ、テストヘルパー関数を作成したいと思います。 、このような何かを言う:Pythonの3.5を使用して

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

を、py.testと2.8.2


現在の "ソリューション"

私は現在やっていますこれは私のプロジェクトのtestディレクトリ(今はパッケージになっています)の内部でモジュールをインポートすることですが、もし可能ならばible(私のtestディレクトリにはパッケージがなくテストだけがあり、テストはパッケージのインストールされたバージョンで実行することができます(推奨されている通りhere in the py.test documentation on good practices)。

+1

pytestが '__init __。py'-filesを駄目にするのは夢中ですが、同時にテスト間でヘルパ関数を共有するための代替手段を提供しません。私の髪はこれで灰色になっています。 – qff

答えて

18

私のオプションは、tests dirに追加のディレクトリを作成し、それをconftestのpythonpathに追加することです。 setup.cfg

[pytest] 
norecursedirs=tests/helpers 

conftest.py

import sys 
import os 
sys.path.append(os.path.join(os.path.dirname(__file__), 'helpers')) 

tests/ 
    helpers/ 
     utils.py 
     ... 
    conftest.py 
setup.cfg 

は、このモジュールは、名前だけが衝突に気をつけて、 `輸入utilsのが利用できるようになります。

+1

私はこのソリューションを本当に気に入っていました。特に、テストのコードのインポートパス設定を保持しているからです。これは、よりシンプルな設計になります。ありがとう! –

+1

'norecursdirs = tests/utils'は' norecursedirs = tests/helpers'だったはずです(recurseでのeの追加に注意してください)。あれは正しいですか? –

+0

@Elizaあなたは正しいです。私の答えを更新するだけです。 – sax

9

この問題の解決策を探しているうちに、私はこのような問題に遭遇し、同じアプローチを採り入れました。ヘルパーパッケージを作成して、インポート可能にしてからインポートするだけです...

これは最善のアプローチではありませんでしたので、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) 

その非常に単純およびドキュメントはかなり小さなようにそれを使用したテストケースの中に。見て、それがあなたの問題にもあてはまるかどうか教えてください。

+0

クール、私は見てみましょう。ありがとう! –

+0

私はこれを試しましたが、私はいつも 'RuntimeError:呼び出されているヘルパーは登録されていませんでした'というエラーが表示されます。 –

+0

RuntimeErrorのトリガ方法の例を使ってプラグインにチケットを提出してください。 https://github.com/saltstack/pytest-helpers-namespace – s0undt3ch

-1

は別の選択肢として、このディレクトリ構造は、私の仕事:

my_test.py
mypkg/ 
    ... 
test_helpers/ 
    __init__.py 
    utils.py 
    ... 
tests/ 
    my_test.py 
    ... 

そしてが使用してユーティリティをインポートします。 from test_helpers import utils

+0

これは、コードとテストがはっきりと分かれていない質問で説明したのと同じ状況だと思います。リリースなどでは、 'test_helpers'を除外することも考えなければなりません。 –

5

あなたはその後、作成、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() 
0

をテストフォルダにヘルパーパッケージを作成します:のsetup.cfgで tests/ helpers/ __init__.py utils.py ... # make sure no __init__.py in here! setup.cfg

を: [pytest] norecursedirs=tests/helpers

ヘルパーはimport helpersで利用可能になります。

関連する問題