我们如何对 AWS CDK 代码进行单元测试?我们应该吗?
How do we do Unit testing for AWS CDK code? And should we?
根据我看到的示例,代码断言是预期的 json cf 模板与 cdk synth 生成的模板。
我们如何设置预期的 json cf 模板?
- 如果我们手动创建它,那就违背了使用cdk的目的。
- 如果我们只是复制粘贴 cdk synth 输出,那将违背对其进行单元测试的目的。
话虽如此,对 CDK 代码进行单元测试是否有目的?
也许我在这里错过了这个想法。请务必指出。
我使用的一种方法是创建一个不同的项目,委托使用我期望已创建的资源。
因此,在 cdk-init-cluster
项目中,我使用 cdk
库简单地创建了所有必要的资源。然后,在 DEPLOY 阶段之后,我 运行 委托给 populate/query/use 的 cdk-init-cluster-test
模块先前从 cdk-init-cluster
项目创建的资源。
这种方法只能帮助少数类型的资源,例如:
- S3 存储桶
- 拉姆达
- AppSync
- DynamoDB table
测试项目负责人:
- 填充 DynamoDB table 并检索数据。
- 使用虚拟数据调用 Lambda 函数
- 使用正确的数据调用 lambda 函数以验证权限行为
- 调用 appsync(包装上面的所有资源)并验证结果
然后,我删除插入的数据进行测试。如果没有异常,则测试通过。
aws-cdk
有一个测试实用程序库,可用于对堆栈进行断言。 cdk repo 将它本身用于很多自己的单元测试。
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'
}));
});
目前仅支持用 typescript 编写的 CDK 应用程序,但计划最终支持 cdk 支持的所有语言。
你是否应该这样做通常类似于询问你是否应该对任何代码库进行单元测试。如果你有很多复杂的业务逻辑发生,比如有条件地创建资源或以其他方式改变你的应用程序行为,那么可能值得在这些地方进行一些报道。如果您的应用本质上是一堆没有条件、循环等的静态声明,也许您可以在进行更改和手动验证预期更改时仅使用 运行 cdk diff
。
如果您正在编写自定义构造以在不同的 cdk 应用程序中重复使用,那么对这些进行单元测试可能是个好主意。
一些相关文档
https://docs.aws.amazon.com/cdk/latest/guide/testing.html
根据我看到的示例,代码断言是预期的 json cf 模板与 cdk synth 生成的模板。
我们如何设置预期的 json cf 模板?
- 如果我们手动创建它,那就违背了使用cdk的目的。
- 如果我们只是复制粘贴 cdk synth 输出,那将违背对其进行单元测试的目的。
话虽如此,对 CDK 代码进行单元测试是否有目的? 也许我在这里错过了这个想法。请务必指出。
我使用的一种方法是创建一个不同的项目,委托使用我期望已创建的资源。
因此,在 cdk-init-cluster
项目中,我使用 cdk
库简单地创建了所有必要的资源。然后,在 DEPLOY 阶段之后,我 运行 委托给 populate/query/use 的 cdk-init-cluster-test
模块先前从 cdk-init-cluster
项目创建的资源。
这种方法只能帮助少数类型的资源,例如:
- S3 存储桶
- 拉姆达
- AppSync
- DynamoDB table
测试项目负责人:
- 填充 DynamoDB table 并检索数据。
- 使用虚拟数据调用 Lambda 函数
- 使用正确的数据调用 lambda 函数以验证权限行为
- 调用 appsync(包装上面的所有资源)并验证结果
然后,我删除插入的数据进行测试。如果没有异常,则测试通过。
aws-cdk
有一个测试实用程序库,可用于对堆栈进行断言。 cdk repo 将它本身用于很多自己的单元测试。
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'
}));
});
目前仅支持用 typescript 编写的 CDK 应用程序,但计划最终支持 cdk 支持的所有语言。
你是否应该这样做通常类似于询问你是否应该对任何代码库进行单元测试。如果你有很多复杂的业务逻辑发生,比如有条件地创建资源或以其他方式改变你的应用程序行为,那么可能值得在这些地方进行一些报道。如果您的应用本质上是一堆没有条件、循环等的静态声明,也许您可以在进行更改和手动验证预期更改时仅使用 运行 cdk diff
。
如果您正在编写自定义构造以在不同的 cdk 应用程序中重复使用,那么对这些进行单元测试可能是个好主意。
一些相关文档 https://docs.aws.amazon.com/cdk/latest/guide/testing.html