$30 off During Our Annual Pro Sale. View Details »

integ-testsモジュールを試す

sakurai-ryo
November 16, 2023
310

 integ-testsモジュールを試す

sakurai-ryo

November 16, 2023
Tweet

Transcript

  1. 自己紹介 🧑‍💻 名前 桜井 良 📝 普段の業務 AWS を使ったアプリ開発 コード書いたり、インフラ構築した

    り 🛠 好きなAWS サービス Amazon ECS AWS Lambda 🧑‍💻 好きなこと 野球観戦 旅行
  2. 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 にてインテグレーションテストを行うためのツール
  3. サンプルスタック 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 }
  4. テストファイル このテストでは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 });
  5. テスト実行 –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
  6. 実行結果 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
  7. アサーションを追加してみる 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();
  8. アサーション結果 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
  9. テスト実行フロー 1. スナップショットファイルが存在するか確認 (i.e. *.snapshot/**) 2. もしスナップショットが存在しない場合 Synth を実行し、 integ.json

    を生成(初回) 3. integ.json ファイルからどのようにテストを行うかを読み取る 4. インテグレーションテストの実行 こちらより引用 ドキュメントをざっくり日本語訳すると ` ` ` `
  10. 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 } ` `
  11. Assertion Stack Lambda-backed カスタムリソース フローの起点となる Create やUpdate Event でフローを開始する AWS

    SDK を利用したリクエストやHTTP リクエストを送信する レスポンスに対するアサーションを行う アサーションを記述している場合、以下のリソースが作成される
  12. (以下は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 });
  13. デプロイと削除のフロー 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 終了