【问题标题】:Test warnings for optional packages可选包的测试警告
【发布时间】:2016-12-04 12:23:33
【问题描述】:

我的代码提供了使用可选包的可选功能。

当用户导入包含这些可选功能的包时,如果他/她没有安装附加包,则会显示警告。例如:

请安装optional-package 以使用所有功能

为了测试这些可选功能,可选包作为依赖安装在 tox 创建的 virtualenv 中:

# tox.ini
[my-env]
deps = optional-package

问题是我想测试一下:

  1. 当用户未安装软件包时会显示警告
  2. 当用户有包时显示警告

但是,python 似乎没有提供卸载包的方法。

如果同时我需要tox 将其作为依赖项自动安装,我如何创建一个测试来描述用户在其系统上没有可选包的上下文?

【问题讨论】:

  • 您可以设置sys.modules["optional.package"] = None强制后续导入模块失败,并使用imp.reload()重新导入应该警告的模块。

标签: python unit-testing tox


【解决方案1】:

这是测试some_moduleoptional.package 不可用时引发警告的一种方法:

import some_module

# ...

    @mock.patch.dict("sys.modules", {"optional.package": None})
    def test_warning_optional_package_not_installed(self):
        with self.assertWarns(SomeWarning):
            imp.reload(some_module)

或者,您可以在 tox.ini 文件中定义多个测试环境,包括或不包括可选包。你可以配置 tox 设置环境变量,具体取决于是否安装了包:

[tox]
envlist = {with,without}_optional

[testenv]
basepython = python3.5
deps =
    required-package
    with_optional: optional-package
setenv = 
    with_optional: OPTIONAL_PACKAGE_AVAILABLE = true
commands = python -m unittest tests

然后您可以根据环境变量的值启用和禁用测试:

@unittest.skipUnless(os.env["OPTIONAL_PACKAGE_AVAILABLE"] == "true")
def test_no_warning_optional_package(self):
    with warnings.catch_warnings(record=True) as w:
        imp.reload(some_module)
    self.assertFalse(w)

【讨论】:

  • 假设我创建了另一个不使用可选包的tox 环境。我如何知道我的测试是在一个环境中还是在另一个环境中成功?我想确保警告仅在我使用没有可选包的环境时显示,并且在其他环境中不显示。如果我使用try/catch 捕获ImportError 异常,我只会看到测试在两种情况下都成功,但这不会告诉我正在测试两种行为中的哪一种。我说的对吗?
  • 当使用不同的毒物环境时,您必须让您的测试检测它们所处的环境并相应地启用和禁用测试。如何执行此操作的详细信息取决于您使用的测试运行器和单元测试环境(py.test、nose、unittest2 等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2012-03-14
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
相关资源
最近更新 更多