Поговорили с программистом, и он сказал, что скорость работы программы исключительно важна, а вот объём кода не имеет никакого значения. Резолюции программиста на отчётах тестировщика:
a) Ошибка проектирования: на экране нет названия программы.
Резолюция: не будет исправлена.
b) Ошибка проектирования: на экране нет инструкций.
Резолюция: не будет исправлена.
Примечание: замечание верное, но вывод инструкций замедлит работу программы.
c) Ошибка проектирования: невозможность остановить программу.
Резолюция: исправлена; на экране отображается подсказка – “ Для выхода нажмите <Ctrl + C> ”.
d) Ошибка кодирования: сумма (5) выводится в сторонеот слагаемых.
Резолюция: исправлена.
e) Ошибка кодирования: программа “зависает” на отрицательных числах.
Резолюция: исправлена; программа будет складывать и отрицательные числа.
f) Ошибка кодирования: программа интерпретирует третий введенный символ как нажатие < Enter >.
Резолюция: в работе (ещё не исправлена).
g) Ошибка кодирования: сбой при вводе нечисловых данных.
Резолюция: не проблема.
Примечание: не выполняйтеэтой операции.
h) Ошибка кодирования: сбой при вводе управляющих символов.
Резолюция: не проблема.
Примечание: не используйте управляющие символы.
i) Ошибка кодирования: сбой при нажатии функциональных клавиш.
Резолюция: не проблема.
Примечание: не используйте функциональные клавиши.
Шаг 1. Ознакомление с резолюцией программиста.
Так ознакомившись с резолюцией программиста, узнаете, что нужно делать, а чего не нужно. Как видите, хорошо, что не разрабатывали тестов для проверки кода обработки ошибок: этого кода нет и не будет. Более того, хотя программа и будет теперь обрабатывать отрицательные числа, она будет обрабатывать их не все, а только до -9. Числа от -10 до 199 длиной в три символа она по-прежнему не обрабатывает, интерпретируя третий символ как нажатие клавиши < Enter >. Обратившись к разработанной ранее серии тестов из таблицы 6, видно, что тесты с числами -99, -78 и -14 запускать не придётся. Вместо -78 и -14 необходимо взять пару однозначных отрицательных чисел.
Очень часто программист просит протестировать остальную часть программы, в то время как он занимается исправлением уже найденных ошибок – и это разумно. Некоторые из запланированных тестов нет смысла проводить до исправления ошибки, с другими же вполне можно поработать. Если ждать, пока можно будет провести “лучшие” из тестов, можно оставить без внимания целые области программы, на которые потом уже не хватит времени. В нашем примере можно протестировать числа между -1 и -9 – так хоть и не полностью, но будет проверено, как работает сложение отрицательных чисел, вместо того чтобы опустить эту проверку вообще.
Из резолюций на отчетах видно, какие тесты больше проводить не нужно, а какие нужно заменить новыми. Станут ли резолюции программиста ключом к созданию новых серий тестов? Без сомнения.
Шаг 2. Анализ комментариев к ошибкам, которые не будут исправлены.
Возможно, следует провести дополнительное тестирование. В нашей программе хуже всего обстоит дело с обработкой ошибок. Программист не собирается исправлять ситуацию. Как же быть? Чтобы добиться исправления ошибки, нужно продемонстрировать ситуацию, в которой её появление абсолютно недопустимо.
Чтобы придумать самые показательные примеры недопустимого поведения программы, необходимо постараться выявить суть ситуации. В нашем случае программа “зависает”, когда нажимаются определенные клавиши. Так она ведет себя с буквами, управляющими и функциональными клавишами. Фактически программа “зависает” при вводе любого недопустимого (нецифрового) символа. Программист говорит, что таких символов вводить не должны. С точки зрения тестировщика, программа должна вести себя вежливо и не заставлять перезапускать компьютер каждый раз, когда будет сделано что-то не так.
Программа также некорректно ведет себя в ответ на нажатие некоторых клавиш. Программист считает, что это не страшно, поскольку никто и не ждет, что программа примет эти клавиши. А что, если программа “зависнет” в ответ на ввод символов, которые, по мнению пользователя, она должна принять?! Если найти достаточно таких символов, программисту придется написать код для их обработки, а заодно уж он может обработать и остальные символы.
Подумаем, какие же клавиши люди могут нажимать при работе с арифметической программой. Здесь нужно применять методику мозгового штурма. Запишите все клавиши, которые могут прийти человеку. Запишите, почему эти клавиши могут показаться уместными, при этом беспокойтесь, согласится ли программист с вашими предположениями – позднее можно ещё пересмотреть список и отобрать из него самое существенное. Вот вероятный список таких клавиш:
a) цифры;
b) знак минус (‘-’);
c) знак плюс (‘+’);
d) пробел до числа;
e) пробел после числа;
f) операции умножения и деления без остатка (‘*’, ‘/’);
g) знак доллара (‘$’);
h) знак процента (‘%’);
i) скобки;
j) клавиша < Backspace >;
k) клавиша < Detete >;
l) клавиша < lnsert >;
m) клавиши управления курсором.
Шаг 3. Просмотр записей, которые были сделаны в прошлый раз.
Необходимо добавить к предыдущим замечаниям новые и приступить к тестированию. Сначала повторяются старые тесты и убедившись, что программа по-прежнему сможет сложить 2 и 2 и не получить при этом 5, т.е. обязательно тестируется логика программы.
По характеру дела видно, что программа отображает подсказку “ Для выхода нажмите «Ctrl + C» ” по каждой операции сложения. Вот что отображается при этом на экране:
? 99
? 99
198 –Для выхода нажмите «Ctrl + C»
? -9
? -9
-18 –Для выхода нажмите «Ctrl + C»
? _
Программист говорит, что программа должна работать быстро. В таком случае всё, на что тратится лишнее время, является ошибкой.
Составляете отчёты по следующим ошибкам:
a) Ошибка проектирования. Для вывода на экран подсказки тратится лишнее компьютерное время. Поскольку одной из задач разработки является создание очень быстрой программы, это ошибка. Почему бы просто не написать “ Для выхода нажмите «Ctrl + C»” внизу экрана, сразу при запуске программы и никогда больше ничего не выводить в этой строчке? Если программист достаточно аккуратен, большая часть тестов, включая и те, которые потребовали наибольшей изобретательности, не выявит ошибок.
b) Ошибка кодирования. Проблема такова – в ответ на нажатие клавиш редактирования и других предположительно допустимых клавиш программа “зависает”. Предлагаемое исправление – проверять каждый вводимый символ. Недопустимые символы игнорировать или выводить сообщение об ошибке.
Хороший тестировщик – не тот, кто выявит больше всего ошибок, и не тот, кто заставит смутиться даже самого первоклассного программиста. Лучшим является тот, кто добьётся исправления наибольшего количества ошибок.
Варианты задания к лабораторной работе:
1. Нахождение наибольшего общего делителя при условии, что начальные значения
и оложительны.
2. Вычисление факториала неотрицательного целого числа.
3. Вычисление чисел Фибоначчи.
4. Поиск заданного символа в строке.
5. Выполнение конкатенации (сцепления) строк.
6. Определить частное q и остаток r от деления x на y.
7. Линейный поиск в упорядоченном по возрастанию элементов массиве A [1.. n ]. Определить порядковый номер m некоторого значения х.
8. Поиск значения х в двумерном массиве.
9. Написать программу, которая по данному фиксированному массиву B [0.. n – 1], где
n > 0, записывает в d число нечётных значений в B [0.. n – 1].
10. Нахождение наибольшего целого числа по данному фиксированному целому числу
m > 0, которое не больше n, в массиве целых чисел.
11. Суммирование элементов массива B [0.. n – 1], где n > 0.
12. Вставка пробелов (выравнивание строки текста по правому краю).
13. Определение максимальной возрастающей подпоследовательности значений, идущих не обязательно подряд.
14. Перестановка двух неперекрывающихся сегментов массива равного размера.
15. Подсчёт числа листьев в дереве.
16. Удаление лишних пробелов в тексте.
17. Выполнение арифметических операций над комплексными числами.
Контрольные вопросы:
1. Что вы понимаете под тестированием и верификацией программных продуктов?
2. Какие типы ошибок существуют?
3. Что такое классы тестов и для чего они предназначены?
4. На какие шаги можно разбить первый цикл тестирования любой программы?
5. Для чего нужен второй цикл тестирования?