Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
integ-testsモジュールを試す
Search
sakurai-ryo
November 16, 2023
420
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
integ-testsモジュールを試す
sakurai-ryo
November 16, 2023
More Decks by sakurai-ryo
See All by sakurai-ryo
App Staging Synthesizerに入門する
ryosakurai
0
1.9k
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
330
We Have a Design System, Now What?
morganepeng
55
8.2k
Documentation Writing (for coders)
carmenintech
77
5.4k
Fireside Chat
paigeccino
42
4k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Navigating Team Friction
lara
192
16k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
260
Producing Creativity
orderedlist
PRO
348
40k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Transcript
integ-tests モジュールを試す sakurai-ryo 2023/11/16
自己紹介 🧑💻 名前 桜井 良 📝 普段の業務 AWS を使ったアプリ開発 コード書いたり、インフラ構築した
り 🛠 好きなAWS サービス Amazon ECS AWS Lambda 🧑💻 好きなこと 野球観戦 旅行
発表内容 integ-tests モジュールの紹介 概要 どのように記述するか 内部的にどのような動きになっているか
integ-tests モジュールって?
integ-tests モジュールって? インテグレーションテストの自動化 リソースのデプロイ・削除を裏側で行う 実際にAWS リソースのデプロイを行う点で、既存のCFn テンプレートに対するアサーションテストと大き く異なる テスト対象のリソース呼び出し HTTP
リクエストの送信 Lambda 関数の実行 AWS SDK の呼び出し アサーション リソースを呼び出し、期待した結果かを確認 * まだalpha 版なので注意 https://docs.aws.amazon.com/cdk/api/v2/docs/integ-tests-alpha-readme.html integ-tests はAWS CDK にてインテグレーションテストを行うためのツール
どのような感じで書くか
サンプルスタック SQS を1 つ作成するシンプルなスタック構成 SQS を作成するこのようなスタックがあるとする 1 class StackUnderTest extends
Stack { 2 public readonly queueUrl: string; 3 4 constructor(scope: Construct, id: string, props: StackProps) { 5 super(scope, id, props); 6 7 const queue = new Queue(this, "SampleQueue", { 8 enforceSSL: true, 9 visibilityTimeout: Duration.minutes(1), 10 }); 11 this.queueUrl = queue.queueUrl; 12 } 13 }
テストファイル このテストではSQS が正常に作成出来ることを確認 インテグレーションテストは以下のように記述出来る 1 // `test/integ.sqs-stack.ts` 2 3 import
{ App } from "aws-cdk-lib"; 4 import { IntegTest } from "@aws-cdk/integ-tests-alpha"; 5 import { StackUnderTest } from 'construct のパス'; 6 7 const app = new App(); 8 9 // テストケースの作成 10 new IntegTest(app, "SQSDeploymentTest", { 11 // テスト対象のスタックをテストケースとして登録 12 testCases: [new StackUnderTest(app, "SQSStack", {})], 13 });
テスト実行 –directory (default: test ) テスト対象のファイルがあるディレクトリを指定 –clean (default: true) テスト終了後にスタックを削除
–parallel-regions (default: us-east-1,us-east-2,us-west-2) リソースのデプロイを行うリージョンを指定 今回は東京リージョを指定 –update-on-failed (default: false) integ-tests では最初にスナップショットテストを行う スナップショットテストが失敗してもインテグレーションテストを実行 integ-runner コマンドから実行することが可能 1 npx integ-runner --directory ./test --clean true --parallel-regions ap-northeast-1 --update-on-failed
実行結果 1 ❯ npx integ-runner --directory ./test --clean true --parallel-regions
ap-northeast-1 --update-on-failed 2 3 Verifying integration test snapshots... 4 5 NEW integ.sqs-stack 2.276s 6 7 Snapshot Results: 8 9 Tests: 1 failed, 1 total 10 Failed: /hoge/test/integ.sqs-stack.ts 11 12 Running integration tests for failed tests... 13 14 Running in parallel across regions: ap-northeast-1 15 Running test /hoge/test/integ.sqs-stack.ts in ap-northeast-1 16 SUCCESS integ.sqs-stack-SQSDeploymentTest/DefaultTest 93.942s 17 NO ASSERTIONS 18 19 Test Results: 20 21 Tests: 1 passed, 1 total
アサーションを追加してみる 1 const app = new App(); 2 // テスト対象のスタック作成
3 const sqsStack = new StackUnderTest(app, "SQSStack", {}); 4 // テストケース作成 5 const integ = new IntegTest(app, "SQSDeploymentTest", { 6 testCases: [sqsStack], 7 }); 8 9 integ.assertions 10 // SDK を利用してSQS にメッセージを送信 11 .awsApiCall("SQS", "sendMessage", { 12 QueueUrl: sqsStack.queueUrl, 13 MessageBody: "hello", 14 }) 15 // sendMessage のレスポンスを検証 16 .expect( 17 ExpectedResult.objectLike({ 18 MD5OfMessageBody: "5d41402abc4b2a76b9719d911017c592", 19 }), 20 ) 21 .waitForAssertions();
アサーション結果 1 ❯ npx integ-runner --update-on-failed --parallel-regions ap-northeast-1 2 3
Verifying integration test snapshots... 4 5 CHANGED integ.sqs-stack 4.204s 6 Outputs 7 [+] Output ExportsOutputRefSampleQueue49AAAEFF510AD68E: {"Value":{"Ref":"SampleQueue49AAAEFF"},"Export":{"Name":"S 8 9 Snapshot Results: 10 11 Tests: 1 failed, 1 total 12 Failed: /hoge/test/integ.sqs-stack.ts 13 14 Running integration tests for failed tests... 15 16 Running in parallel across regions: ap-northeast-1 17 Running test /hoge/test/integ.sqs-stack.ts in ap-northeast-1 18 SUCCESS integ.sqs-stack-SQSDeploymentTest/DefaultTest 260.051s 19 AssertionResultsAwsApiCallSQSsendMessage3be1a530f8eb6cc241ca25ab2e9f051c - success 20 21 Test Results: 22 23 Tests: 1 passed, 1 total
参考資料 AWS ブログ 基本的なテストの書き方からtips までとても勉強になります integ-tests モジュールのドキュメント integ-runner のREADME
内部の動きを追ってみる
テスト実行フロー 1. スナップショットファイルが存在するか確認 (i.e. *.snapshot/**) 2. もしスナップショットが存在しない場合 Synth を実行し、 integ.json
を生成(初回) 3. integ.json ファイルからどのようにテストを行うかを読み取る 4. インテグレーションテストの実行 こちらより引用 ドキュメントをざっくり日本語訳すると ` ` ` `
実行時のポイント integ.json にはどういった内容が書かれているか インテグレーションテストはスタックを作成と削除をどういったフローで行うか 以下のポイントを押さえてinteg-tests のフローを確認する ` `
integ.json テストケースと対象のスタックなどの情報が記載 SQSDeploymentTestDefaultTestDeployAssertCC92D64C このスタック名でアサーションに利用するリソースがデプロイされる integ.json ファイルには以下の内容が書かれている ` ` 1 {
2 "version": "35.0.0", 3 "testCases": { 4 "SQSDeploymentTest/DefaultTest": { 5 "stacks": [ 6 "SQSStack" 7 ], 8 "assertionStack": "SQSDeploymentTest/DefaultTest/DeployAssert", 9 "assertionStackName": "SQSDeploymentTestDefaultTestDeployAssertCC92D64C" 10 } 11 } 12 } ` `
どんなリソースが作成されるか
Assertion Stack Lambda-backed カスタムリソース フローの起点となる Create やUpdate Event でフローを開始する AWS
SDK を利用したリクエストやHTTP リクエストを送信する レスポンスに対するアサーションを行う アサーションを記述している場合、以下のリソースが作成される
(以下はwaitForAssertions を指定してる場合に追加で 作成) Step Functions State Machine Lambda 関数の実行とエラーハンドリングを行う Lambda-backed
カスタムリソースに呼び出される Lambda 関数 AWS SDK を利用したリクエストやHTTP リクエス トを送信する レスポンスに対するアサーションを行う 1 // この設定内容がState Machine に反映される 2 .waitForAssertions({ 3 totalTimeout: Duration.minutes(5), 4 interval: Duration.seconds(30), 5 backoffRate: 10, 6 });
デプロイと削除のフロー Update Workflow 既存のスナップショットをデプロイした後、変更内 容のデプロイを行う 破壊的変更などの検知も行える --disable-update-workflow オプションで無効 化 デフォルトで有効
https://github.com/aws/aws- cdk/tree/main/packages/%40aws-cdk/integ- runner#update-workflow ` ` update workflow が有効な場合 Assertion を指定 Assertion の指定無し 既存のスナップショットをデプロイ 変更後のリソースをデプロイ Assertion 終了
まとめ integ-tests モジュールはAWS 環境でインテグレーションテストを実行できる便利モジュール 実際にデプロイを行い、アサーションを記述できる デプロイから削除まで面倒を見てくれる 既存のテストとは違い実環境での動作を検証することが可能 ただテストには時間がかかるのでテストケースは増やしすぎない ぜひinteg-tests を活用してより安全なデプロイを!
ご清聴ありがとうございました