3

实际上,我在从 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钩子方法内部引发。有任何想法吗?

4

1 回答 1

2

我认为您实际上无法阻止使用startTest钩子运行测试。nose2文档建议使用或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

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

于 2014-07-11T01:35:00.843 回答