はじめに
本記事は、自分が AWS CDK のスナップショットの学習をした際にメモした内容を、簡素にまとめた内容となります。
CDK Snapshot Test とは
スナップショットと比較して、合成された CloudFormation テンプレートに差分がないかを確認するテストになります。
また、jest
など各言語固有のテストコマンドで実行されます。
ユースケース
- CDK のバージョンアップ時にリソースに変更がでないか
- L1 → L2 へのリファクタリングなど
スナップショットの書き方
cdk init sampleapp --language typescript
でプロジェクトを作成した場合、以下のファイルを作成し、npm test
を実行することでスナップショットテストを実行することができます。
初回はスナップショットがないため、スナップショットが作成されます。2 回目からスナップショットテストが実施できます。
あと、スナップショットテストを実行すると、スナップショットテストを実行しているファイルと同じ階層に、スナップショットを格納する__snapshots__
ディレクトリが作成されます。
好みの問題ですが、test 直下に__snapshot__
があると邪魔なので、test/snapshot
ディレクトリを作成し、その配下にスナップショットテストコードを配置するのがよいのかなと思います。
import * as cdk from "aws-cdk-lib";
import { Template } from "aws-cdk-lib/assertions";
import * as CdkTest from "../../lib/sampleapp-stack";
test("Snapshot Test", () => {
const app = new cdk.App();
const stack = new CdkTest.CdkTestStack(app, "MyTestStack");
const template = Template.fromStack(stack);
expect(template.toJSON()).toMatchSnapshot();
});
スナップショットの更新方法
CDK を変更した場合(意図した差分の場合)、スナップショットを更新する必要があると思います。
その場合は、以下の-u
オプションを付与することで、スナップショットを更新することができます。
npm test -- -u
更新頻度が高いようであれば、package.json
を修正し
test
コマンドを常にスナップショットを更新するようにし、必要に応じてスナップショットテストを実施する運用もありかなと思います。
"scripts": {
"test": "jest -u",
"test:snap": "jest snapshot"
},