AWS Lambda上的Unittest

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办?

b.b*_*4rd 8

不知道有多少人知道在大多数情况下你甚至不需要第三方库来存根boto3调用.Botocore提供stubber开箱即用的参考

此类将允许您存根请求,因此您不必命中端点来编写测试.回复率先退回,先退出.如果无序调用操作,或者在没有剩余排队响应的情况下调用操作,则会引发错误.


one*_*ing 6

如果您放入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)


Jua*_*ego 1

好吧,让我们尝试将问题分为两部分:单元测试和集成测试(或整个应用程序)。如果您在本地项目中工作,使用虚拟环境,管理依赖项并使用您最喜欢的 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

祝你好运!