外部サービスとのテストの分離性は、信頼性のある自動化に不可欠な条件です。
問題の背景: 初期の自動化システムでは、外部APIやデータベースに頻繁に「遭遇」し、それらはしばしばアクセスできなかったり、予期しないデータを返したりしました。テストの分離がなければ、結果を再現することはできません:フリッカー、外部の問題によるクラッシュ、偶発的な失敗。
問題:
解決策:
外部APIの応答をシミュレートするためのローカルスタブである「モック」や「スタブ」の使用。WireMock(Java)、httpmock(Python)、MockServer、TestContainersが一般的です。
インメモリソリューションや各テストの前後でクリアされ、再度入力されるフィクスチャを使用してデータベースをエミュレートします。
テストデータのIDを変数に抽出し、テストが並行して実行でき、お互いに「踏み荒らす」ことがないようにします。
import requests BASE_URL = "http://localhost:1080/api" def test_order_creation(): mock_response = {"orderId": 12345, "state": "created"} # 実際のテストでは、応答はモックサーバーが返します # ここでrequests.postを呼び出し、assert ...
主な特徴:
毎回実際のサービスを通して統合テストを実施する必要がありますか?
いいえ。定期的にモックやスタブを使用し、統合テストは別で、頻繁にではなく、管理の下で実行します。
実際の外部APIを使用したテストが常により信頼できる結果を提供しますか?
いいえ。逆に、それらはあまり安定せず、パートナー側の変更によってクラッシュすることがあります。継続的なフリックテストはパイプラインの品質を悪化させます。
外部サービスを使用する並行自動テストに同じテストデータを使用できますか?
いいえ。これは衝突、「レース」や不安定性を引き起こす可能性があります。識別子とステートはテスト/スレッドごとにユニークである必要があります。
会社は速度のためにすべての自動テストを実際のサードパーティAPI(決済ゲートウェイ)で実行することに決めました。テストが何度もブロックされ、制限がかかり、アクセスの復元が必要になり、データが「流出」し、偽のトリガーが発生しました。
利点:
欠点:
MockServerと架空のインメモリデータベースを設定しました。各テストの前にステートをリセットし、データはユニークです。実際の統合テストは別で、頻繁ではありませんでした。
利点:
欠点: