2012-08-16 9 views
10

特定のテストメソッドの結果を取得し、ティースダウンメソッドで出力することができます。ノーズテストランナーを使用します。 非常に良い例がありますhereです。Pythonのnosetestsを取得するとtearDown()メソッドが返される

しかし残念ながら、鼻がスーパークラスでrunメソッドがオーバーライドされているという事実が好きとは思われないため、nosetests example.pyが動作しない実行している:あなたは、いくつかの定型コードを追加してOKであれば

AttributeError: 'ResultProxy' object has no attribute 'wasSuccessful' 

答えて

-1

をテストには、次のようなものが動作するかもしれません。

各テストの最後にtearDownが呼び出され、self.resultの値がメソッド名と辞書を含むタプルに設定されています(しかし、それを好みの値に設定できます)。検査モジュールを使用してメソッド名を取得するので、tearDownはどのテストが実行されたかを知っています。

MyTest2、

すべて結果は、あなたがtearDownClass方法で好きなものを行うことができます辞書(results)、に保存されます。

import inspect 
import unittest 


class MyTest1(unittest.TestCase): 

    result = None 

    def tearDown(self): 
     print "tearDown:", self.result 

    def test_aaa(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.result = (name, None) 

     x = 1 + 1 
     self.assertEqual(x, 2) 

     self.result = (name, dict(x=x)) 

    def test_bbb(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.result = (name, None) 

     # Intentional fail. 
     x = -1 
     self.assertEqual(x, 0) 

     self.result = (name, dict(x=x)) 


class MyTest2(unittest.TestCase): 

    results = {} 

    @classmethod 
    def tearDownClass(cls): 
     print "tearDownClass:", cls.results 

    def test_aaa(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.results[name] = None 

     x = 1 + 1 
     self.assertEqual(x, 2) 

     self.results[name] = dict(x=x) 

    def test_bbb(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.results[name] = None 

     x = -1 
     self.assertEqual(x, 0) 

     self.results[name] = dict(x=x) 


if __name__ == '__main__': 
    unittest.main() 
+1

これはちょっとハッキリしている可能性があります(たとえば、Python 3ではテストされていません)。 –

5

注意:以下はtearDown中に実際にテストにアクセスするのではなく、各結果にアクセスします。

ノーズプラグイン(see the API documentation here)を書きます。あなたが興味を持っている方法はafterTest()です。これはテストの後に実行されます。 :)あなたの正確なアプリケーションによっては、handleError()/handleFailure()またはfinalize()が実際より有用かもしれません。

テストの結果が実行された直後にアクセスするサンプルプラグインです。

from nose.plugins import Plugin 
import logging 
log = logging.getLogger('nose.plugins.testnamer') 

class ReportResults(Plugin): 
    def __init__(self, *args, **kwargs): 
     super(ReportResults, self).__init__(*args, **kwargs) 
     self.passes = 0 
     self.failures = 0 
    def afterTest(self, test): 
     if test.passed: 
      self.passes += 1 
     else: 
      self.failures += 1 
    def finalize(self, result): 
     print "%d successes, %d failures" % (self.passes, self.failures) 

この簡単な例は、単にあなたが含まれるリンクのように(パスと失敗の数を報告しますが、私は、あなたが)here's another fun idea(もっと面白い何かをするためにそれを拡張することができます確信しています。これを使用するには、そのことを確認してくださいそれはノーズにインストールされ(またはカスタムランナーにロードされます)、--with-reportresultsでアクティブにします。

+0

あなたのコードはこれらの行のエラーを示しています: は+ = 1と失敗+ = 1を合格としますが、私は自分の生産コードでは使用しません。 1 (未定義の変数エラー) – Cas

+0

ありがとうございます。私は初期化を追加します。 – dbn

関連する問題