6

私は現在、鼻を使っていくつかの機能テストを書いています。私がテストしているライブラリは、ディレクトリ構造を操作します。

再現可能な結果を​​得るために、テスト ディレクトリ構造のテンプレートを保存し、テストを実行する前にそのコピーを作成します (testssetup関数内で行います)。これにより、テストの開始時に常に適切に定義された状態が得られます。

ここで、さらに 2 つの要件があります。

  1. テストが失敗した場合、問題を分析できるように、テストが実行されたディレクトリ構造が上書きまたは削除されないようにしたいと考えています。
  2. 複数のテストを並行して実行できるようにしたいと考えています。

これらの要件は両方とも、実行されるテストごとに異なる名前で新しいコピーを作成することで解決できます。このため、setup関数で現在実行されているテストの名前にアクセスして、コピーに適切な名前を付けることができるようにしたいと考えています。これを達成する方法はありますか?

実例となるコード例:

def setup_func(test_name):
    print "Setup of " + test_name

def teardown_func(test_name):
    print "Teardown of " + test_name

@with_setup(setup_func, teardown_func)
def test_one():
    pass

@with_setup(setup_func, teardown_func)
def test_two():
    pass

期待される出力:

Setup of test_one
Teardown of test_one
Setup of test_two
Teardown of test_two

名前をパラメーターとして挿入するのが最も良い解決策ですが、他の提案も受け付けています。

4

3 に答える 3

2

カスタムデコレータを使用して、テスト関数で機能するソリューションがあります。

def with_named_setup(setup=None, teardown=None):
    def wrap(f):
        return with_setup(
            lambda: setup(f.__name__) if (setup is not None) else None, 
            lambda: teardown(f.__name__) if (teardown is not None) else None)(f)
    return wrap

@with_named_setup(setup_func, teardown_func)
def test_one():
    pass

@with_named_setup(setup_func, teardown_func)
def test_two():
    pass

これは既存のwith_setupデコレーターを再利用しますが、装飾された関数の名前をパラメーターとして渡されたsetupおよび関数にバインドします。teardown

于 2013-05-23T10:05:33.987 に答える