著者の見解は次のとおりです。
完全なテスト環境をセットアップせずにマイクロサービスをテストしたいですか?
メインライン ブランチにプッシュする前に、変更のテストを完了したいですか?
これは、プロジェクトを遂行するときによく遭遇するジレンマです。最近、クライアント向けに新しい集約プラットフォームを構築する新しいプロジェクトを開始したとき、統合前のプロセスの実行に可能な限り多くのテストと自動化を移行したいと考えました。
私たちは、サービスの詳細な機能テストを実行し、チームが独立して運用できるようにする方法が必要であることを認識していました。これが、私たちがマイクロサービスの分離とテストのためのTest Scaffoldingを開発するきっかけとなったものです。
チャレンジ
統合環境にデプロイする前に、他のサービスとは独立してマイクロサービスへの変更をテストする必要があります。こうすることで、上位レベルの環境に変更をデプロイするときに、個々のサービスの機能的な動作ではなく、統合とトランザクション フローのテストに集中できます。
テスト対象のサービスが依存するテスト環境を指すようにすることもできますが、これにより 2 つの問題が発生する可能性があります。
-
まず、環境ユーザー間でデータが混在すると、予期しない動作が発生する可能性があります。
-
2 番目に、サービス間の呼び出しの連鎖により、遅延の問題が発生し、テストが遅くなる可能性があります。私たちは、一元的かつ完全に分離された機能テストの自動化のために、マージする前にサービスを分離する機能が必要であることにすぐに気づきました。
方法
私たちは、 Test Scaffoldingと呼ばれる概念を導入してサービスを分離することにしました。
テスト スキャフォールドの仕事は、マイクロサービスが対話する必要がある可能性のあるすべての外部サービスをシミュレートすることです。テスト スキャフォールディングは、スキャフォールディングの構築と同様の役割を果たし、マイクロサービスの対話が増加するにつれて、それらはスキャフォールディングに追加されます。各サービスには独自のスキャフォールディングがあり、サービスのマージ前に構築およびデプロイされます。
これにより、マイクロサービスに期待される依存関係が与えられ、テストを通じて入出力をきめ細かく制御できます。
このアプローチは、サービスを独自に構築し、エンジニアリング チームに初期のフィードバックを継続的に提供するためにも重要です。
マイクロサービスの基本
以下の例では AWS の用語を使用しますが、その概念はすべてのプラットフォームに適用されるはずです。
開始する前に、テスト フィクスチャと対話する機能テストの範囲を定義する方法について共通の理解を得る必要があります。
-
テストは特定のマイクロサービスの境界に限定されます。
-
デプロイされたサービスの相互作用のテストは、ジャーニー テストに該当します。
-
このプロジェクトでは、サービスCloudFormation Template (CFT)によって定義されるコンポーネントとしてマイクロサービスの境界を定義します。
マイクロサービスの最も一般的なコンポーネントは通常、API Gateway、Lambdas、Dynamo、SNS または SQS の組み合わせであり、次のような図で表すことができます。
この例では、マイクロサービス A をテストする必要があるとします。マイクロサービス A は、特定のデータ フローでマイクロサービス B および C と通信します。これらのサービスは非常に集中しているため、外部情報を確認するには他のサービスに連絡する必要があります。
マイクロサービス A はマイクロサービス B および C と通信します
B と C のインスタンスが A をテストすることを望まないため、いくつかの相互作用を分離する必要があります。
課題: A を B および C から分離する
これはまさにテスト スキャフォールディングが行うことです。これはサービス B および C に代わるもので、テストでの入力と出力の設定および管理方法を大幅に制御できます。
注意すべき点がいくつかあります。
-
サービスごとにテスト フィクスチャは 1 つだけあります。異なるサービスの異なるエンドポイントを表す場合でも、単一のテスト フィクスチャ内にさまざまな種類のインタラクションを必要なだけ追加できます。
-
マイクロサービスとテスト フィクスチャは両方とも、それぞれの CloudFormation テンプレート (CFT) によって定義されますが、同じプロジェクト リポジトリに保存されます。
使用例:
マイクロサービスの境界を定義したので、いくつかのユースケースについて説明します。
最初の例では、サービスは API リクエストを受け入れ、リクエストを処理し、SNS トピックを通じて出力を送信します。私たちのプロジェクトではこのパターンを使用して、データを正しい形式にマッピングしてから複数のサードパーティ サービスに公開するさまざまなアグリゲーター サービスに情報を送信します。
入力値が適切に処理され、SNS トピックに出力されることを確認したいと考えています。SNS とのやり取りは、応答を取得するためにサブスクリプションが必要なため、扱いが難しいです。これを自動テストで即座に実行するのは難しいため、SNS トピックへのサブスクリプションを処理する Lambda と、テスト スキャフォールドに対する検証のための応答を永続化する DynamoDB を追加しました。
このようにして、テストはサービスにリクエストを送信し、サービスにリクエストを処理させ、スキャフォールディングされた DynamoDB から SNS トピックに送信された結果を取得して、結果が期待どおりであるかどうかを判断できます。
2 番目の例は最初の例と似ています。ここで、マイクロサービスは SNS トピックからイベントを取得し、製品がアクティブかどうかなど、追加のステータス確認のためにサービスを呼び出します。この状態は、マップされた外部サービスに公開されます。
この場合、テスト スキャフォールドは SNS トピック、API ゲートウェイ、Lambda、Dynamo で構成されます。テストでは、サービスがテスト スキャフォールディング API 呼び出しから受け取るデータを Dynamo に入力し、SNS トピック フローをトリガーしてテストを開始します。処理中、マイクロサービスはステータス呼び出しをテスト スキャフォールド内の API ゲートウェイに送信し、そこでテストがステージングされた応答を取得します。マイクロサービスの DynamoDB でプロセスの最終出力を検証します。
この例が示すように、テスト スキャフォールディングを使用すると、サービスの対話要件を柔軟に一致させることができるため、各サービスを完全に分離してテストできます。
足場のセットアップ、展開、実行
では、これらのサービスが正しいリージョンで実行されるようにするには、どのように構成すればよいでしょうか?
成功するために、クラウド コンポーネント テンプレートでパラメータ化します。テスト スキャフォールドとテスト対象のマイクロサービスの両方に、必要なリソースを管理するための独自の CFT があります。マイクロサービス CFT では、サービスのデプロイ方法に応じて、テンプレートのパラメーター化と条件ステートメントを活用して、テスト スキャフォールディングの使用を制御します。これらのパラメーターは、CI/CD パイプラインを通じて渡されます。統合前のデプロイメントでは、これによりマイクロサービスがテスト スキャフォールディングを検索できるようになり、統合環境ではサービスに適切にデプロイされたサービスを検索させることができます。
以下は、入力パラメーターに基づいてテスト スキャフォールディングを条件付きで使用するマイクロサービス CFT スニペットです。
Conditions:
condIsProd: !Equals [ !Ref paramEnvironment, prod ]
condNotFeatureBranch: !Equals [!Ref paramFeatureBranch, ""]
condIsLocal: !Equals [ !Ref paramEnvironment, local ]
condIsLocalOrBranch: !Or [ !Not [ Condition: condNotFeatureBranch ], Condition: condIsLocal ]
Resources:
resLambdaConvertPicture:
Type: AWS::Serverless::Function
Properties:
Handler: ConvertPicture.handler
FunctionName: !Sub "${paramEnvironment}${paramFeatureBranch}_${paramServiceName}_ConvertPicture"
CodeUri: dist/ConvertPicture.js
Policies:
- SNSPublishMessagePolicy:
TopicName: !If
- condIsLocalOrBranch
- !Sub "${paramEnvironment}${paramFeatureBranch}_${paramServiceName}-ts_catalog_pictureUploaded"
- !Sub "${paramEnvironment}${paramFeatureBranch}_catalog_PictureUploaded"
- DynamoDBCrudPolicy:
TableName: !Ref resDynamoMenuJobsTable
テスト スキャフォールディングは、ブランチ デプロイメントの一部としてマイクロサービスと同時にデプロイされます。以下の図は、スキャフォールディング コードが他のサービスと同じデプロイメント標準に準拠する必要があることを示しています。導入が完了したら、機能テストを実行します。
テスト スキャフォールディングを備えたブランチ デプロイメント CI/CD パイプライン図。
メインライン ブランチへのマージは、スキャフォールディング パスを使用した分離サービスのテスト後にのみ可能です。テスト フィクスチャは統合環境にはデプロイされません。メインラインに変更が発生するとすぐに、スケジュールされたジョブを使用して、手動で削除できなかった分離環境 (サービスと足場) をクリーンアップします。特定のアカウントで使用できるリソースの数には制限があるため、これは重要です。
次のレベルへのテスト
テスト スキャフォールディングにより、私たちのチームは、メインライン ブランチにマージして統合環境にデプロイする前に、サービス開発 (CFT およびローカル AWS リソース) とまったく同じ手法を使用してマイクロサービス機能を独自に開発およびテストできます。インプットとアウトプットを足場にすることで、主要なプロセスを中心により深いテスト セットを構築し、高品質を効果的に確保できます。
テスト スキャフォールディングを使用すると、基本的な作成、読み取り、更新、削除のテスト以上のものを作成できるため、ビジネス ユース ケースに関連付けられた深い機能フローを構築することもできます。これらの詳細な機能テストにより、マイクロサービスがメインラインにマージされ、環境にデプロイされる前に、マイクロサービスの変更に確信が持てます。また、自動化のほとんどを (単体テストとともに) このレベルに維持することで、ジャーニー テスト (つまり、「エンドツーエンド テスト」) の使用が最小限に抑えられ、テスト ピラミッドのすべてのレベルで健全な自動化スイートがサポートされます。
いくつかのハイライト:
-
テストは、リポジトリへのプッシュが行われるたびに実行されます。
-
早くテストしてください!当社の主要サービスの 1 つに対して実行された数百のテストのうち、最も長時間実行されたセットは 10 分未満でした。
-
テストは今後のマージをゲートします。テストが失敗した場合、コミットはマージできず、他のサービスでの他のチームの作業には影響しません。
-
テストは独自のデータをすべて定義および制御するため、完全に決定的かつ密閉的になります。
学んだ教訓
テスト スキャフォールディングを実装して利用する最適な方法を学ぶには、試行錯誤が必要です。これをプロジェクトに組み込む方法と、パイプラインの一部として構築してデプロイする最適な方法の両方を決定する必要があります。以下に重要な教訓をいくつか示します。
KISS - (「Keep It Simple, Stupid」) 私たちは、適切な応答を生成するためにロジックに繰り返し依存する必要がないように、テスト フィクスチャの動作を複雑にする傾向があります。
クリーンアップ- 変更がメインラインにコミットされると、サービスのテスト バージョンとテスト スキャフォールディングが残されます。したがって、アクティブな開発が行われていない、または数日間更新されていない AWS 開発アカウントからアーティファクトを削除するクリーンアップ ジョブを設定しました。すべてがクラウド形成スタックによって定義されるという事実により、必要に応じて変更を再デプロイすることが非常に簡単になります。
契約の進化 - テスト スキャフォールディングで使用されるリクエストと応答が実際のサービス コントラクトと一致していることが重要です。そうしないと、テストすべきことをテストできません。チーム間のコミュニケーションと契約テストは引き続き重要です。
新しいプロセスと同様に、テスト スキャフォールディングの開発とデプロイには時間と労力がかかりましたが、最終的には、マイクロサービス開発アプローチ全体において強力なツールであり、重要な資産となりました。
最後に:以下の完全なソフトウェア テスト ビデオ チュートリアルが整理されてアップロードされており、必要な友人は自分で入手できます[100% 無料保証]
ソフトウェアテストの面接ドキュメント
私たちは高給の仕事を見つけるために勉強しなければなりません。次の面接の質問は、アリ、テンセント、バイトなどの一流インターネット企業からの最新の面接資料であり、一部のバイトの上司が権威ある回答をしています。このセットを完了してください。面接資料は次のとおりです。誰もが満足のいく仕事を見つけることができると信じています。