なぜCem Kanerはテストがバグを明らかにしないと時間の無駄だと考えるのですか?


15

肯定的なテストで機能を確認し、機能していることを証明するのはどうですか?時間の無駄だと言えますか?この引用の背後にある概念は何ですか?

失敗したテスト、つまりエラーを見つけられないテストは時間の無駄です。

Web Engineering:Cem Kanerを引用したWebアプリケーションの体系的開発の規律


2
あんまり。Kanerは、一般に、テストでは欠陥を見つけるだけでよいと主張しています。
ジョンV

4
それは非常に学術的な立場です。Kaner氏とSchrödinger氏はいつかコーヒーを飲みに座る必要があります。
Blrfl

2
@Blrflの唯一の問題は、シュレディンガー氏が死んでいることです。ああ、待って…えーと…
ikmac

1
文脈のないその声明はばかげているように聞こえます...-
リグ

1
「肯定的なテストで機能を確認する」-これは基本的に不可能です。正しいことを証明することはできません。間違っていることしか証明できません。
コンラッドルドルフ

回答:


37

私は25年以上前にテスト用コンピューターソフトウェアのほとんどを書きました。それ以来、時代遅れ、または単に間違っていると考える本のいくつかの部分を指摘しました。http://www.kaner.com/pdfs/TheOngoingRevolution.pdfご覧ください

ブラックボックスソフトウェアテストコース(ビデオおよびスライドは無料で利用可能)、www.testingeducation.org / BBSTのサイトで詳細を見ることができます(現在のビューですが、TCSへの明示的なポインターはありません)。

当時のテスト文化は主に確認的でした。

最新のテストでは、単体テストへのアプローチはほとんど確認的です。ソフトウェアが意図したとおりに動作し続けることを単純に検証する自動テストの大規模なコレクションを作成します。テストは変更検出器として機能します-コードの他の部分に何かがあり、この部分に問題が発生した場合、または現実世界では不可能だったデータ値がアプリケーションに到達した場合、変更検出器が起動して、プログラマーがメンテナンスの問題を解決します。

確認の考え方はユニットテストに適していると思いますが、システムテストのすべてが確認的である世界を想像してください(区別する人は、システムに関する私のコメントに含まれている「システム統合テスト」と「受け入れテスト」を解釈してくださいテスト。)テストのポイントは、プログラムが仕様を満たしていることを確認することであり、支配的なアプローチは、プログラムの動作に仕様の一部をマッピングする無数(または少なくとも数百)のシステムレベルの回帰テストを構築することでした。(仕様の動作確認は有用だと思いますが、それはより大きな目的の小さな部分だと思います。)

この方法で動作するテストグループはまだありますが、もはや支配的なビューではありません。当時はそうでした。この考え方で一貫して訓練されている人々を強調するために、私は強調して書き、鋭い対比を描きました。今日、いくつかのシャープなコントラスト(ここで引用したものを含む)は時代遅れです。彼らは間違った見方に対する攻撃と誤解されます。

ご覧のとおり、ソフトウェアテストは、ソフトウェア製品またはサービスに関する品質関連情報を学習するための経験的なプロセスです。

テストは、有用な情報を明らかにするように設計する必要があります。

ところで、ところで、「情報」を明らかにする方法としてテストについて話す人はいませんでした。当時、テストは(...の一部のバージョン)バグを見つけるため、または(...の一部のバージョン)仕様に対するプログラムの検証(チェック)のいずれかでした。テストは有用な情報を明らかにするためのものであるという主張は、今世紀までテスト用語に取り入れられたとは思いません。

情報価値の観点から評価テストを想像してください。ソフトウェアについて私たちが知らないことを教えてくれる可能性が非常に高いテストは、非常に高い情報価値を持ちます。私たちがすでに期待しているものを確認する可能性が非常に高く、以前に何度も実証されたテストは、情報価値が低いでしょう。テストに優先順位を付ける1つの方法は、低い情報値のテストの前に高い情報値のテストを実行することです。

ソフトウェアのテストについて無知なプログラマー、プロジェクトマネージャー、またはプロセスマネージャーの注意を引くために、この優先順位付けを単純化しすぎた場合、「バグを明らかにするように設計されていないテストは時間の無駄です」 」これは完全な翻訳ではありませんが、微妙な点や資格を理解できない、または理解できない読者にとっては、これはすぐに理解できるものです。

