17

有線統合テスト スイートに Nose を使用したいと考えています。ただし、これらのテストの一部の実行順序は重要です。

そうは言っても、実行したい順序でテストを装飾するための簡単なプラグインを一緒に投げると思いました: https://gist.github.com/Redsz/5736166

def Foo(unittest.TestCase):

    @step(number=1)
    def test_foo(self):
        pass

    @step(number=2)
    def test_boo(self):
        pass

私が考えていた組み込みプラグインのレビューからloadTestsFromTestCase、修飾された「ステップ番号」でテストをオーバーライドして順序付けることができました。

def loadTestsFromTestCase(self, cls):
    """
    Return tests in this test case class. Ordered by the step definitions.
    """
    l = loader.TestLoader()
    tmp = l.loadTestsFromTestCase(cls)

    test_order = []
    for test in tmp._tests:
        order = test.test._testMethodName
        func = getattr(cls, test.test._testMethodName)
        if hasattr(func, 'number'):
            order = getattr(func, 'number')
        test_order.append((test, order))
    test_order.sort(key=lambda tup: tup[1])
    tmp._tests = (t[0] for t in test_order)
    return tmp

このメソッドは、私が望む順序でテストを返していますが、テストが鼻で実行されている場合、この順序で実行されていませんか?

おそらく、この注文の概念を別の場所に移動する必要がありますか?

更新:私が行ったコメントによると、プラグインは実際に期待どおりに機能しています。pycharm テストレポーターを信頼するのは間違いでした。テストは期待どおりに実行されています。質問を削除するのではなく、そのままにしておくことにしました。

4

2 に答える 2

20

ドキュメントから:

[...] ノーズは、モジュール ファイルに表示される順序で機能テストを実行します。TestCase 派生テストおよびその他のテスト クラスは、アルファベット順に実行されます。

したがって、簡単な解決策は、テスト ケース内のテストの名前を変更することです。

class Foo(unittest.TestCase):

    def test_01_foo(self):
        pass

    def test_02_boo(self):
        pass
于 2013-09-05T02:57:10.490 に答える
0

ここで提供されている PyTest 順序付けプラグインを使用して解決策を見つけました。

CLI で試すpy.test YourModuleName.py -vvと、モジュールに表示された順序でテストが実行されます (最初に test_foo、次に test_bar)。

私は同じことをしましたが、私にとってはうまくいきます。

注: PyTest パッケージをインストールしてインポートする必要があります。

于 2015-05-07T17:52:52.193 に答える