测试可选包的警告

时间:2016-12-04 12:23:33

标签: python unit-testing tox

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

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

  

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

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

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

问题在于我想测试一下:

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

    然而,似乎python没有提供卸载包的方法。

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

1 个答案:

答案 0 :(得分: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)