我有一个基于nodejs的expressjs应用,我正在使用gruntjs作为任务运行器和mochajs作为测试框架进行测试。因此,我编写了组件,集成和单元测试,这些测试通过grunt test
执行,或者在我开发时直接通过mocha test/component/v1/apiX
执行,并在部署期间作为CI过程的一部分在测试VM上执行。
现在考虑将此应用程序移动到AWS Lambda又名going serverless时,我会想到有关我的测试和CI过程的以下问题(请注意,我将使用aws-serverless-express
,因此不会明确地写lambda函数):
1)如何实现通过HTTP api请求完成的组件/ e2e测试?
2)如何实现集成&单元测试只加载&测试应用程序的一部分?
3)如果任何测试失败,如何将两者都与拒绝部署的新CI流集成?
我认为问题1)主要解决了:有很多方法可以从外部测试AWS Lambdas。您可以直接从test-lambda调用lambda-to-lambda测试lambda-to-test,也可以使用来自test-lambda的HTTP通过AWS API Gateway调用lambda-to-test,如here所述。您还可以使用serverless-mocha-plugin进行本地lambda测试(如果使用serverless)。
它是2)它变得有趣:一旦你的lambda被部署,它就是一个黑盒子。您不能执行任何未明确声明为lambda接口的内容。如何保存或重新实现我现有的摩卡单元&集成测试?
相同的3):如何使CI运行所有部署测试,如果失败则拒绝部署?
这是我自己的方法:只有在TEST环境中才会使我的节点app无服务器。简单地让它作为经典节点HTTP服务工作,使所有无服务器更改都取决于环境。由于几乎不需要进行任何更改,因此这应该是可行且可维护现在,我可以像往常一样在本地运行测试,也可以使用grunt和mocha进行部署。如果我想确保无服务器版本也能正常工作,那么我仍然可以进行最终的lambda-to-lambda测试。
答案 0 :(得分:1)
你的方法听起来不错。至于3你可以让你的CI运行本地测试,部署到“dev”或“test”环境并运行lambdaTests
grunt # run grunt commands including local mocha tests
serverless deploy --stage test # deploy to test environment (serverless#1.0 syntax)
grunt lambdaTest
当lambda请求失败或返回意外值时,您需要确保lambdaTest
命令处理抛出错误的失败。