E2Eテストの安定化の取り組みAuthor:tokuda109こんにちは。13日目を担当します。テストを継続的に実行しています。テストの効率化について」で詳しく書かれています。テストが導入されていますが、この記事で述べられているとおり、安定して動作しているわけではありません。テストが失敗することが多々発生していました。テストがなぜ安定して動作しないかを調査し、どのように改善したかを紹介します。背景メルペイのフロントエンドチームは、テスト、パフォーマンス、アクセシビリティ、セキュリティをプロダクトの重要品質と定め、継続的に計測する仕組みを作っています。テストは重要指標の中のテストに属し、日々開発を行う中で予想外の影響が発生していないかを確認するために、継続的に実行されるようにしています。テストが常にパスするわけではなく、失敗することが多々ありました。テスト実行が失敗する原因は多種多様で、簡単に解決できないものも多いため、まとまった作業時間を確保し、問題解決に取り組みました。原因の全量洗い出しまず最初は、全てのサービスで失敗の原因となっているものを洗い出し、全量を出すことにしました。原因がサービス固有のものなのか、原因がどれくらいの種類あるのかを把握するために、次の項目をスプレッドシートに整理しました。(エラーメッセージ)エラー種別エラー種別は次の図の背景色が付与されているカラムで、いくつかのパターンに分類することができました。原因の全量が把握できたので、次は目標の設定をしました。一度に全ての問題を解消することは不可能なため、次のような基準を設定し、作業に着手する前に優先度を決めました。リトライ機能を使うと成功することがあるものは一旦リトライ機能を使うこの基準を元に、最初のスコープで解決を目指す問題と、次のスコープで解決する問題を分けました。問題点とその対策ここからは問題の原因と解決方法を一つずつ紹介します。テストをテスト環境に向けて実行しています。テストを実行する時だけ一時的にアクセスを許可する仕組みがあります。テスト実行時にアクセス許可を登録する処理が、全てのサービスで度々失敗していました。原因としては、テストを実行するアカウントのアクティベートとアクセス許可の登録が同時に行なわれていたからでした。アクティベートの方が早く終われば問題なく動作するが、逆の場合はまだアクティベートできていないため、登録する処理が失敗していました。アクセス許可を登録する処理をリトライするように修正し、今は安定して動作しています。テストでは、テスト用に作成したお客さまデータを使ってテストを実行する場合があります。いうツールを使っていて、このデータを作成する時に度々失敗していました。追加されたため、この機能を使う方法に移行しました。仕組みを簡単に説明すると、特定のシナリオに沿ったお客さまデータをuser-tkoolに要求すると、シナリオ通りの手順でデータを作って返してくれます。シナリオは何回も使い回されるはずですので、裏で新規データを作成しておき、繰り返し実行したときは高速に作成済みのデータを返してくれます。同じシナリオであれば、次からは確保されているデータを返却するため、データの取得の安定性は抜群に上がりました。移行する前は、テストを実行する度にデータを一から処理を行い、作成していました。テストが失敗することも基本的にはありません。特定のサービスで、「権限がありません」という文言が画面に表示され、テストが失敗していることが多々ありました。テストリトライ機能を使って一時的に回避しました。次の作業スコープで原因調査に取り組みました。層で使っているライブラリに原因があることが分かりました。レスポンスを返す処理が行われます。組み立てるために各コンポーネントが評価されていきます。層に追加したデータがコンポーネントから参照した時に失われている場合がありました。保持しているはずの権限データが参照できないため、権限がありませんという文言が表示されていました。説明用のコードとしては次のとおりです。テストの結果を見てみると、発生しませんでした。担当チームに次のような選択肢があるが、どのように対応するべきか確認しました。他のサービスと同様の実装に移行する引き続きリトライ機能を使ってテストしていく使っているライブラリを修正するこの現象が発生しているのはテスト時のみということで、今は一旦リトライ機能を使うことになりました。今回の調査では、使っているライブラリに原因があるというところまでしか把握できていないため、別の機会で根本原因を行いたいと考えています。エラーが発生する原因はテスト環境固有の理由で発生することが多く、たくさんのマイクロサービスが協調して動作しているため、原因の究明はとても難しいです。テストリトライ機能を使って、リトライすることにしました。テストを実行した瞬間に偶然発生したエラーの場合は、リトライすることで次のテストでは成功することが期待できます。最後は人が起因となって発生するエラーについて紹介します。人間が何かしらの失敗原因を作ってしまい、テストが失敗します。失敗の原因は多種多様で、次のようなものがありました。通知が届き、気づくことができるようにしました。気づかずにテストが失敗し続けることを防ぎ、各チームが自主的に保守していく意識が芽生えたように感じます。テストが失敗する原因をどのように改善したかについて紹介しました。フロントエンド側で可能な対処方法を用い、テストが成功することを目標にして作業をしました。今回はリトライすることで解決した問題が多かったですが、根本的な原因の究明を引き続き行っていきたいと思います。現状把握の方法、計画的に取り組むアプローチ、各問題に対する判断等、泥臭い部分ではありますが、本記事を読んだ方に何かしらお役に立てれば幸いです。引き続きお楽しみください。