Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
integ-testsモジュールを試す
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
sakurai-ryo
November 16, 2023
440
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
社内向け CDK Construct ライブラリの舞台裏
ryosakurai
2
3.4k
App Staging Synthesizerに入門する
ryosakurai
0
2.1k
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
570
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Raft: Consensus for Rubyists
vanstee
141
7.7k
Crafting Experiences
bethany
1
310
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
470
Build your cross-platform service in a week with App Engine
jlugia
234
19k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
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 を活用してより安全なデプロイを!
ご清聴ありがとうございました