当時、ここでもう一度見ますが、テストを理解していない人の中には、主要な機能の主要な使用のテストと比較して、コーナーケースを見つけるように設計されたテストは時間の無駄であると答えます。彼らは2つのことを理解していません。まず、タイムテスターが境界値をチェックする時間を見つけることによって、主要な機能の主要な使用法が既に何度か実行されています。(はい、例外があり、ほとんどのテストグループはそれらの例外に注意を払います。)次に、極端な値でテストする理由は、プログラムが極端な値で失敗する可能性が高いことです。極端に失敗しない場合は、別のテストを行います。これは効率的なルールです。一方、極端な値で失敗した場合、テスターが停止してバグを報告したり、テスターがさらにトラブルシューティングを行ったり、プログラムがより正常な値で同じように失敗するかどうかを確認します。誰がそのトラブルシューティングを行うか(テスターまたはプログラマー)は、企業文化の問題です。一部の企業はこれにテスターの時間を割り当て、一部の企業はプログラマーに予算を割り当て、一部の企業は、トラブルシューティングが適切ではないように、一般化可能であるかどうかにかかわらず、プログラマがコーナーケースバグを修正することを期待しています。極端な値をテストすることでテスターが(効率を最大化するのではなく)時間を浪費しているという一般的な誤解は、「バグを明らかにするように設計されていないテストは時間の無駄です」がテスターに​​とって適切なメッセージである別の理由です。これは、一部のプログラマーが(実際に)プログラムに挑戦する可能性のあるテストを実行しないように奨励することへの対抗策です。メッセージは単純化されていますが、議論全体が単純化されています。

ところで、「情報価値」だけが優先順位付けシステムになることはできません。単体テストスイートを設計するとき、それは私のルールではありません。ビルド検証テスト(別名サニティチェック)を設計するとき、それは私のルールではありません。どちらの場合も、個々のテストの力よりも、カバレッジの種類に興味があります。個々のテストの力が私の設計とは無関係である他のケース(たとえば、セットアップ、実行、および監視が安価な大量の自動テスト)があります。追加の例を考えることができると確信しています。

しかし、一般的なルールとして、1つだけのルール(たとえば、複数の文を処理しようとすると頭が爆発するエグゼクティブと話す)しか言えない場合、情報価値の低いテストは通常​​時間の無駄です。


4
+1は信頼できる情報源である質問に答えるために時間を割くとともに、「ビルド検証テスト」という用語の使用を検証します。あなたの身長の周りの人々を助けるために時間がかかる
ジミーホッファ

1
エリックG:読者の一部として、このテーマに対する彼の見解は時間とともに進化していることを理解しているとCemが述べていることを再読すると思います。または、Cemを言い換えると、微妙さと資格をそのまま無視することができます。(そして、私は彼の資格としてではなく、例外として「資格」を取ります。)
ジムホームズ

あなたの引用は、私が科学について観察したことを思い出させます。理論と矛盾しない結果をもたらすと期待される実験を行うことによって科学理論を証明することはできません。理論をサポートする方法は、それをサポートしないデバイス実験に真正な努力をすることですが、そうすることはできません。
-supercat

@supercat理論の前にテストが発生しなかった場合、理論と一致する何かのテストで理論をサポートできます(たとえば、真空中に落下するオブジェクトの加速度を計算すると、倒れたことを示すだけではありません)。エッジケーステストは類似しています。極端な値を処理するときにソフトウェアが正しく動作することを期待するかもしれませんが、バグを見つける可能性が高いとともに、おそらく開発中に見られた入力値を繰り返すよりも、品質の信頼性が向上します。
ジョンハンナ

@ジョンハンナ:私の言い回しは貧弱でした。問題は期待ではなく、努力です。合格するテストを見つけよとしても、理論を証明することはできません。無効な場合に失敗するテストを見つけるために、誠実な努力をしなければなりません。
supercat

11

Kaner氏によれば、このアイデアは「テストケースがなくなる前に時間がなくなるため、可能な限り効率的に利用可能な時間を使用することが不可欠です」と述べています。

あなたが尋ねる引用の背後にある概念は、「テストの目的と限界」の章で、Cem Kaner、Jack Falk、Hung Quoc NguyenによるTesting Computer Softwareの記事で詳しく説明されています。

それで、なぜテストするのですか?

すべてのバグを見つけることはできません。プログラムが正しいことを証明することはできませんし、したくありません。高価でフラストレーションがたまり、人気コンテストには勝ちません。それでは、なぜテストを煩わせるのでしょうか?

