我希望能够获得特定测试方法的结果并将其输出到拆卸方法中,同时使用鼻子测试运行器。这里有一个很好的例子。
但不幸的是,运行nosetests example.py
不起作用,因为鼻子似乎不喜欢超类中的 run 方法被覆盖的事实:
AttributeError: 'ResultProxy' object has no attribute 'wasSuccessful'
警告:以下内容在拆卸期间实际上并没有访问测试,但它确实访问了每个结果。
您可能想编写一个鼻子插件(请参阅此处的 API 文档)。您可能感兴趣的方法是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)
这个简单的示例仅报告通过和失败的数量(就像您包含的链接一样,但我相信您可以扩展它以做一些更有趣的事情(这是另一个有趣的想法)。要使用它,请确保它安装在鼻子(或将其加载到自定义运行器中),然后使用 --with-reportresults 激活它。
如果您可以在测试中添加一些样板代码,那么类似以下的内容可能会起作用。
在 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()