cdk initコマンドを実行するとtestというディレクトリとjest.config.jsというファイルが作られ、Jestを使ったテスト環境が提供される。
Jestによるテストは、CDKのコードからCLoudFormationのテンプレートを生成して、期待した属性の記述の有無、リソースの数の一致などの観点でテンプレートを検査するが、観点が多すぎて網羅するのが辛い。
なので、テンプレートのスナップショットテストを行うのが良い。
スナップショットテストの利点
- コードのリファクタリングやCDKのバージョンアップによる影響がないことの確認
- CDKのコードから生成されるテンプレートはその変化を把握できる
- テストのメンテナンスの手間が少ない
cdk diffコマンドで差分を確認することができるが、リソースの追加の場合、cdk diffの出力には追加されるリソースの詳細が表示されず、テンプレートを確認する必要がある。また、変更セットの作成にはAWSの認証情報が必要になる。
それに比べて、スナップショットテストは、AWSの認証情報を使わずにローカルで実行できるので、差分の詳細も確認することができる。
スナップショットテストの作成
CDKのコードを作成
mkdir hello-cdk && cd hello-cdkcdk init app --language typescript
import 'source-map-support/register';import * as cdk from 'aws-cdk-lib';import { HelloCdkStack } from '../lib/hello-cdk-stack';
const app = new cdk.App();new HelloCdkStack(app, 'HelloCdkStack');
import * as cdk from 'aws-cdk-lib';import { Construct } from 'constructs';// Import the Lambda moduleimport * as lambda from 'aws-cdk-lib/aws-lambda';
export class HelloCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props);
// Define the Lambda function resource const myFunction = new lambda.Function(this, "HelloWorldFunction", { runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), }); }}
テストコードの作成
import * as cdk from 'aws-cdk-lib'import { Template } from 'aws-cdk-lib/assertions'
describe('HelloCdkStack', () => { const app = new cdk.App(); const stack = new cdk.Stack(app, 'HelloCdkStack'); const template = Template.fromStack(stack).toJSON();
it('should match the snapshot', () => { expect(template).toMatchSnapshot(); });});
複数の環境が存在しても、describe.each()
で環境ごとに実施するテストを記述できる。
スナップショットを出力するメソッドとして、toMatchSnapshot()
の代わりにtoMatchSpecificSnapshot()
を
使用することで、環境ごと、スタックごとにスナップショットが出力されるので、差分がわかりやすくなる。
スナップショットテストの実行
CDKプロジェクトの一番上のディレクトリで次のコマンドを実行
npm test
初回のnpm test
の実行後は、test/__snapshot__
のディレクトリの下に、hello-cdk-stack.test.ts.snap
というファイルが作成されており、ここにCloudFormationのテンプレートが埋め込まれている。
スナップショットが作成された状態で、再度、npm test
を実行すると、CDKコードから生成されたテンプレートとスナップショットを比較するテストが実行される。
スナップショットの更新
npx jest -u