Node.js 如何在测试中获取serverless.yml中定义的环境变量
我使用无服务器框架在AWS上运行lambda函数 在myNode.js 如何在测试中获取serverless.yml中定义的环境变量,node.js,integration-testing,jestjs,serverless-framework,Node.js,Integration Testing,Jestjs,Serverless Framework,我使用无服务器框架在AWS上运行lambda函数 在myserverless.yml中,有一些从SSM获取的环境变量 当我为代码编写集成测试时,我需要代码包含环境变量,但我找不到一个好的方法来实现这一点 我不想只为测试复制所有变量定义,它们已经在serverless.yml中定义了。另外,有些是秘密,我无法将它们提交给源代码控制,因此我还必须在ci环境中重复它们 尝试使用serverless jest插件,但该插件不起作用且维护不好 我对解决方案的想法: 使tests execsls invok
serverless.yml
中,有一些从SSM获取的环境变量
当我为代码编写集成测试时,我需要代码包含环境变量,但我找不到一个好的方法来实现这一点
我不想只为测试复制所有变量定义,它们已经在serverless.yml中定义了。另外,有些是秘密,我无法将它们提交给源代码控制,因此我还必须在ci环境中重复它们
尝试使用serverless jest插件
,但该插件不起作用且维护不好
我对解决方案的想法:
sls invoke
-这将起作用,但意味着代码无法调试,我不知道测试覆盖率,而且速度会很慢serverless.yml
并导出env变量-这是可能的,但重写仅为测试而提取SSM变量的逻辑似乎是错误的有什么想法吗?您是想做模拟单元测试,还是更像集成测试 在第一种情况下,环境变量不需要实际值。模拟数据库,或任何需要设置环境变量的内容。这实际上是更好的方法,因为测试将在适当的模拟下超快速运行 如果您实际上希望采用端到端/集成的方法,那么您可以使用javascript执行类似于
sls invoke
的操作。因此,就像对部署的api的常规网络调用一样
另外,我建议不要将密钥存储在
serverless.yml
中。请改用secret:${env:MY_secret}
语法(),并改用环境变量。如果您有一个ci/cd构建服务器,您可以在那里存储您的机密。我们最终使用的解决方案是一个名为的无服务器插件
添加此插件后,您可以运行serverless export env
将所有解析的环境变量导出到.env
文件中。这将正确解析ssm参数,并使集成测试对我们来说更加简单
顺便说一句,要从.env
文件中获取环境变量集,请使用npm包
由于找到了解决方案,您可以使用
--require
选项运行节点,将.env
文件注入到无服务器命令中
package.json
在项目根目录下创建.env
,并在.env
中列出变量李>
添加-D serverless dotenv
在项目中安装serverless和dotenvnode-r dotenv/config./node\u modules/.bin/sls invoke的命令
然后,您可以在处理程序
process.env.XXX
中获取环境变量,我正在寻找集成测试的解决方案。更新问题以澄清。谢天谢地,我的主要目标是获取无服务器知道如何解析的环境变量,而无需显式定义它们。例如,如果我有一个来自AWS SSM或S3文件之类的配置,serverless知道如何解决这些问题。我不想在.env文件中再次显式定义它们