プログラムをテストする目的は、問題を見つけることです

問題を見つけることはあなたの仕事の中核です。できるだけ多くを見つけてください。問題が深刻であればあるほど良い。

テストケースがなくなる前に時間がなくなるので、可能な限り効率的に利用可能な時間を使用することが不可欠です。第7、8、12、および13章では、優先順位を詳細に検討します。指針は簡単に言えます:


問題を明らかにするテストは成功です。問題を明らかにしなかったテストは時間の無駄でした。


Myers(1979)からの次の例えを考えてみましょう。あなたに何か問題があるとしましょう。あなたは医者に行きます。彼はテストを実行し、何が間違っているかを見つけ、修正措置を推奨することになっています。彼はテストの後にテストを実行します。結局のところ、彼は何も悪いことを見つけることができません。彼は偉大なテスターですか、それとも無能な診断士ですか?あなたが本当に病気の場合、彼は無能であり、それらの高価なテストはすべて時間、お金、労力の無駄でした。ソフトウェアでは、あなたは診断者です。プログラムは(確実に)病気の患者です...


ご覧のとおり、上記のポイントは、テストの賢明な優先順位付けが必要だということです。テストには限られた時間がかかると予想され、指定された時間内にすべてをテストすることは不可能です。

テストを実行する時間がないため、テストを実行するのに1日(週、月)費やし、バグを発見せず、いくつかのバグをすり抜けたとします。これが発生した場合、このミスを正当化するために「他のテストの実行に忙しかったので、私のせいではありません」と言うことはできません。

バグを明らかにしなかったテストの実行に時間を浪費し、このため、バグを見つけるテストを見逃しました。

(疑問に思われる場合、上記のようなミスは一般的にどのように試しても避けられないものであり、これらに対処する方法はありますが、それは別の質問のトピックになります...そしておそらくSQAにより適しています。 SE。)


12
この答えは彼の立場を正しく表していますが、多くの人が彼の立場は間違っていると考えていることを指摘する価値があります。アプリで最も重要な機能を正常に動作させることを実証するテスト(受け入れテスト、もしあれば)と、めったに使用されないアプリのコーナーで些細なバグ(1ピクセルのずれ)を見つけるテストのどちらかを選択すると、限られた時間の中でどれを選ぶかを知っています。そして、医師の例えのために:症状に反応するのではなく、健康診断に行く場合、心臓が良いこと、肺が良いことなどを確認することは良い結果です。だからそこに。
ケイトグレゴリー

@KateGregory私は同意します、私は同じと思います。私はpersoanlly彼の意見が間違っを見つけ、我々は情報を収集するために主にテスト...
ジョン・V

2
@KateGregoryは同意します-合格したテストを廃棄物として分類するのは正確ではないと思います。しかし、彼が指摘することの1つは時代を超越していると思います。バグがリリーステストをすり抜ける場合、QAは彼らの背中をカバーするために「ああ、しかし他のテストの実行で忙しかった」以上のものが必要になります。私は過去にテスター自分としてこれを経た、そして今、私は開発者だと周りにこれを見て、私はそれが今までフェード離れてないと思うしました
ブヨ

4

まあ、ミスター・カナーは知りませんが、私見

潜在的にエラーを発見しないテスト

時間の無駄です。これには、すでにいくつかのテストが存在する状況(テストが自動であるか、単にチェックリスト上にあるかは関係ありません)が含まれ、本質的に既存の同じケースを検証する新しいテストを追加します。したがって、新しいテストでは、既存のテストよりも多くのエラーは検出されません。

このような状況は、たとえば、ランダムなリストだけを見ると発生する可能性があります-「ブレインレス」と言うこともできます(その言葉はお許しください)-プログラムでテストケースを選択します。入力データのクラス、または既に記述されたテストに関連してコードカバレッジが増加する場合。


-1

私の意見では、この引用は一般的すぎるテストまたは堅牢でないテストを指します。

電子メールを検証する機能のテストを作成し、テストで有効な電子メールのみを提供する場合、そのテストはまったく役に立ちません。「任意の」文字列、無効な電子メール、長すぎる電子メール、Unicode文字(áêñç....)について、この関数をテストする必要があります。

name@dom.comがtrueを返し、name @ comがfalseを返すことのみをチェックするテストをコーディングする場合、そのテストはテストなしと同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.