この質問はいくつかの論争を引き起こしたので、私の答えを私の背景から始めましょう:毎日のプロジェクト作業でV&Vにさらされることは別として、私は母校のソフトウェアエンジニアリング部門で数年間働いており、ソフトウェアエンジニアリングの講師をしています。これは、私が言ったことが正しいことを保証するものではありませんが、少なくとも、この回答に何らかの真実があるのではないかという疑いの利益が得られることを願っています。
あなたが信じているほど混乱していないことを確認させてください。あなたの質問であなたが述べたことは、それが誤解を招くのと同じくらい真実です。まず、あなたが正しく述べたことを指摘しておきます。
- 検証=製品を正しく構築するvs検証=適切な製品を構築する
- 静的手法は検証の一部です。主に、プログラムと要件から導出された正式な入力を受け取り、それらを相互に評価するためです。
- 検証により、要件の正しい実装が保証されます(つまり、正しい方法で構築されていること)
次に、テストに関する混乱を片付けます。まず、多くのコメントが以前に述べたように、自動テスト(ユニット、統合など)によるコードの動的テストは、実際に検証の一部です。ただし、混乱のほとんどを引き起こすのは、検証中の人々がテストについても話し、それでも別の意味を持っているということです。検証では、通常、テストは意図された目的でアプリケーションを使用する人を含みます。最適なケースでは、これはお客様自身です。
ただし、検証と検証のテストで見つかった「エラー」[1]は根本的に異なります。
- 検証テストエラー:これらは、何らかの形で要件に違反するエラーです。
- 検証テストエラー:これらは、機能ではなく、作成した製品そのもののエラーであるため、要件内のエラーを明らかにします。
ほとんどの場合、さまざまなV&Vケースの具体的な例を見ると役立ちます。以下は、エラーの極端な例です。
「f(x)はx + 1を返す必要がある」という低レベルの要件があり、「f」の実装は常に定数2を返す検証中にそれを見つけます。これは、eショッピングサイトを構築していて、彼が "f"を知らないか気にしていないためです。
「システムは、最大80%のCPU負荷で1秒あたり1000リクエストを処理できる必要がある」という要件があります。繰り返しになりますが、検証はほとんどの静的手法と同じように困難を伴います。実際、これを確認する最も簡単な方法は、アプリケーションをリクエストでハンマー処理して動的にテストし、その間CPU負荷を監視することです。
上記の「f」の要件をもう一度考えます。今回は「正しい」実装です。すべてのレビュー、静的分析、動的テストは成功を報告しますが、その後、顧客はソフトウェアをテストし、Webページのショッピングカートアイコンを見逃していることを伝えます。要件フェーズで行ったため、このエラーを見つけることができる検証の量はありません。
ご覧のとおり、「テスト」は、より正確に定義されていない場合でも、検証と検証の両方の一部であり、実際、「テスト」は両方に対して実行する必要があります。
[1]ここでは、「エラー」を口語的に使用して、エラー、失敗、間違い、障害などの区別を避けています。