6

古典的な C の教科書 K&R を再訪しました。演習 1-11 を読んでください。

文字カウント プログラムをどのようにテストしますか? バグがある場合、どのような種類の入力がバグを発見する可能性が最も高いですか?

実際には、既存の段落を手動でカウントして正確な単語数を取得し、それを単語カウント プログラムの計算結果と比較するという基本的なアイデアしかありません。

見逃したものはありますか?そして、テストの裏技とは?

編集

回答の要約:

単語のセマンティックな定義、いくつかの特殊なケース:

  • リンクワード:「キャットウォーク」
  • 小文字: a、b、c
  • biiiiiiig words: "a fooooooooo<40MILLIONLETTERS>oooooo a" には 3 つの単語があります

境界条件:

  • 単語間に複数のスペースがあるテキスト。
  • 2GBを超えるテキスト
  • ダッシュを含み、空白を含まない単語。
  • ASCII 以外の単語。
  • いくつかの異なるエンコーディングのファイル (プログラムがサポートしている場合)
  • 空白で囲まれているが単語文字を含まない文字 (例: "hello - world")
  • 言葉のないテキスト
  • すべての単語が 1 行にあるテキスト
4

5 に答える 5

2

バグを発見する可能性のあるテキストの例を次に示します。

  • 単語間に複数のスペースがあるテキスト。
  • 2GBを超えるテキスト
  • ダッシュを含み、空白を含まない単語。
  • ASCII 以外の単語。
  • いくつかの異なるエンコーディングのファイル (プログラムがサポートしている場合)
  • 空白で囲まれているが単語文字を含まない文字 (例: "hello - world")
  • 言葉のないテキスト
  • すべての単語が 1 行にあるテキスト
于 2011-04-19T13:58:05.323 に答える
2

まあ、それはあなたが意味的に言葉として定義するものに依存します。単語カウント プログラムを作成しているのはあなたなので、単語が何であるかを知っている必要があります。

したがって、このプログラムをテストするには、コーナー ケースがどこにあるかを考える必要があります。「リンクされた単語」は 1 つまたは 2 つの単語としてカウントされますか? " I'm " は 1 つか 2 つだと思いますか? 等..

K&R 演習に関しては、彼らはこれらのまれなケースのいくつかを自発的に忘れていたと思います。彼らは、コードを分析してこれらの警告を見つけることを提案しています。

于 2011-04-19T13:56:06.870 に答える
1

アルゴリズムをテストするには、よく知られている結果を持つ一連のテストケースを作成する必要があります。

このテストケースは以下をカバーする必要があります。

  • 入力の最も可能な組み合わせ。
  • 「境界」の場合。あなたの場合、それは次のようになります。1つの単語、多くの区切り文字を含む2つの単語、区切り文字で開始および終了する短いテキストなど。
  • いくつかの奇妙なテキスト。アルゴリズムを見て、それを壊す可能性のある奇妙な入力について考えてみてください。通常、それは非常に小さなテキスト(3-4)の単語ですが、それらの間にいくつかの奇妙なデリメータがあります。"hello,word", "hello ,word", "hello word,,,,"
于 2011-04-19T14:01:45.647 に答える
1

私はこの答えのために演習 1-11 を読み直していません ... (私の本は 60km 離れています)

間違ってコーディングされた可能性があるもの

  • 小さな単語: "a b c d"4 つの単語があります
  • biiiiiiig words: "a fooooooooo<40MILLIONLETTERS>ooooooo a"3 つの単語があります
  • いくつかの記号の使用:",.!? ...

理解されていない可能性のある定義

  • "cat-walk"一言?2語?
  • "under-\nstood"単語の途中での改行 (ハイフン付き)
于 2011-04-19T13:58:05.663 に答える
0

他の人たちはすでにいくつかの素晴らしい実用的な提案をしました。2つのことを追加しましょう:

まず第一に、K&Rはあなたに彼らのコードのすべての欠陥を見つけてほしくない。この演習の目的は、偽の入力が頻繁に存在すること、およびいつか同様の状況で何らかの形でそれに対処することが期待される可能性があることを認識させることです。それをどのように行うかは完全にあなた次第です。一見簡単に見える問題の中には、難しい考えが必要な場合があることを覚えておいてください。

念のために言っておきますが、私の愚かなiPhoneは、「fooは悪いです。臭いがします。」というメッセージを受信すると、「bad.it」をURLとして認識します。面白そうですが、現時点では、メッセージの内容自体を変更せずにこのバグを修正することはできません。


そして第二に、あなたのタイトルは誤解を招くものです。単にテストするだけで、プログラム内のすべてのバグを見つける方法はありません。または、エドガー・ダイクストラがかつて言ったように:

テストでは、バグがないことではなく、存在することが示されています。

これは理論計算機科学の基本的な結果であり、実際に証明することができます。興味があればライスの定理を見てください。



編集:この投稿を書いているときに、私たちのトピックに何らかの形で関連しているバグを見つけました:StackOverflowパーサーは「http://en.wikipedia.org/wiki/Rice's_theorem」をURLとして認識しません。:-)

EDIT2:ここにメタに関するバグレポートを提出しました。

于 2011-04-20T00:02:10.693 に答える