これは非常に基本的な質問です。一部のソフトウェアアプリケーションでは、アプリケーションのテストケースがほぼ無限に多数あります。これらすべてのテストケースをテストすることは現実的ではありません。テストをいつ停止するかをどのように決定しますか? (「お金が尽きたとき」以外)。
グレンフォードマイヤーズの本 The Art of Software Testing には、このためのシンプルでありながら原則に基づくルールがあります。バグの発見をやめれば、テストは完了です。または、より実際的には、新しいバグを見つける速度が大幅に低下した場合です。
バグは、特定のモジュールおよび特定の機能で「クラスター化」する傾向があります。1つでバグを見つけた瞬間、より多くのバグがないかどうかさらに調べる必要があることがわかります。バグを見つけるには、ブラックボックステスト、ホワイトボックステスト、ミューテーションテストの テクニックを使用 を実行できます。 バグを見つけている限り、テストプロセスが機能していることがわかります
進捗状況を視覚化するには、チームが1日に発見したバグの数をグラフ化します。グラフが下がっていれば、チームが使用している手法ではとにかくそれらを見つけられないことがわかります。もちろん、自分のテクニックが標準に達していないと思われる場合は、マイヤーズの本を読んで原則を適用してください。
さて、あなたはバグの新しいパッチを見逃すだけでは足りない可能性があり、もう少しテストを続けていれば、バグを発見する率は大幅に増加するでしょう。しかし、あなたのテクニックが健全であると信じるなら、これはありそうもないことです。
簡単な答えは、システムに依存するということです。ハートモニター用の組み込みソフトウェアや原子炉の安全性監視ツールを作成している場合、ブログプラットフォームを作成している場合よりもはるかに標準が高くなります。
これは本当に優れたシステムテスターにとっての質問です(私はそうではありません)が、試してみます。
あなたの基本的な測定はテストカバレッジになります:アプリケーションのどれだけが実際にテストされましたか(ユニットテストと機能の両方で)。
実際に使用される可能性(エッジケースが削除される可能性がある)、複雑さ(単純なものにバグが含まれる可能性が低い、またはハードに含まれる可能性が低い)について、潜在的な各ユースケース(およびそのユースケースのパラメーター)を評価する必要がありますバグを見つけるため)、テストにかかるコスト(時間)、およびその領域で発見された場合の欠陥の潜在的な影響(原子炉とブログプラットフォームの比較は、ここで行われます)。
その評価に基づいて、それらのうちどれをテストするか、そしてどれだけ詳細に調べるかを決める必要があります。そのようなリストができたら、チーム(プロダクトマネージャー、プロジェクトマネージャー、ユーザー代表を含む)はそのリストを調べ、自分の制約に基づいて優先順位を付けることができます。
検討するのに役立つテクニックの1つは、リリースごとにテストされるユースケースを変えることもできるということです。たとえば、重要ではないテストケースのリストがあり、そのうちの半分を1つのリリースでテストし、残りの半分を次のリリースでテストする(次に代替)。このようにして、努力の結果得られるテストカバレッジの合計が増加します(ただし、回帰バグが発生するリスクがあります)。
これはプラットフォームテストにも拡張できます。2つのデータベースバックエンド(または複数のブラウザー)をサポートしている場合は、アプリの半分を片方でテストし、もう半分をもう片方でテストしてから、次のリリースを交換します。
(これはストライピングと呼ばれていると思いますが、それについては引用しないでください。)
そして最後に考えることは、テストすることではなく、問題が発見されたときに実際に修正することです。 「すべてのバグを修正する」と言うのが一般的ですが、実際には時間のプレッシャーがあり、すべてのバグが同じというわけではありません。繰り返しになりますが、関連するすべての関係者との定期的なバグスクラブが最善の方法です。これは、バグ修正が特に煩わしい場合に特に関連します。バグ修正が生成する再テストと回帰テストでの追加作業が修正の利点を上回る可能性があるためです。
ソフトウェアの使用に関連するリスクが許容可能なレベルまで低下したとき。
"プログラムテストを使用して、バグの存在を示すことはできますが、バグがないことを示すことはできません!" --Edsger Dijkstra
自動化されているかどうかにかかわらず、テストを行う際に覚えておくと良いこと。バグが発見されていないことを証明できるだけであり、バグがなくなったことを証明することはできません。
しかし、コードのセクションに目を向けるほど、その適切な操作に自信を持つことができます。その点での最適化に関するKnuthの引用によく似ています。間違ったものを非常に簡単にテストでき、開発中の間違ったタイミングでテストできます。
基本的に、2つの大きな場所でカバーされる必要があります。
ソフトウェアは、指定された要件を満たしていることを示すBDDテストに合格していますか。これが真実でなければ、ソフトウェアは完了したとさえ呼べません。
最も重要で、複雑で、不確かなセグメントには、信頼を提供するための適切なテストがありますか?それがコアループであるか、最適化またはハックする必要があるものである場合は、テストしてください。複雑で論理的な分割が多い場合:たくさんのテストを行ってください。単体テストができない場合、または埋め込みが深すぎて実際に直接テストできない場合は、コードを確認し、コードを手動で間接的にテストしてください。
単体テストについて話していて、TDD(最初にテストを作成する)をしている場合、これは問題ではありません。機能が完了したら、テストを停止するだけです。
インクリメンタルTDDでは、失敗するテストを記述し、それを通過させることができる最小量のコードを実装してから、リファクタリングします。メソッドが機能を完了するまで、この方法でテストを追加し続けます。
こちら 良い例です。
統計家もこの問題を見てきました-実際には早くも1970-80年代です。バグがどのように発見されるかについて適切な仮定が与えられた場合、彼らはテストのデータからバグの数を推定しようとします。これは、損失関数の最適化に基づいて停止するタイミングを決定するために使用されます。これを実際に行う方法に関するRコードを含む、この問題に関する論文の短い扱いについては、たとえば https://rpubs.com/hoehle/1792 ...を参照してください。
もちろん、1つの問題は常にバグ検出プロセスに関する仮定です。たとえば、上記の処理では、バグは互いに独立して検出されると想定されています。実際には、1つの大きなバグを修正すると、たとえば、新しいバグが発生する可能性があります。
プロジェクトが完了するまで待つと、実際に非常に多くのテストケースが発生します。小規模な配信に重点を置いて継続的に配信すると、各反復でテストケースが少なくなり、すべてをテストできるようになります。小規模な配信ができない場合は、優先順位を付けてテストを最優先で開始し、停止するまでテストを続けます。
決して、私はあなたがシステムでテストを終えることは決してないと思います。あなたが管理できない非常に多くの変数があります。
しかし、私たちが知っているように、「永遠に」テストすることはできないので、制限は基本的に次のものに依存すると思います。
最初にテストするのは、「ハッピーパス」、エッジケース、無効な入力です。複数の同時ユーザーが存在する場合は、ロックや競合状態などの同時実行性の問題をテストする必要があります。アプリが外部リソースを使用する場合、それらのリソースが利用できない場合のアプリの動作をテストする必要があります。その後、コードを使用して、コードが壊れる原因となるものを探し、それらをテストできます。これらのすべてのテストに合格すると、その後のテストの費用対効果比が上昇し始めるので、その時点で停止するのが妥当です。
結局のところ、それは自信の問題です。システムが十分にテストされていると確信していますか?
言うまでもなく、「信頼度」は非常に主観的です。完全に確信することはできませんが、十分確信することはできません。それが私たちが求めているものです。そのためには、一般に 完了の定義 として知られるインジケーターのリストを作成する必要があり、チーム全体が同意するものでなければなりません。
テスト関連の「完了インジケータ」をいくつか次に示します。
これらの点を確認できれば、十分にテストしたと言えるでしょう。
発送日が到着したとき。ソフトウェアのテストに終わりはありません。しかし、再びスケジュールと呼ばれるものがあります。予定された時間内にほとんどの機能をテストし、発生したバグを修正する必要があります。ソフトウェアが完璧であることを保証する方法はありません。
デプロイを承認する必要がある人々が満足したとき。
または場合によっては、責任者の過半数が満足しています。