1

私はpy.testの周りに素敵なベースを構築しようとしています

一部のテストでは、機能するために特定のテスト データが必要です。

現在、関数の引数としてモック オブジェクトを指定し、ジェネレーターでセットアップを行うだけですが、これは明らかに望ましくありません。

以下は、今日の外観の例です。

def test_something(self, some_data):
    # some_data is unused in the test

私はこのようなことをしたいと思います:

@uses_some_data
def test_something(self):
    # The data is loaded when the test is run

私はこれを適切に行う方法を理解していませんが。

すべてのテストクラスでセットアップ/破棄するのではなく、セッション全体でデータを永続化したいため、クラスセットアップを使用できません。

私の最初のアイデアは、まだ funcarg を使用することでしたが、テストに funcarg を持たせる代わりに、デコレータに関数の funcarg を要求させ、基本的に醜さを隠しました。

これに関する問題は、funcarg を要求するために py.test オブジェクトが必要なことです。
そのようなオブジェクトを取得する方法はありますか、それともこれは間違ったアプローチですか?

収集されたテストのいずれもデータを必要としない場合、データをロードする必要がない場合は素晴らしいボーナスになります。これは、テストが実行されるかどうかに関係なく常に実行されるため、デコレータを使用することの欠点です。

4

2 に答える 2

1

いくつか遊んだ後、これが機能することがわかりました:

def pytest_funcarg__some_data(request):
    def create():
        # Load the test data here
        print 'Test data loaded'

    return request.cached_setup(
        setup=create,
        scope='session',
        extrakey='some_data'
    )

def uses_some_data(func):
    # The funcarg is actually requested here
    def wrapper(self, some_data):
        return func
    return wrapper

class TestSomething(object):
    @uses_some_data
    def test_something(self):
        # "Some data" is now available
        pass
于 2011-11-07T22:53:30.077 に答える