python-2.7 - 如何使用直接或间接“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 开发人员交谈过。我们并没有真正找到解决方案。(除了尝试在生产代码中捕获导入),但这似乎是整个项目中软件质量不佳的第一步。
我非常感谢想法/解决方案/方法和指导。
非常感谢 :)。
解决方案
我刚刚遇到了同样的问题,对我来说,它通过使用 try except 语句包围导入来工作。
try:
import greengrasssdk
client = greengrasssdk.client('iot-data')
except Exception as e:
import boto3
client = boto3.client('iot-data')
推荐阅读
- bison - 如何终止 Bison 中的无限递归序列?
- windows-10 - 我的下载文件一直在 notpead 上打开
- node.js - 使用节点通知器时 Gulp 任务挂起
- python - python3.7的点子(Ubuntu 16.04)
- excel - 用 Excel 2016 和 win 10 打开共享的 excel 文件,不显示它
- android - 自定义 ListView 包含 CheckedTextView 多选
- python - 不想要冗余并且想要使用递归
- c# - 如何将 oracle 二进制(OracleDbType.Raw)转换为 guid
- angular - Angular 7 安装引导程序
- scala - Scala中矩阵的旋转而不使用二维数组