模拟缺少的包进行测试?

use*_*216 5 python testing pytest

我有一个项目,其功能可能会扩展,具体取决于您所拥有的软件包。具体来说,如果您具有VTK,则具有3D图形;如果您具有PyQt,则具有GUI;如果没有PyQt,则具有一些后备。

有什么方法可以创建一个测试文件来模拟这些项目范围内不可用的软件包,以便我可以检查是否提出了正确的错误消息,警告和建议?

met*_*ter 4

我遇到过类似的情况,我开发了一个可以使用该requests库的应用程序,但它是一个可选的依赖项,所以这就是我的方法。首先有一个收集这些依赖项的模块

try:
    import requests
except ImportError:
    _has_requests = None
Run Code Online (Sandbox Code Playgroud)

对您可能需要的所有其他模块重复此操作。然后,在导入该模块时,代码可以检查 的值_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
Run Code Online (Sandbox Code Playgroud)

当然,您可能有测试与实际模块交互的代码,因此您需要使用unittest.skipIf(或者unittest2如果您使用的是 Python 2.6,则需要使用版本)。这样做是为了如果您希望在没有完整的可选依赖项列表的系统上运行这些测试,您可以正确地跳过未安装此模块的系统的测试。

@unittest.skipIf(not vendor._has_requests, '`requests` not available')
class FunctionWithRequestsTestCase(unittest.TestCase):

    def setUp(self):
        ...
Run Code Online (Sandbox Code Playgroud)