gpt4 book ai didi

python - 如何使用unittest.TestResult?

转载 作者:行者123 更新时间:2023-12-02 01:18:42 26 4
gpt4 key购买 nike

我只使用了很短一段时间的单元测试。我正在使用 Jython 2.7.10“最终版本”

在解释 TestResult 的 Python 2.7 文档中,它说:

The following methods of the TestResult class are used to maintain the internal data structures, and may be extended in subclasses to support additional reporting requirements. This is particularly useful in building tools which support interactive reporting while tests are being run.

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 个测试
  • 为什么不打印 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

最佳答案

我也遇到了同样的问题,所以我看了一下源代码。

检查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()
# ...

所以看起来,如果您不传入 resultstartTestRun 实际上只会被 TestCase.run() 调用。您正在传递结果,因此它不会发生。

这对我来说似乎是一个错误!但基本上这意味着您可以扩展 TestCase 或 TestSuite,重新实现 run 方法,然后手动调用这些方法;或者只是在相应的 run 方法之外调用它们。

希望这有帮助!

关于python - 如何使用unittest.TestResult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32920025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com