テスト自動化における 10 のベスト プラクティス #6: 失敗するテスト ケースの解決
はじめに
安全で保守が可能になるように入念に設計されたテストケースであっても、「テストの失敗」は起こりえます。「テストの失敗」には複数の解釈があるので、まずその違いを見てみましょう。
失敗を期待するテスト ケース
不正なパスワードなど、テスト対象アプリケーション (AUT) からエラーを返すことを期待するテスト ケースです。このタイプのテストケースは、期待されるエラーメッセージを返す場合に「成功」となります。
アプリケーションの欠陥を発見するテスト ケース
これは成功するテストケースです。なぜなら、欠陥を発見することはソフトウェアテストの主な目的の1つだからです。このタイプのテストケースは回帰テストに含めることを検討しましょう。
アプリケーションの機能に無関係な理由で失敗するテスト ケース
この記事で使用する「失敗したテスト ケース」とは、これを意味します。テストケースが失敗する場合に最初にすべきことは、以下について確認することです。
- テスト対象アプリケーションの欠陥によってテストケースが失敗したのか?
- 不正または無効なテスト データなど、テスト ケース自体に問題があるのか?
- テスト環境に問題があるのか、それとも欠陥ではないテスト対象アプリケーションでの変更に問題があるのか?
テストケースが失敗した原因がすぐに分からない場合、アプリケーションの欠陥を報告する前に、テストケース自体のトラブルシューティングが必要かもしれません。「失敗したテストケースを再実行して、成功するかどうか確認すれば良い」と思う人もいるでしょう。しかし、ある時には成功し、ある時にはこれといった理由なく失敗するテストケースは「フレーキー (Flaky:不安定)」で信頼できないテストケースであり、失敗の原因である問題を解決して、テストの結果を信頼できるようにすることが重要です。
デバッグを補助するようにテスト実行を構成する
本シリーズの「第3回 メンテナンス可能なテストを作成する」では、以下にあるような、より安定した失敗しにくいテストケースを設計するためのベストプラクティスをご紹介しました。
- できる限りテストケース間の依存関係を排除すること
- 安定したテスト環境を用意すること
- 失敗が期待されるテスト (未解決の欠陥のテストなど) をテスト実行から除外すること
上記以外にも、失敗が起こったときにスクリーンショットを取るようにテストケースを設計するのも有用です。これらの推奨事項に加えて、必ず失敗を適切に処理するようにテスト実行を構成しましょう。失敗によってテスト全体を停止するのは、本当にそれが正しい状況である場合だけにしましょう (たとえば、アプリケーションが起動に失敗したりスモークテストが失敗したりする状況です)。また、本当のエラーと失敗だけに的を絞って、テスト実行レポートのサイズを管理することも重要です。
※Ranorex には「デバッグ」「情報」「警告」「成功」といった定義済みのレポート レベルがあります。大規模なテスト実行では、このレベルのレポート情報が大量に作成されることがあります。レポート結果を「エラー」および「失敗」レベルだけにすることを検討してください。そうすることで、本当に解決が必要な問題を特定しやすくなります。
問題を切り分ける
失敗するテストケースの数が多い場合、環境、テストフレームワーク、テスト対象アプリケーションの問題を探しましょう。
環境
環境に関する問題として、以下の問題について確認しましょう。
- 必要なサービスが実行されていないこと
- 必要な場合に管理者モードで実行されていないこと
テストフレームワーク
テストフレームワークに関する問題を探しましょう。
たとえば、ライセンスエラーや適切に構成されていないリモートエージェントなどです。
テスト対象アプリケーション
テスト対象アプリケーションが正しく準備されているかを確認しましょう。
ロケーション固有のシステム設定や誤ったブラウザーバージョンの問題のほか、異なるシステム言語といった問題すらありえます。あるいは、ユーザーインターフェイスをブロックする保留中のOSアップデートがあるかもしれません。
テストの実行において、ほとんどのテスト ケースが成功した場合、失敗した個々のテスト ケースに問題がないかを疑いましょう。問題の原因を示すエラーメッセージがあるかもしれません。また、エラーメッセージがない場合に、テストケースがたまたま失敗したと考えて、テストケースを再実行してはいけません。
テストの失敗はすべて理由があって発生します。成功したように見えるテスト ケース、または理由もなく失敗するテスト ケースは「フレーキー (Flaky:不安定)」なテストです。
問題の原因を探るために、以下のチェックリストにて考えられる原因を確認してください。
失敗したテスト ケースをトラブルシューティングする
以下のチェックリストを確認して、失敗したテスト ケースを 1つずつトラブルシューティングしましょう。
- テスト対象アプリケーションに対してテスト ケースが最新になっているか?(たとえば、UI 要素の変更に対してテスト ケースが更新されているなど)
- 入力データは正しいか、テストで利用できるか?
- すべてのパラメーターを正しく設定しているか?
- 期待される結果は有効か?(たとえば、テスト ケースが 1 つの有効な結果を期待しているが、複数の有効な結果を返すことがあるなど)
- 問題を引き起こしたかもしれない以前のテスト ケースとの間に依存関係が存在しないか?(※1)
- 最新のテスト実行のティアダウンは正しく動作したか?
- テスト対象アプリケーションは正しい状態にあるか?(たとえば、すべてのブラウザーウィンドウが閉じている、または最後のテスト実行で入力されたデータは、すべて削除またはリセット済みであるかなど)
- タイミングの問題はないか?
※1. この状況を避けるには、本シリーズの「第3回 メンテナンス可能なテストを作成する」で説明するように、テスト ケースを互いにモジュラーで独立したものにすることです。
※2. イリノイ大学アーバナ・シャンペーン校によるフレーキー テストの調査によると、多くの場合、フレーキー テストの原因は非同期の待機です。期待される結果をテスト対象アプリケーションが十分に早く返さないために、テストが失敗します。この場合、テスト ケースが不必要に失敗しないように、テスト ケースのステップに待機時間を追加する必要があるかもしれません。Ranorex での待機時間の動作については、「Ranorex ユーザーズ ガイド(UI 要素の待機)」の章を参照してください。
デバッグ ツールを使用する
失敗するテスト ケースの解決に役立ちそうなツールがあるなら、それを活用しましょう。
※Ranorex(Ranorex Studio)には失敗したテストケースのトラブルシューティングを補助するツールが用意されています。
デバッガー
デバッガーを使用すると、ブレークポイントを設定して、失敗したテスト ケースをステップ実行し、変数の値と各ステートメントの式を検証できます。
メンテナンス モード
メンテナンス モードを使用すると、テストを実行しながら、失敗したテスト ケースを修正できます。詳細については本Blogの記事(Debug Tests Quickly with Maintenance Mode)を参照してください
リモートテスト
これは、仮想マシンなどのテスト環境で発生したテストケースの失敗をトラブルシューティングする上で非常に有用なツールです。
テスト対象アプリケーションを正しい状態にするため、リモートテスト機能である「Ranorex Agent」を使用し、失敗が発生した直前までを実行するようにします。そして、本Blogの記事(How to Reconstruct Failed Test Cases in CI Systems)にあるように、テスト環境にて、失敗したテスト ケースをトラブルシューティングします。
失敗したテストケースを解決する時間を取り、失敗から学ぶことは、テストスイート全体の信頼性を向上する上で役立ちます。
(この記事は、開発元 Ranorex 社 Blog 「10 Best Practices in Test Automation #6: Resolve Failing Test Cases」2018年5月25日の記事を元にしています。)