可选包的测试警告
Test warnings for optional packages
我的代码提供了使用可选包的可选功能。
当用户导入包含这些可选功能的包时,如果 he/she 没有安装附加包,则会显示警告。例如:
Please install optional-package
to use all features
为了测试这些可选功能,可选包作为依赖项安装在 tox
创建的 virtualenv 中:
# tox.ini
[my-env]
deps = optional-package
问题是我想测试一下:
- 当用户没有安装包时显示警告
- 警告是 不 当用户确实有包
时显示
不过,python好像没有提供卸载包的方法。
如果同时我需要 tox
将其作为依赖项自动安装,我如何创建一个测试来描述用户在其系统上没有可选包的上下文?
这是一种测试 some_module
在 optional.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)
我的代码提供了使用可选包的可选功能。
当用户导入包含这些可选功能的包时,如果 he/she 没有安装附加包,则会显示警告。例如:
Please install
optional-package
to use all features
为了测试这些可选功能,可选包作为依赖项安装在 tox
创建的 virtualenv 中:
# tox.ini
[my-env]
deps = optional-package
问题是我想测试一下:
- 当用户没有安装包时显示警告
- 警告是 不 当用户确实有包 时显示
不过,python好像没有提供卸载包的方法。
如果同时我需要 tox
将其作为依赖项自动安装,我如何创建一个测试来描述用户在其系统上没有可选包的上下文?
这是一种测试 some_module
在 optional.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)