首页 > 解决方案 > 如何使用直接或间接“import greengrassdk”的文件编写单元测试

问题描述

每当导入文件import greengrasssdk时,单元测试都会失败,因为该模块greengrass_common在我的本地计算机上不存在,我无法通过 pip 安装它。

我正在使用 PyCharm 执行测试。由于相同的依赖问题(相同的异常),我尝试测试的 Greengrass lambda 不会在本地执行。但是一旦将 lambda 推到 greengrass,它就可以正常工作。

这是一个例外:

    import greengrasssdk
  File "C:\Python27\lib\site-packages\greengrasssdk\__init__.py", line 6, 
in <module>
    from .Lambda import StreamingBody
  File "C:\Python27\lib\site-packages\greengrasssdk\Lambda.py", line 10, in 
<module>
     from greengrass_common.function_arn_fields import FunctionArnFields
ImportError: No module named greengrass_common.function_arn_fields

一个简化的代码示例是这样的:

import greengrasssdk
import logging

greengrass_iot_client = greengrasssdk.client('iot-data')
logger = logging.getLogger('logger')

def handler(event, context):
    logger.info('Event handler invoked with event: ' + str(event))

我在测试中收到以下错误消息(测试被排除在测试文件夹中,但尚未显示其他依赖问题 - 我写这个是因为一些开发人员将他们的测试放入 python 代码文件。我听说那个测试在外面源代码文件可能会导致导入问题。虽然这种情况不同,因为它也发生在原始代码文件中。)

import unittest
import mock
import function

类 SimpleTest(unittest.TestCase):

# NONE OF THE THREE PATCH WORK  Not in combination nor single
@mock.patch('greengrass_common')
@mock.patch('greengrass_common.function_arn_fields')
@mock.patch('greengrasssdk')
def test_that(self):
    pass

为了简化,测试用例是空的。

我希望 greengrass_common 代码存在于 Greengrass 代码之外,以便我编写单元测试。

我来自 java 世界,但与一些 python 开发人员交谈过。我们并没有真正找到解决方案。(除了尝试在生产代码中捕获导入),但这似乎是整个项目中软件质量不佳的第一步。

我非常感谢想法/解决方案/方法和指导。

非常感谢 :)。

标签: python-2.7unit-testingmockinggreengrass

解决方案


我刚刚遇到了同样的问题,对我来说,它通过使用 try except 语句包围导入来工作。

try:
    import greengrasssdk
    client = greengrasssdk.client('iot-data')
except Exception as e:
    import boto3
    client = boto3.client('iot-data')

推荐阅读