TechTargetは「ポジティブテストとネガティブテストの違い」に関する記事を公開した。ポジティブテストとネガティブテストについて詳しく述べ、一連の実例を用いて、両テストによって徹底したテストアプローチの基礎を築く方法を確認する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
TechTargetは2024年4月30日(米国時間)、「ポジティブテストとネガティブテストの違い」に関する記事を公開した。
テスト担当者が新たなプロジェクトに取り組む際、まず考えるのがメインのユーザーワークフローや正しい操作手順をテストすることだ。この種のテストはポジティブテストという。ただし、代替手順のテスト、エラーテスト、障害のテストといったネガティブテストを検討することも重要だ。
ポジティブテストとネガティブテストは、機能面、非機能面の双方において重要で、ソフトウェアテストの階層全体で実行しなければならない。ポジティブテストとネガティブテストは、スクリプトを使ったテストでも探索的テストでも、必ず実施すべき重要なテストだ。これは厳密なテストアプローチの基礎となる考え方だ。要件1つごとにポジティブテストとネガティブテストの両方が必要であることを、テスト担当者は念頭に置かなければならない。
品質を追求するテスト担当者にとっては、ポジティブテストとネガティブテストはどちらも重要な手法だ。
ポジティブテストでは、テスト対象のソフトウェアが要件の指示通りに動作することを検証する。その結果、機能が想定通りに動作することが保証される。ポジティブテストでは、有効な入力をしてテスト対象の機能を実行すると、その入力が受け入れられ、ユーザーがフローを続行できることを検証する。
対照的にネガティブテストでは、想定外の条件を用いて、すべきではないことが実行されないことを確認する。ネガティブテストでは、無効な入力をし、その入力によってユーザーが機能を実行できないかどうかを検証する。
テストチームは、テストケースを設計するか、探索テストのシナリオにポジティブテストとネガティブテストを含めることで、両テストを取り入れる。両テストのテストケースは、想定する結果も含めて設計する。想定結果と一致すると、そのテストケースは合格となる。両テストケースでは、テストに対する入力が異なる。ポジティブテストケースでは有効な内容を入力するのに対し、ネガティブテストケースでは無効な内容や想定外の内容を入力する。
どちらのテストも等しく重要だが、ネガティブテストをテストの設計に含めなかったり、完全に見落としたりしていると、運用環境で深刻度の高い欠陥が生じる恐れがある。こうした欠陥は、ネガティブテストの未実施が根本原因である場合も多い。
可能な限り迅速に欠陥を把握するには、ポジティブテストとネガティブテストの両方をソフトウェア開発の早い段階で開始することが必要だ。テストチームは要件をレビューする際に、ポジティブな理想的手順だけでなく、ネガティブな間違った手順を検討しなければならない。例えば、適切なエラーメッセージが表示されることを確認するために、受け入れ基準の追加や変更をテスト担当者が求めても構わない。単体テストやコンポーネントテストに、両テストを可能な限り多く含めるよう開発者に求める必要がある。
健全性と安全性が重要な分野では、テストの設計時にポジティブテストとネガティブテストの両方を考慮する必要がある。開発とテストの設計、管理に規制がある分野では、ポジティブテストとネガティブテストの両方が義務付けられることもある。このような分野では、機能のリスクに応じてテストの種類と厳密さのレベルが決まるためだ。
ポジティブテストもネガティブテストも重要度は変わらず、開発プロセス全体で対応する必要があるが、両テストの実行には時間も費用もかかる。そのため、全てのケースで必要というわけでもない。スモークテストやサニティテストなど、テストのレベルによっては、ポジティブテストのみで十分なこともある。
スモークテストとは、品質確保の入り口ともいえる大まかな検証を指す。スモークテストを経ることで、新しいビルドの機能がさらに粒度の高いテストに移行できるかどうかを判別できる。
サニティテストでは、コンポーネントやモジュールが想定通りに動作していることを大まかに検証する。このテストは、スクリプトを使わずに非公式に実施されることが多い。
ネガティブテストでは、機能が停止(エラーの発生やソフトウェアの強制終了)する可能性があるため、運用環境にデプロイした後の検査での使用や運用環境での使用は避ける必要がある。
スモークテストやサニティテストではネガティブテストを実施しないのが一般的だが、機能以外のテストやユーザーエクスペリエンス(UX)の検証にはネガティブテストが重要な役割を果たす。テスト担当者は、ネガティブテストによってエラー状態を試験し、それによって不適切な入力をシステムがどの程度適切に処理するかを評価する。例えば、不適切な入力によってエラーメッセージが表示されるかどうか、表示されるとしたらそのメッセージがエラーを解決するのに必要な情報をユーザーに提供するかどうかを判断する。
ここからは、ポジティブテストとネガティブテストの例を紹介する。
ユーザーインタフェース(UI)の各フィールドをテストする際に、ポジティブテストとネガティブテストのテストケースが併用されることが多い。UIの姓名フィールドには英文字での入力が求められるとする。この場合、ポジティブテストでは英文字で姓名を入力し、これらの文字が想定通りに受け入れられることを確認する。
ネガティブテストでは、数字や記号など無効な文字を入力する。簡単なようにも思えるが、名前にアポストロフィーを含めるとどうなるか。この場合、ネガティブテストを設計する際にユーザー入力で許される条件を具体的に追加し、アプリケーションが受け入れるべきではない入力は確実に受け入れないようにする必要がある。
ポジティブテストとネガティブテストに境界値分析手法を組み合わせて、テストの完全な対象範囲を確保する。テストチームは境界値分析を実施し、テスト入力の範囲を決める。例えば、アプリケーションでは18〜65歳の年齢を受け入れる必要があるとする。この場合、ポジティブテストでは、18歳、19歳、64歳、65歳を入力する。これらの値が受け入れられると、想定通りの結果が得られたといえる。ネガティブテストでは17歳と66歳を入力する。想定する結果は、これらの入力がエラーになることだ。
非機能テストでも、ポジティブテストとネガティブテスト両方の実施を検討することが不可欠だ。その一例が、負荷とストレスのテストだ。負荷テストでは、要件で指定されたユーザー数をシステムが同時に処理できるかどうかを検証する。これはポジティブテストだ。
ストレステストでは、想定を上回る数のユーザーがシステムを操作し、どの時点でシステムがクラッシュするかを判断する。これはネガティブテストだ。セキュリティテストでネガティブテストを使用する一例として、SQLインジェクションが挙げられる。これは、セキュリティの脆弱(ぜいじゃく)性を明らかにするためにWebアプリケーションに不適切なコードを挿入するものだ。
Copyright © ITmedia, Inc. All Rights Reserved.