簡體   English   中英

我如何使用unittest.TestResult?

[英]How do I use unittest.TestResult?

我只是在短時間內使用unittest。 我正在使用Jython 2.7.10“最終版本”

在解釋TestResult的Python 2.7文檔中,它說:

TestResult類的以下方法用於維護內部數據結構,並且可以在子類中進行擴展以支持其他報告要求。 這對於構建在運行測試時支持交互式報告的工具特別有用。

startTest(test)... stopTest(test)... startTestRun()... stopTestRun()¶

這就是我想要做的......但我無法弄清楚你如何使用TestResult。 這是一個SSCCE ......

import unittest

class TestResultX( unittest.TestResult ):
    def startTest( self, test ):
        print( '# blip')
        unittest.TestResult.startTest( self, test )
    def stopTest( self, test ):
        print( '# blop')
        unittest.TestResult.stopTest( self, test )
    def startTestRun( self ):
        print( '# blep')
        unittest.TestResult.startTestRun( self )
    def stopTestRun( self ):
        print( '# blap')
        unittest.TestResult.stopTestRun( self )

class TestCaseX( unittest.TestCase ):
    def test_nonsense(self):
        print( '# wotcha' )
        self.assertTrue( False )

    def run( self, test_result=None ):
        print( '# spoons starting...')

        test_result = TestResultX()
        unittest.TestCase.run( self, test_result )

        print( '# ...spoons ended, tr %s' % ( test_result,  ) )

unittest.main()

結果是:

# spoons starting...

----------------------------------------------------------------------
Ran 0 tests in 0.015s

OK
# blip
# wotcha
# blop
# ...spoons ended, tr <__main__.TestResultX run=1 errors=0 failures=1>

問題:

  • 為什么說0 tests
  • 為什么不打印blepblap (開始和結束運行)?

更一般地說:

  1. 當涉及到TestResult,TestRunner,TestLoader等時,有人可能會指出一本很好的教程/書籍解釋“正確使用”/“良好實踐”。我得到了“TDD with Python”,但它似乎沒有解釋任何這個。

  2. 有人可能會告訴我為什么通常會使用unittest2而不是unittest?

附錄

在Omar Diab努力查看源代碼之后,我嘗試了這個:

def run( self, *args, **kvargs ):
    result = self.defaultTestResult()
    startTestRun = getattr(result, 'startTestRun', None)
    logger.info( '# calling superclass run... startTestRun? %s' % ( startTestRun, ))
    unittest.TestCase.run( self, *args, **kvargs  )
    logger.info( '# ... superclass run ended')

不幸的是,每個test_XXX方法都給出了:

# calling superclass run... startTestRun? <bound method TestResult.startTestRun of <unittest.result.TestResult run=0 errors=0 failures=0>>

setUp for test_that_stuff_happened (__main__.xx_FT)

tearDown for test_that_stuff_happened (__main__.xx_FT)
end tearDown...
. # ... superclass run ended

哇,沒有回復。 我很驚訝。

如果您希望在運行開始和運行結束時發生事情,那么大多數人無疑可以自行解決這個問題:

子類TestCase,如下:

def setUp( self ):
    if not hasattr( unittest.TestCase, 'app' ):
        unittest.TestCase.app = MyApp()
        def shutdown_func():
            pass # do any end-of-run stuff here
        atexit.register( shutdown_func )
        pass # do any start-of-run stuff here
    self.app = unittest.TestCase.app

然后從這一個中創建所有TestCases子類......

關鍵是,如果您希望這種情況發生,您的應用程序只構建一次。 處理確保每個連續setUp “原始”的責任當然取決於你。 顯然你可以使用setUpClass但是你無法訪問TestCase實例。

我遇到了同樣的問題,所以我看了一下源代碼。

檢查unittest.TextTestRunnerunittest.TestCase ,看起來像手動調用startTestRun()stopTestRun() unittest.TextTestRunner ,它的工作原理如下:

def run(self, test):
    # ...
    startTestRun = getattr(result, 'startTestRun', None)
    if startTestRun is not None:
        startTestRun()
    # ...

在你的情況下, unittest.TestCase ,它是這樣的:

def run(self, result=None):
    orig_result = result
    if result is None:
        result = self.defaultTestResult()
        startTestRun = getattr(result, 'startTestRun', None)
        if startTestRun is not None:
            startTestRun()
    # ...

所以看起來startTestRun實際上只有在你沒有傳入result時才被TestCase.run()調用。 你傳遞了result ,所以它沒有發生。

這對我來說似乎是個錯誤! 但基本上它意味着你可以擴展TestCaseTestSuite ,重新實現run方法,然后手動調用這些方法; 或者只是在那些相應的run方法之外調用它們。

希望這可以幫助!

認為在TestCase.run()創建TestResult對象被誤解為無法訪問流,描述,詳細程度。 作為KWarg提供它的工作原理

def run( self, test_result=TestResultX ):
or create TestResult in Runner.run():

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM