从Nose2插件中跳过单元测试

时间:2014-07-08 18:57:41

标签: python unit-testing nose nose2

我实际上在从Nose2插件中跳过单元测试时遇到了麻烦。我能够将测试标记为跳过并在最终结果中查看原因,但测试仍然运行。只要插件处于活动状态,此示例代码基本上应该跳过任何测试。

from nose2.events import Plugin

class SkipAllTests(Plugin):
    def startTest(self, event):
        event.result.addSkip(event.test, 'skip it')
        event.handled = True

如果我调用event.test.skipTest('reason')它实际上会引发SkipTest异常,那就是测试运行时没有抓住异常,只是在startTest内部引发了异常钩法。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我认为你实际上不能阻止测试运行startTest钩子。 nose2 docs建议使用matchPathgetTestCaseNames来执行此操作。以下是使用matchPath

的工作示例
from nose2.events import Plugin

class SkipAllTests(Plugin):
    configSection = "skipper"
    commandLineSwitch = (None, 'skipper', "Skip all tests")

    def matchPath(self, event):
        event.handled = True
        return False

matchPath文档实际上明确解释了它如何用于阻止测试运行:

  

插件可以使用此挂钩来防止加载python模块   通过测试加载器或强制它们由测试加载器加载。组   event.handled为True并返回False以使加载程序跳过   模块。

使用此方法可以防止测试用例被加载。如果您希望测试实际显示在列表中被跳过,而不是根本没有显示在测试列表中,您可以使用StartTestEvent做一些小问题:

def dummy(*args, **kwargs):
    pass

class SkipAllTests(Plugin):
    configSection = "skipper"
    commandLineSwitch = (None, 'skipper', "Skip all tests")
    def startTest(self, event):
        event.test._testFunc = dummy
        event.result.addSkip(event.test, 'skip it')
        event.handled = True

在这里,我们用一个什么都不做的虚函数替换测试将要运行的实际函数。这样,当测试执行时,它会禁止操作,然后报告它被跳过。