2013-06-08 12 views
15

私はワイヤー統合テストスイートに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テストの記者を信頼すると誤解されました。テストは期待通りに実行されています。私はそれを残すだろうと思った質問を削除するよりもむしろ。 documentationから

+1

さて、この質問は無視できますが、プラグインは期待どおりに動作していると思います。テスト担当者が違う順序でPychamrから実行している間、私は脳のおならを持っていました。しかし、テストは実際には実行中に期待どおりに注文されています。 – Jesse

+3

私はあなたのコードベースを知らないので、あまりにも多くを推測したくないですが、自動化されたテストの経験に基づいて、最良の長期的なソリューションがあなたのテストを彼らはもはやお互いに依存関係を持ちません。セットアップ関数で必要な前提条件を繰り返したり、実際に依存する一連のイベントを繰り返して1つのテストにマージしたりすることを検討することもできます。また、単体テストとしては、一般に機能の個々の「ユニット」をテストし、可能な限り外部IOを避けるべきであることに注意してください。 – GrandOpener

答えて

16

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

だから、簡単な解決策は、あなたのテストケースにテストの名前を変更することがあります

class Foo(unittest.TestCase): 

    def test_01_foo(self): 
     pass 

    def test_02_boo(self): 
     pass 
1

私はそれがPyTest注文プラグインを使用するためのソリューションがhereを提供しました。

は、CLIでpy.test YourModuleName.py -vvを試してみて、テストでは、彼らはあなたのモジュール(最初test_foo、その後test_bar)

私は同じことをしたし、私のために正常に動作して登場してきた順に実行されます。

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

関連する問題