Tit*_*llo 6 python unit-testing amazon-web-services aws-lambda
我有一个我在AWS上运行的python脚本.该脚本包含lambda_handler(event, context)AWS调用的函数.现在,我想创建一个新的lambda函数,作为单元测试.典型的单元测试模式定义为:
import unittest
def my_function(a):
return a + 1
class Test(unittest.TestCase):
def test_correct(self):
self.assertEqual( my_function(1), 2)
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
在AWS中,lambda_handler(event, context)调用该函数.如何unittest_lambda_handler(event, context)进行单元测试?
所以我猜我的代码(在单元测试脚本中)应该是这样的:
import main_lambda_function
import unittest
def unittest_lambda_handler(event, context):
#what should this function do?
class MyTest(unittest.TestCase):
def return_type(self,event, context):
self.assertTrue(isinstance(main_lambda_function.lambda_handler(event, context),int))
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?如果是这样,该怎么unittest_lambda_handler办?
如果您放入unittest.main()lambda 处理程序 ( unittest_lambda_handler),它将不会发现您的测试并导致该函数始终失败,因为 main() 默认情况下最终调用 sys.exit(..) (请参阅https://github.com /python/cpython/blob/master/Lib/unittest/main.py#L273)。您可以覆盖该行为,unittest.main(exit=False)但您的测试仍然不会被发现。
最简单的解决方案可能是直接执行测试。所以在你的例子中:
def unittest_lambda_handler(event, context):
unittest.TextTestRunner().run(
unittest.TestLoader().loadTestsFromTestCase(MyTest))
class MyTest(unittest.TestCase):
def return_type(self,event, context):
self.assertTrue(isinstance(
main_lambda_function.lambda_handler(event, context),int))
Run Code Online (Sandbox Code Playgroud)
好吧,让我们尝试将问题分为两部分:单元测试和集成测试(或整个应用程序)。如果您在本地项目中工作,使用虚拟环境,管理依赖项并使用您最喜欢的 IDE,那么您始终可以随时运行所有内容,这意味着如果单元测试想要验证功能add_car(car),理论上您不需要需要测试生命周期。我的意思是,调用处理程序以重定向到该功能(这将是另一个测试,例如组件测试,或者根据您的设计,集成测试)。
add_car(car)但是,如果您使用 dynamo 或 RDS(任何其他 AWS 服务)会怎样?对于这些情况以及集成和组件测试,您可以使用安慰剂: https: //github.com/garnaat/placebo。正如他们的描述所说:“模拟 boto3 调用看起来就像普通调用,但实际上根本没有任何效果”。本文中有一个非常好的示例:https://serverless.zone/unit-and-integration-testing-for-lambda-fc9510963003。还有一些其他库,例如https://github.com/spulec/moto,您可以在这里找到示例https://www.programcreek.com/python/example/105256/moto.mock_ec2
另外,看看 ClaudiaJS(我知道是 Javascript,但概念非常好)的人关于设计可测试的 Lambda 函数的建议。https://claudiajs.com/tutorials/designing-testable-lambdas.html
祝你好运!
| 归档时间: |
|
| 查看次数: |
5826 次 |
| 最近记录: |