模拟缺失包进行测试?
我有一个项目,它的功能可以根据你安装了哪些软件包来扩展。具体来说,如果你有VTK这个软件包,它就可以显示3D图形;如果你有PyQt,它就会有一个图形用户界面(GUI);如果你没有这些软件包,它也会有一些备用方案。
有没有办法创建一个测试文件,让整个项目都模拟这些软件包不可用的情况,这样我就可以检查是否会出现正确的错误信息、警告和建议呢?
1 个回答
4
我遇到过类似的情况,我开发了一个应用程序,可以使用requests
这个库,但它并不是必须的依赖,所以我采取了这样的做法。首先,创建一个模块来收集这些依赖。
try:
import requests
except ImportError:
_has_requests = None
对你可能需要的其他模块也重复这个过程。然后在导入这个模块时,代码可以检查_has_requests
(以及类似的变量)的值,并生成相应的日志信息。至于测试用例,它看起来会像这样:
from ... import vendor
class FunctionTestCase(unittest.TestCase):
def setUp(self):
self._has_requests = vendor._has_requests
vendor._has_requests = False
def tearDown(self):
vendor._has_requests = self._has_requests
当然,你可能有代码需要测试与实际模块的交互,所以你需要使用unittest.skipIf
(如果你使用的是Python 2.6,可以用unittest2
版本)。这样做是为了让你能够正确跳过那些没有安装这个模块的系统的测试,如果你想在没有完整可选依赖列表的系统上运行这些测试的话。
@unittest.skipIf(not vendor._has_requests, '`requests` not available')
class FunctionWithRequestsTestCase(unittest.TestCase):
def setUp(self):
...