暂时禁用单个 Python 单元测试

Posted

技术标签:

【中文标题】暂时禁用单个 Python 单元测试【英文标题】:Disable individual Python unit tests temporarily 【发布时间】:2011-01-05 04:59:59 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以使用装饰器来禁用可以包装函数的测试,并阻止 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++ 测试框架。包括。 the Stack Overflow tag.【参考方案2】:

The latest version (2.7 - unreleased) supports test skipping/disabling like so。您可以获取此模块并在现有的 Python 安装中使用它。它可能会起作用。

在此之前,我曾经将想要跳过的测试从 test_testname 重命名为 xtest_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,我认为这不会改变:/,但这是一个解决方案,谢谢 你可以稍微调整你的编辑器,给你一个宏来启用/禁用一个测试用例,但我是以 Emacs 用户的身份发言,所以...... :) 我也是Emacs用户,你做了宏吗? 不。我只是让他们失败,但这并不难。不过,我已经快速更新了答案。 这个接受的答案不是答案,只是一个链接。真实的,当前的答案也不是投票最多的答案。诚然,它已经 4 岁了。无缘无故的省略只是混淆了。【参考方案3】:

关注问题的“暂时禁用”部分,最佳答案在某种程度上取决于用例。把我带到这里的用例是我正在对一个功能进行测试驱动开发。在这个过程中,我陆续编写测试,并经常在函数中使用断点进行调试。如果我每次运行测试运行程序时都运行所有测试,我最终会在已经工作的测试的断点处停止。添加“跳过”或修改测试名称或类似的东西不是我想要的,因为当我完成编写函数时,我希望所有测试都运行。如果我使用“跳过”,我将不得不返回并“取消跳过”。

对于我的用例,解决方案在于测试运行器,而不是测试代码。我使用pytest。使用 pytest,很容易从命令行指定单个测试:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(用您的值替换大写字母)。

我知道这个问题是针对 python-unitest 的。我已经很长时间没有使用它了。如果它有类似于 pytest 的东西,我不会感到惊讶。如果没有,您可以轻松切换到 pytest。您无需修改​​代码。只需安装它并更改您的测试运行程序命令。

另外,我使用 PyCharm Pro。在显示我的测试代码的页面上,每个测试的 def 旁边都有一个小图标。我可以单击该图标并单独运行该测试。

【讨论】:

这是正确的想法,但用例可能是排除一个(或几个)测试用例,而不是只运行一个。 The -k option can be used from the command line 抑制单个(或可能是几个)测试。 还是只适用于 Pytest? unittest 实际上是 have the -k option(从 3.7 版开始)。 但它可能不支持“not”和“or”修饰符(?)。【参考方案4】:

只需在测试上方放置@unittest.SkipTest 装饰器就足够了。

【讨论】:

我不知道是谁干的。但是,我正在阅读文档,它说 SkipTest 是一个例外。无论如何,它与 unittest.skip 的不同之处在于,skip 从不执行测试(使其禁用),而如果在测试执行时发生意外情况,则将引发 SkipTest 目的。我对吗?有趣的强硬。 unittest.skip(没有理由)在 Python 2 中给了我错误,但在 Python 3 中没有。【参考方案5】:

可以使用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.')

有关其他选项,请参阅Skipping tests and expected failures 的文档。

【讨论】:

在 Python 3 中,Akif 在@unittest.SkipTest 下面的回答有效,而不是@unittest.skip 我使用的是 Python 3.6.1,@unittest.skip 也可以正常工作。 @Pete,在 Python 3.4.0 中,@unittest.skip 不起作用。 如何防止子类被跳过? 注解只会应用于单个测试方法。您是否打算拥有一个带有测试方法的父类,并且只有一些子类禁用了该方法?我想这是可能的,尽管您可能需要适当地设计父/子类。你能用一个玩具例子说明你试图解决的场景吗?【参考方案6】:

我只是用下划线重命名测试用例方法:test_myfunc 变为 _test_myfunc。

【讨论】:

【参考方案7】:

2.1 的docs 没有指定忽略或跳过方法。

不过,通常我会在需要时屏蔽评论。

【讨论】:

以上是关于暂时禁用单个 Python 单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python Django 中运行单元测试时禁用日志记录?

Python接口自动化之unittest单元测试

python 在Python中禁用Internet。使用py.test钩子。 (禁用socket.socket。)GREAT用于单元测试。

在 Play 2.4 scala 中禁用单个测试

在 SwiftUI 单元测试中禁用模拟器

Python单元测试PyUnit框架轻度整改