如何测试Python中缺少特定库的情况

时间:2010-12-20 20:41:58

标签: python unit-testing import

我有一些软件包对其他软件包具有软依赖性,并且回退到默认(简单)实现。

问题是使用单元测试很难测试。我可以设置单独的虚拟环境,但这很难管理。

是否有包装或方法可以实现以下目的:

import X

像往常一样工作,但

hide_package('X')
import X

会引发ImportError。

我一直在我的代码的后备部分中出现bug,因为很难对此进行测试。

2 个答案:

答案 0 :(得分:2)

一种方法是编辑sys.path,特别是如果你的软件包安装在不同的目录/ zipfiles中(例如,如果你正在使用鸡蛋)。在导入之前,从sys.path中删除不需要的那些。

如果这不可行(因为所有组件都存在于单个sys.path条目中),您可以破解对程序包本身的抑制。例如。有一个全局变量(环境,或修补到sys模块中的东西)列出你想要失败导​​入的包:

sys.suppressed_packages=set()
sys.suppressed_packages.add('X')

然后,在每个包中,显式引发ImportError:

# X.py
import sys
if 'X' in sys.suppressed_packages:
    raise ImportError, 'X is suppressed'

当然,除了使用sys模块之外,您还可以使用hide_package函数创建自己的基础架构。

答案 1 :(得分:2)

看起来有点脏,但你可以覆盖__import__内置:

save_import = __builtin__.__import__
def my_import(name, *rest):
    if name=="hidden":
        raise ImportError, "Hidden package"
    return save_import(name, *rest)
__builtin__.__import__ = my_import
顺便说一下,你读过PEP 302吗?看来你可以用导入钩子建立一个更强大的机制。