2

我正在为一个大型 Python 项目策划大量单元测试。我们使用鼻子来做我们的测试发现和执行。我有一些测试文件确实不应该在某些条件下运行。例如,也许我有一个永远不应该在 Windows 上运行的测试模块(仅在 Mac 和 Linux 上)。

以下是我使用过的一些解决方案:

  1. 使用 Nose 优秀的属性插件标记测试方法或类。
  2. 在测试方法或类上使用unittest.skipIf()
  3. 例如,使用鼻子的模式排除来跳过windows名称中的文件。

我对 1 和 2 的抱怨是这些迫使我导入模块,这至少是浪费时间,并且如果存在依赖于平台的导入,可能会导致错误。我不喜欢#3,因为我觉得它很脆弱,并且在阅读测试用例时不容易看出它会被跳过。这三个似乎都过度依赖于测试和测试运行器之间的交互,我想要一些只是在测试中的东西。

我想在测试模块的顶部执行以下操作:

"""This module should not be run on Windows"""
import platform
if platform.system() == 'Windows':
    <stop reading this module.  nothing to see here>

# do the tests.

如何告诉 Python 或 Nose 停止读取模块,但没有错误?我想我正在寻找相当于提前退货的进口商品。

4

3 回答 3

2

从模块执行中提早返回的能力之前已经提出过,但它收到了一些反对票,并且该功能没有添加到语言中。

您可以阅读邮件列表线程,但通常认为必须将模块的大部分缩进额外级别的问题并不是添加此“返回”功能的充分理由。有人说几乎所有模块中的代码都应该在函数和类中,几乎没有模块级代码会受到这个问题的影响。

于 2013-02-23T01:42:40.740 回答
2

在 Nose 和 unittest 下,SkipTest 异常被特殊处理——它不是失败。因此,以下代码将停止执​​行,并且不会向 unittest 运行器报告错误:

import unittest
import platform
if platform.system() == 'Windows':
  raise unittest.case.SkipTest("The rest of this code will not be run on Windows.")
于 2013-03-06T01:28:24.780 回答
1

ImportError你可以用那个信息加注。调用者可能会以未捕获的异常退出,解释显示该错误,但ImportError如果需要,它可以捕获。

于 2013-02-23T02:50:14.873 回答