获取Python的nosetests会产生一个tearDown()方法

Raf*_*ael 10 python nose

我希望能够获得特定测试方法的结果并将其输出到拆解方法中,同时使用鼻子测试运行器.有一个很好的例子在这里.

但不幸的是,运行nosetests example.py不起作用,因为鼻子似乎不喜欢超类中的run方法被覆盖的事实:

AttributeError: 'ResultProxy' object has no attribute 'wasSuccessful'
Run Code Online (Sandbox Code Playgroud)

dbn*_*dbn 5

警告:以下实际上并没有在tearDown期间访问测试,但它确实访问了每个结果.

您可能想编写一个nose插件(请参阅此处的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)
Run Code Online (Sandbox Code Playgroud)

这个简单的例子只报告通过和失败的次数(比如你所包含的链接,但我相信你可以扩展它来做一些更有趣的事情(这是另一个有趣的想法).要使用它,请确保它已安装在鼻子(或将其加载到自定义运行器中),然后使用--with-reportresults激活它.


War*_*ser -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()
Run Code Online (Sandbox Code Playgroud)