我们如何对AWS CDK代码进行单元测试?我们应该吗?

时间:2020-02-14 11:41:16

标签: amazon-web-services amazon-cloudformation aws-cdk

根据我看到的示例,代码断言应该是json cf模板,而不是cdk合成器生成的模板。

我们如何设置预期的json cf模板?

  • 如果我们手动创建它,则会违反使用cdk的目的。
  • 如果我们仅复制粘贴cdk合成器输出,那将无法对其进行单元测试。

话虽如此,对CDK代码进行单元测试是否有目的? 也许我在这里想不通。请指出来。

2 个答案:

答案 0 :(得分:6)

aws-cdk有一个测试实用程序库,可用于对堆栈进行断言。 cdk存储库将其自身用于许多自身的单元测试。

https://www.npmjs.com/package/@aws-cdk/assert

这允许您做类似的事情

// jest
test('configurable retention period cannot exceed 14 days', () => {
  const stack = new MyStack();
  expect(stack).to(haveResource('AWS::SomeService::SomeResource', {
    SomePropertyOnResource: 'some-value-it-should-have'
  }));
});

到目前为止,仅支持使用打字稿编写的CDK应用程序支持此功能,但计划最终支持cdk支持的所有语言。

通常,是否应该执行此操作类似于询问是否应对任何代码库进行单元测试。如果您发生了很多复杂的业务逻辑,例如有条件地创建资源或以其他方式更改应用程序的行为,那么可能值得在这些地方获得一些介绍。如果您的应用程序本质上是一堆没有条件,循环等的静态声明,也许您可​​以在进行更改并手动验证预期更改时运行cdk diff来解决。

如果您要编写用于在不同cdk应用程序中重用的自定义结构,则对它们进行单元测试可能是个好主意。

一些相关文档 https://docs.aws.amazon.com/cdk/latest/guide/testing.html

答案 1 :(得分:0)

我使用的一种方法是创建一个不同的项目,该项目委派使用我期望已创建的资源。

因此,在cdk-init-cluster项目中,我只是使用cdk库创建了所有必要的资源。然后,在 DEPLOY 阶段之后,我运行了cdk-init-cluster-test模块,该模块被委派来填充/查询/使用以前从cdk-init-cluster创建的资源项目。

这种方法只能帮助一些类型的资源,例如:

  • S3存储桶
  • Lambda
  • AppSync
  • DynamoDB表

测试项目负责:

  • 填充DynamoDB表并检索数据。
  • 使用伪数据调用Lambda函数
  • 使用正确的数据调用lambda函数以验证权限行为
  • 调用appsync(包装上面的所有资源)并验证结果

然后,我删除插入的数据进行测试。如果没有异常发生,则测试通过。

相关问题