我如何使用unittest.TestResult?

mik*_*ent 7 python unit-testing jython

我只是在短时间内使用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()
Run Code Online (Sandbox Code Playgroud)

结果是:

# spoons starting...

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

OK
# blip
# wotcha
# blop
# ...spoons ended, tr <__main__.TestResultX run=1 errors=0 failures=1>
Run Code Online (Sandbox Code Playgroud)

问题:

  • 为什么这么说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')
Run Code Online (Sandbox Code Playgroud)

不幸的是,每个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
Run Code Online (Sandbox Code Playgroud)

mik*_*ent 3

哇,没有反应。我很惊讶。

如果您希望在运行开始和运行结束时发生一些事情,那么大多数人无疑可以自己解决这个问题:

子类测试用例,如下:

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
Run Code Online (Sandbox Code Playgroud)

TestCases然后从这个子类中创建你的所有子类......

重点是,如果您希望这种情况发生,您的应用程序仅构建一次。setUp当然,确保每个连续的内容都是“原始”的责任取决于您。显然您可以使用setUpClass它,但这样您就无权访问该TestCase实例。