Как протестировать программу подсчета слов, если есть какие-то непокрытые ошибки?

Я только что пересмотрел классический учебник C K&R. И прочитайте упражнение 1-11:

Как бы вы протестировали программу подсчета слов? Какие виды ввода, скорее всего, выявят ошибки, если таковые имеются?

На самом деле, у меня есть только базовая идея вручную подсчитать существующий абзац, чтобы получить точное количество слов и сравнить его с результатом, рассчитанным программой подсчета слов.

Есть ли что-то, что я пропустил? И в чем прикол теста?

ИЗМЕНИТЬ

Резюме ответов:

Семантическое определение слова, некоторые частные случаи:

  • слово-ссылка: "кошачья прогулка"
  • короткое слово: а, б, в
  • большие слова: "a fooooooooo‹40MILLIONLETTERS>oooooooo a" состоит из 3 слов

граничные условия:

  • Тексты с несколькими пробелами между словами.
  • Тексты размером более 2 ГБ
  • Слова, которые содержат тире, но не содержат пробелов.
  • Не-ascii-слова.
  • Файлы в другой кодировке (если ваша программа это поддерживает)
  • Символы, окруженные пробелами, но не содержащие словесных символов (например, «привет, мир»)
  • Тексты без слов
  • Тексты со всеми словами на одной строке

person xiao 啸    schedule 19.04.2011    source источник


Ответы (5)


Ну, это зависит от того, что вы семантически определяете как слова. Поскольку программу подсчета слов пишете вы, вы должны знать, что такое слово.

Таким образом, чтобы протестировать эту программу, вы должны подумать, где могут быть крайние случаи: считается ли "связанное-слово" одним или двумя словами? Вы считаете, что "я" — это один или два? И т.д..

Что касается упражнения K&R, то я предполагаю, что они добровольно забыли некоторые из этих угловых случаев, и они предлагают вам, анализируя их код, найти эти оговорки.

person Gui13    schedule 19.04.2011

Вот несколько примеров текстов, которые могут выявить ошибки:

  • Тексты с несколькими пробелами между словами.
  • Тексты размером более 2 ГБ
  • Слова, которые содержат тире, но не содержат пробелов.
  • Не-ascii-слова.
  • Файлы в другой кодировке (если ваша программа это поддерживает)
  • Символы, окруженные пробелами, но не содержащие словесных символов (например, «привет, мир»)
  • Тексты без слов
  • Тексты со всеми словами на одной строке
person Sjoerd    schedule 19.04.2011
comment
Также: слова, разделенные дефисом через несколько строк, может быть? - person Benoit; 19.04.2011

Я не перечитывал упражнение 1-11 для этого ответа ... (моя книга находится в 60 км)

Вещи, которые могли быть закодированы неправильно

  • маленькие слова: "a b c d" состоит из 4 слов
  • большие слова: "a fooooooooo<40MILLIONLETTERS>ooooooo a" состоит из 3 слов
  • использование нескольких символов: ",.!? ...

Определения, которые, возможно, не были поняты

  • "cat-walk" 1 слово? 2 слова?
  • "under-\nstood" разрыв строки (с дефисом) в середине слова
person pmg    schedule 19.04.2011

Чтобы протестировать алгоритм, вы должны создать набор тестовых случаев с хорошо известным результатом.

Эти тестовые примеры должны охватывать:

  • Максимально возможные комбинации ввода;
  • «пограничные» случаи. В вашем случае это может быть: одно слово, 2 слова с большим количеством разделителей, короткий текст, начинающийся и заканчивающийся разделителями и т. д.;
  • Какой-то странный текст. Просто посмотрите на алгоритм и попробуйте подумать о странных входных данных, которые могут его сломать. Обычно это довольно небольшой текст (3-4) слова, но с какими-то странными разделителями между ними типа "hello,word", "hello ,word", "hello word,,,,"
person Elalfer    schedule 19.04.2011

Другие ребята уже дали несколько отличных практических предложений. Позвольте мне добавить две вещи:

Прежде всего, K&R не хочет, чтобы вы обнаружили все недостатки их кода. Цель упражнения — научить вас осознавать тот факт, что часто существуют ложные входные данные и что однажды вы, возможно, каким-то образом справитесь с ними в аналогичной ситуации. Как вы это сделаете, полностью зависит от вас. Просто помните, что некоторые, казалось бы, простые проблемы иногда требуют серьезных размышлений.

На всякий случай: когда мой глупый iPhone получает сообщение «foo is bad.it пахнет», он распознает «bad.it» как URL-адрес. Звучит забавно, но пока вы не можете исправить эту ошибку, не изменив само содержание сообщения.


Во-вторых, ваш заголовок вводит в заблуждение. Невозможно найти все ошибки в программе простым тестированием. Или, как однажды выразился Эдсгер Дейкстра:

Тестирование показывает наличие, а не отсутствие ошибок.

Это фундаментальный результат теоретической информатики, и его можно доказать. См. теорему Райса, если вам интересно.



РЕДАКТИРОВАТЬ: при написании этой публикации я обнаружил ошибку, которая каким-то образом связана с нашей темой: парсер StackOverflow не распознает " http://en.wikipedia.org/wiki/Rice's_theorem " в качестве URL-адреса. :-)

EDIT2: отправил отчет об ошибке в мета здесь.

person Philip    schedule 20.04.2011