Python 模拟缺失的测试包?

Python 模拟缺失的测试包?,python,testing,pytest,Python,Testing,Pytest,我有一个项目,它的功能可以根据您提供的软件包进行扩展。具体来说,如果你有VTK,它有3D图形;如果你有PyQt,它有GUI;如果你没有,它有一些后退 有没有办法创建一个测试文件来模拟这些包在整个项目范围内不可用,因此,我可以检查是否提出了正确的错误消息、警告和建议?我有过类似的情况,我开发了一个应用程序,可以使用请求库,但它是可选的依赖项,因此这是我的方法。首先有一个模块收集这些依赖项 try: import requests except ImportError: _has_r

我有一个项目,它的功能可以根据您提供的软件包进行扩展。具体来说,如果你有VTK,它有3D图形;如果你有PyQt,它有GUI;如果你没有,它有一些后退


有没有办法创建一个测试文件来模拟这些包在整个项目范围内不可用,因此,我可以检查是否提出了正确的错误消息、警告和建议?

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

try:
    import requests
except ImportError:
    _has_requests = None
对可能需要的所有其他模块重复上述步骤。然后,在导入此模块时,代码可以检查
\u has\u 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
当然,您可能有测试与实际模块交互的代码,因此您需要使用(或者使用Python 2.6的版本)。这样做的目的是,如果希望在没有完整的可选依赖项列表的系统上运行这些测试,则可以正确跳过未安装此模块的系统的测试

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

    def setUp(self):
        ...

我通常采用另一种方法——在正确导入所需模块时设置可用性标志。然后在测试中,取消设置这些标志,看看函数/方法是否生成了正确的异常/错误消息。为什么你不让我接受这个答案呢?让我至少包括一些代码。你可能还想看看使用或第三方轻松构建不同的Python虚拟环境进行测试。(
virtualenv
功能更强大,
venv
直到3.3才存在,直到3.4才完全可用。)