Как проверить программу подсчета слов, если есть какие-либо обнаруженные ошибки?
Я только что вернулся к классическому учебнику C K&R. и прочитал упражнение 1-11:
Как бы вы протестировали программу подсчета слов? Какие виды ввода, скорее всего, обнаружат ошибки, если они есть?
на самом деле, у меня есть только основная идея вручную подсчитать существующий абзац, чтобы получить точные номера слов и сравнить его с результатом программа подсчета слов вычисляет.
есть что-нибудь, что я пропустил? И в чем фокус тест?
редактировать
ответы резюме:
семантическое определение слова, некоторые частные случаи:
- ссылка слово:"cat-walk"
- маленькое слово: a,b, c
- biiiiiiig слова: "foooooooooooooooo a" имеет 3 слова
граничные условия:
- тексты с несколькими пробелами между словами.
- тексты больше, чем 2 ГБ
- слова, которые содержат тире, но без пробелов.
- не-ascii слова.
- файлы в другой кодировке (если ваша программа поддерживает это)
- символы, которые окружены пробелами, но не содержат символов слов (например, "hello - world")
- тексты без каких-либо слов
- тексты со всеми словами на одной строке
5 ответов
Ну, это зависит от того, что вы семантически определяются как слова. Так как это вы кто пишет программу подсчета слов, вы должны знаю что за слово.
чтобы проверить эту программу, вы должны думать, где случаи углом: не "связан-слово " считать одним или двумя словами? Считаете ли вы "Я
Что касается упражнения K&R, я думаю, они добровольно забыли некоторые из этих угловых случаев, и они предлагают вам, анализируя их код, найти эти предостережения.
вот несколько примеров текстов, которые могут обнаружить ошибки:
- тексты с несколькими пробелами между словами.
- тексты больше, чем 2 ГБ
- слова, которые содержат тире, но без пробелов.
- не-ascii слова.
- файлы в другой кодировке (если ваша программа поддерживает это)
- символы, которые окружены пробелами, но не содержат символов слов (например, "hello - world")
- тексты без слов
- тексты со всеми словами на одной строке
Я не перечитал упражнение 1-11 для этого ответа ... (моя книга в 60 км)
вещи, которые могли быть закодированы неправильно
- малые слова:
"a b c d"
имеет 4 слова - biiiiiig слова:
"a fooooooooo<40MILLIONLETTERS>ooooooo a"
есть 3 слова - использование нескольких символов:
",.!? ...
определения, которые, возможно, не понял
-
"cat-walk"
1 слово? 2 слов? -
"under-\nstood"
разрыв строки (с дефисом) в середина слова
для тестирования алгоритма необходимо создать набор тестовых случаев с известным результатом.
этот тестовый случай должен охватывать:
- наиболее возможные комбинации входных данных;
- "пограничных" случаях. В вашем случае это может быть: одно слово, 2 слова с большим количеством разделителей, короткий текст начинался и заканчивался разделителями, и так далее;
- какой-то странный текст. Просто посмотрите на алгоритм и попробуйте подумать о странном входе, который может его сломать. Обычно это это довольно маленький текст (3-4) слова, но с некоторыми странными разделителями между ними, как
"hello,word", "hello ,word", "hello word,,,,"
другие ребята уже дали некоторые отличные практические предложения. Позвольте мне добавить две вещи:--1-->
прежде всего, K&R не хочет, чтобы вы нашли все недостатки своего кода. Цель упражнения состоит в том, чтобы вы осознали тот факт, что часто существует фиктивный ввод и что вы можете когда-нибудь ожидать как-то разберитесь с этим в аналогичной ситуации. Как вы это сделаете, полностью зависит от вас. Просто помните, что некоторые, казалось бы, легкие проблемы иногда требуют жесткого размышляющий.
точка в случае: когда мой глупый iPhone получает сообщение, которое гласит: "foo плохо.пахнет.", он признает " плохо.это " как URL. Кажется забавным, но пока вы не можете исправить эту ошибку, не требуя изменения самого содержимого сообщения.
Во-вторых, ваш титул вводит в заблуждение. Нет никакого способа найти все ошибки в программе с помощью mere тестирование. Или как Э. Дейкстры однажды выразился:
тестирование показывает присутствие, а не отсутствие ошибок.
Это фундаментальный результат теоретической информатики и может быть доказано. См.теорема Райса если вам интересно.
EDIT: при написании этой публикации я нашел ошибку, которая каким-то образом связана с нашей темой: синтаксический анализатор StackOverflow не распознает " http://en.wikipedia.org/wiki/Rice 's_theorem" в качестве URL. :-)
EDIT2: подал сообщение об ошибке на meta здесь.