2012-08-16 71 views
10

我希望能夠在使用鼻子測試運行器的同時獲得特定測試方法的結果並將其輸出到拆卸方法中。 有一個很好的例子here獲取Python的nosetests導致tearDown()方法

但不幸的是,運行nosetests example.py不起作用,因爲鼻子似乎不喜歡這樣的事實,在超類的run方法被重寫:

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

回答

-1

如果你是加入一些樣板代碼確定到測試中,像下面這樣的東西可能會起作用。

在MyTest1中,在每次測試結束時調用tearDown,並將self.result的值設置爲包含方法名稱和字典的元組(但您可以將其設置爲任何您喜歡的值)。檢查模塊用於獲取方法名稱,因此tearDown知道剛剛運行的測試。

在MyTest2,所有的結果保存在一個字典(results),您可以與您在tearDownClass方法喜歡什麼做的。

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中測試),downvote是可能當之無愧,我不會在自己的生產代碼中使用它,另一方面,它似乎工作;實用性勝過純度和所有這些 – 2014-03-27 19:02:09

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

您的代碼在這些行中顯示錯誤: pass + = 1 and failures + = 1 (未定義的變量錯誤) – Cas 2014-12-02 21:21:07

+0

謝謝。我會添加初始化。 – dbn 2014-12-10 19:15:47