cdk initコマンドを実行するとtestというディレクトリとjest.config.jsというファイルが作られ、Jestを使ったテスト環境が提供される。

Jestによるテストは、CDKのコードからCLoudFormationのテンプレートを生成して、期待した属性の記述の有無、リソースの数の一致などの観点でテンプレートを検査するが、観点が多すぎて網羅するのが辛い。

なので、テンプレートのスナップショットテストを行うのが良い。

スナップショットテストの利点

cdk diffコマンドで差分を確認することができるが、リソースの追加の場合、cdk diffの出力には追加されるリソースの詳細が表示されず、テンプレートを確認する必要がある。また、変更セットの作成にはAWSの認証情報が必要になる。

それに比べて、スナップショットテストは、AWSの認証情報を使わずにローカルで実行できるので、差分の詳細も確認することができる。

スナップショットテストの作成

CDKのコードを作成

Terminal window
mkdir hello-cdk && cd hello-cdk
cdk init app --language typescript
bin/hello-cdk.ts
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');
lib/hello-cdk-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// Import the Lambda module
import * 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!'),
};
};
`),
});
}
}

テストコードの作成

test/hello-cdk-stack.ts
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プロジェクトの一番上のディレクトリで次のコマンドを実行

Terminal window
npm test

初回のnpm testの実行後は、test/__snapshot__のディレクトリの下に、hello-cdk-stack.test.ts.snapというファイルが作成されており、ここにCloudFormationのテンプレートが埋め込まれている。

スナップショットが作成された状態で、再度、npm testを実行すると、CDKコードから生成されたテンプレートとスナップショットを比較するテストが実行される。

スナップショットの更新

Terminal window
npx jest -u

参考

  1. 最初の AWS CDK アプリを作成する