如何在测试中获取在serverless.yml中定义的环境变量

时间:2018-11-09 20:15:04

标签: node.js integration-testing jestjs serverless-framework

我正在使用无服务器框架在AWS上运行lambda函数。

在我的serverless.yml中,有一些从SSM中获取的环境变量。

当我为代码编写集成测试时,我需要代码具有环境变量,而我找不到找到这种方法的好方法。

我不想为测试重复所有的变量定义,它们已经在serverless.yml中定义。另外,有些是机密,我无法将其提交给来源控制,因此我还必须在ci环境中重复这些机密。

尝试使用serverless-jest-plugin,但是它无法正常工作并且维护得不好。

解决方案的想法:

  1. 让测试执行程序sls invoke-可以执行,但是这意味着代码无法调试,我不知道测试范围,而且速度很慢。
  2. 我自己解析serverless.yml并导出env变量-可能,但是重写仅用于测试的提取SSM变量的逻辑似乎是错误的。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我们最终使用的解决方案是一个名为serverless-export-env的无服务器插件。

添加此插件后,您可以运行serverless export-env将所有已解析的环境变量导出到.env文件中。这样可以正确解析ssm参数,并为我们简化了集成测试。

顺便说一句,要使用dotenv npm软件包从.env文件中获取设置的环境变量。

grishezz致谢以找到解决方法

答案 1 :(得分:0)

您要进行模拟单元测试,还是进行集成测试?

在第一种情况下,环境变量不需要实际值。模拟您的数据库,或者需要设置环境变量的任何东西。实际上,这是更可取的方法,因为使用适当的模拟程序,测试将超级快速地运行。

如果您实际上希望采用端到端/集成的方法,那么您会做类似sls invoke的事情,但只是出于对Java脚本的兴趣。因此,就像对您已部署的api进行常规网络调用一样。

此外,我建议不要将密钥存储在serverless.yml中。尝试使用secret: ${env:MY_SECRET}语法(https://serverless.com/framework/docs/providers/aws/guide/variables#referencing-environment-variables),然后使用环境变量。如果您有ci / cd构建服务器,则可以在其中存储您的机密。

答案 2 :(得分:0)

您可以使用带有--require选项的节点将.env文件注入到无服务器命令中。

  1. 使用.env在项目根目录下创建package.json,并在.env中列出变量。
  2. 通过yarn add -D serverless dotenv在项目中安装无服务器和dotenv。
  3. 运行类似node -r dotenv/config ./node_modules/.bin/sls invoke的命令。

然后,您可以在处理程序process.env.XXX中获取环境变量。