python - 测试可选包的警告

标签 python unit-testing tox

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

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

Please install optional-package to use all features

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

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

问题是我想测试一下:

  1. 当用户未安装该软件包时会显示警告
  2. 当用户确实拥有该软件包时,不会显示警告

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

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

最佳答案

这是一种测试 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)

关于python - 测试可选包的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40958580/

相关文章:

python - 传递单个值而不是列表 django

unit-testing - 如何在用 ring-mock 编写的 Clojure Web 应用程序测试中处理 session ?

java - 为多个测试类只执行一次初始化代码

python - tox 测试,使用 setup.py extra_require 作为 tox deps 源

docker - 延迟 Docker 容器运行,直到构建 tox 环境

python - tox.ini 的 Python tox 文档在哪里 [foo :bar] section inheriting from [foo]?

python - 隔离重复列值

Python 多处理和管理器

用于舍入 float 的 Python 超参数

objective-c - 信号量等待导致 AFNetworking 阻塞?