1

私は新しいバージョンのpytest(2.3)を研究していて、あなたがいる新しい機能に非常に興奮しています

「元に戻す必要のあるアクションを実行するとすぐに、1つまたは複数のティアダウン関数を登録することで、ティアダウンを正確に制御できます。これにより、個別の「ティアダウン」デコレータが不要になります。」

ここから

関数として使用する場合はすべてかなり明確ですが、クラスでどのように使用するのですか?

class Test(object):

    @pytest.setup(scope='class')
    def stp(self):
        self.propty = "something"

    def test_something(self):
    ... # some code
    # need to add something to the teardown

    def test_something_else(self):
    ... # some code
    # need to add even more to the teardown
4

2 に答える 2

3

わかりました、「セッション」全体の funcarg を持つことで機能しましたfinalizer:

@pytest.fixture(scope = "session")
def finalizer():
    return Finalizer()

class Finalizer(object):

    def __init__(self):
        self.fin_funcs = []

    def add_fin_func(self, func):
        self.fin_funcs.append(func)

    def remove_fin_func(self, func):
        try:
            self.fin_funcs.remove(func)
        except:
            pass

    def execute(self):
        for func in reversed(self.fin_funcs): 
            func()
        self.fin_funcs = []     

class TestSomething(object):

    @classmethod
    @pytest.fixture(scope = "class", autouse = True)
    def setup(self, request, finalizer):

        self.finalizer = finalizer
        request.addfinalizer(self.finalizer.execute)
        self.finalizer.add_fin_func(lambda: some_teardown())

    def test_with_teardown(self):

        #some test
        self.finalizer.add_fin_func(self.additional_teardown)

    def additional_teardown(self):
        #additional teardown

電子メールに返信し、最終バージョンを入手するのを手伝ってくれた @hpk42 に感謝します。

注:残りのステップと改善されたシナリオをxfail することで、これは非常に優れたテスト ステップ構造になります。

于 2012-09-24T22:43:45.943 に答える
0

実際、分解の良い例はまだありません。request オブジェクトにはaddfinalizer メソッドがあります。使用例を次に示します。

@pytest.setup(scope=...)
def mysetup(request):
     ...
     request.addfinalizer(finalizerfunction)
     ...

スコープ内のすべてのテストの実行が終了すると、ファイナライザー関数が呼び出されます。

于 2012-09-22T06:42:17.490 に答える