暂时禁用单个Python单元测试

189

在使用Python的unittest模块时,如何暂时禁用单个单元测试?


1
在底层,会引发自定义异常unittest.case.SkipTest来跳过测试。 - Mandera
8个回答

343

使用unittest.skip装饰器,可以禁用单个测试方法或类。

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

如需其他选项,请参阅跳过测试和预期失败的文档


12
在Python 3中,Akif的下面的答案@unittest.SkipTest是有效的,而不是@unittest.skip - lifebalance
13
我使用的是Python 3.6.1,@unittest.skip 也可以正常工作。 - Pete
2
@Pete,在Python 3.4.0中,@unittest.skip不起作用。 - lifebalance
1
如何防止子类被跳过? - reubenjohn
对于那些说裸的@unittest.skip不起作用的人:目前不支持使用skip而没有调用它并提供原因,这样做将会导致测试被标记为成功但未运行。这个问题正在https://bugs.python.org/issue34596上进行讨论。 - Zachary Ware
显示剩余2条评论

27

您可以使用装饰器来禁用测试,该测试可以包装函数并防止googletest或Python单元测试运行测试用例。

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

输出:

testFoo has been disabled

什么是“googletest”?GoogleTest是一个C++测试框架,包括Stack Overflow标签 - Peter Mortensen

21

只需要在测试方法上方添加@unittest.SkipTest装饰器即可。


我不知道是谁做的。但是,我正在阅读文档,它说SkipTest是一个异常。无论如何,它与unittest.skip不同,因为skip从不执行测试(使其禁用),而SkipTest的目的是在测试执行时发生意外情况时引发。我是对的吗?有趣的想法。 - coelhudo
unittest.skip(无需理由)在Python 2中会报错,但在Python 3中不会。 - Akif
输出结果也有所不同。@unittest.SkipTest 是静默的,而 @unittest.skip('Reason') 会打印一个“s”而不是“.”,因此跳过的测试是可见的,不会被遗忘。 - Benny

11

最新版本(2.7-未发布)支持跳过/禁用测试,如下所示。您只需获取此模块并在现有的Python安装上使用它。它可能会有效。

在此之前,我通常将要跳过的测试重命名为xtest_testname,而不是test_testname


这里是一个快速的Elisp脚本来实现这个功能。我的Elisp已经有点生疏了,对于任何问题,我提前道歉。未经测试。

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))

+1,但是在我正在工作的整个项目中,每个人都在使用Python v2.6.2,我不认为这会改变:/,但这是一个解决方案,谢谢。 - coelhudo
你可以稍微调整一下你的编辑器,以便为你提供一个宏来启用/禁用测试用例,但我是一个Emacs用户,所以... :) - Noufal Ibrahim
我也是Emacs用户,你做了一个宏吗? - coelhudo
不,我只是让它们失败,但这并不难。我已经更新了答案,加上了一个简短的说明。 - Noufal Ibrahim
1
这个被接受的答案并不是一个答案,只是一个链接。真正的、当前的答案也不是得票最高的。当然,它已经有4年的历史了。多余的elisp只会使事情更加复杂。 - jwd630

6

我刚刚将一个测试用例方法重命名为带下划线的形式:test_myfunc 变成了 _test_myfunc。


是的,作为一个快速的解决方法,这是可行的 - 但如果你希望保持测试统计数据,你应该使用@unittest.skip属性。 - Matt
是的,作为一个快速的解决办法,这是可行的 - 但如果你希望保持测试统计数据,你应该使用@unittest.skip属性。 - undefined

2

2.1版本的文档没有指定忽略或跳过方法。

通常情况下,我会在需要时使用块注释。


2
针对问题中的“暂时禁用”部分,最佳答案有些取决于使用情况。我来这里的使用情况是我正在对一个函数进行测试驱动开发。在此过程中,我会连续编写测试,并经常在函数中使用断点进行调试。如果我每次运行测试运行器时都运行所有测试,我最终会在已经通过测试的断点处停止。添加“跳过”或修改测试名称之类的内容并不是我想要的,因为当我完成编写函数时,我希望所有测试都能运行。如果我使用“跳过”,那么我就必须返回并“取消跳过”。
对于我的使用情况,解决方案在于测试运行器,而不是测试代码。我使用 pytest。使用pytest,可以轻松指定单个测试从命令行:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(将大写字母替换为您的值)。
我知道这个问题是关于python-unitest的。我很久没有使用过了。如果它没有类似pytest的东西,我也不会感到惊讶。如果没有,你可以轻松地切换到pytest。你不需要修改你的代码,只需安装它并更改你的测试运行命令。
另外,我使用PyCharm Pro。在显示我的测试代码的页面上,每个测试的def旁边都有一个小图标。我可以点击那个图标并单独运行该测试。

这是正确的想法,但使用情况可能排除了一个(或几个)测试用例,而不是仅运行一个。 - Peter Mortensen
可以使用命令行中的-k选项来禁用单个(或几个)测试。 - Peter Mortensen
还是只适用于Pytest? - Peter Mortensen
unittest 实际上有 -k 选项(从3.7版本开始)。 - Peter Mortensen
但它可能不支持“not”和“or”修饰符。 - Peter Mortensen

0
另一种选择是触发异常unittest.SkipTest("跳过原因") 如果您想跳过整个文件而不标记要跳过的单个测试/类,这可能是相关的。只需放置即可。
import unittest

raise unittest.SkipTest()

在文件的顶部。(或在需要跳过的测试中)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接