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
450
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.2k
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
320
GitHub's CSS Performance
jonrohan
1033
470k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
930
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.2k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
760
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
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 を活用してより安全なデプロイを!
ご清聴ありがとうございました