- •2. По сфере применения
- •2. Разработка пользовательского интерфейса
- •3. Разработка программы
- •4. Отладка
- •5. Внедрение
- •6. Трансляция и интерпретация программ
- •7. Среды и реализации языков программирования
- •9. Теория первичных программ
- •11. Представление алгоритма и псевдокод
- •12. Алгоритм последовательного поиска
- •13. Алгоритм двоичного поиска
- •14. Алгоритм сортировки методом вставки
- •15. Модульное программирование
- •2.1. Нижнюю половину можно одеть в два этапа:
- •2.2. Верхнюю половину можно также одеть в два этапа:
- •20. Принципы объектно-ориентированного программирования
- •5.9. Оптимизация
- •5.3. Ход тестирования
- •5.4. Автономное тестирование модулей программы
- •5.5. Методы тестирования
- •5.6. Аксиомы тестирования
- •5.7. Классификация тестов
5.5. Методы тестирования
Существует два крайних подхода к проектированию тестов. Сторонники первого подхода создают тесты, исследуя внешние спецификации сопряжения программы или модуля, который необходимо протестировать. В этом случае программа является как бы «черным ящиком». Необходимо проверить все возможные комбинации и значения на входе. Обычно их слишком много даже для простейших алгоритмов. Для программы расчета среднего арифметического четырех чисел надо готовить 107 тестовых данных.
Сторонники второго подхода связывают тесты только с логикой программы. При этом стремятся, чтобы каждая команда была бы выполнена хотя бы один раз. Цикл должен выполняться один раз, ни разу, максимальное число раз. Такое тестирование всех путей извне также недостижимо. В программе из двух последовательных циклов, внутри каждого из которых включено ветвление на десять путей имеется 1018 путей расчета.
Чтобы построить разумную стратегию тестирования надо разумно сочетать оба этих подхода и пользоваться математическими доказательствами.
Восходящее тестирование. Сначала автономно тестируются модули нижних уровней, которые не вызывают других модулей. При этом достигается такая же их высокая надежность, как и у встроенных в компилятор функций. Затем тестируются модули более высоких уровней вместе с уже проверенными модулями и так далее по схеме иерархии.
Нисходящее тестирование. При этом подходе изолированно тестируется головной модуль или группа модулей головного ядра. Программа собирается и тестируется сверху вниз. Недостающие модули заменяются заглушками. Достоинством этого подхода является то, что тестирование модуля совмещается с тестированием сопряжений.
Модифицированный нисходящий метод. Согласно этому методу каждый модуль автономно тестируется перед включением в программу, собираемую сверху вниз.
Метод большого скачка. Каждый модуль тестируется автономно. По окончании автономного тестирования все модули интегрируются в готовую программную систему. Этот метод применяется, если программа мала и хорошо спроектирована по сопряжениям.
Метод сэндвича. Представляет собой компромисс между нисходящим и восходящим подходами. По этому методу реализация и тестирование ведется одновременно сверху и снизу, и два этих процесса встречаются в заранее намеченной точке.
Модифицированный метод сэндвича. Нижние модули тестируются снизу вверх, а модули верхних модулей сначала тестируются автономно, а затем собираются нисходящим методом.
5.6. Аксиомы тестирования
Тестирование программных систем в настоящее время остается в большей мере искусством, чем наукой. При проведении тестов рекомендуется придерживаться так называемых аксиом тестирования, представляющих собой эвристические приемы. Вот некоторые из них:
хорошим считается тот тест, в котором высока вероятность обнаружения ошибок;
тестирование собственной программы существенно осложняется психологическими причинами;
необходимой частью тестов считается описание выходных результатов;
нужно готовить тесты как для правильных, так, и для неправильных данных; ,
нельзя тестировать «с лету», наскоком;
необходимо тщательно изучать результаты каждого теста;
по мере обнаружения все большего числа ошибок в программе, возрастает вероятность обнаружения в ней еще большего числа ошибок;
тестирование программ должны осуществлять самые лучшие и опытные программисты;
одной из главных задач разработчиков программы является возможность осуществления ее тестирования;
нельзя изменять программу только с целью облегчить процесс ее тестирования;
чем раньше спроектирован тест, тем выше вероятность выявления ошибок. Лучше всего готовить тесты еще на этапе проектирования системы;
процесс тестирования должен быть документирован и полностью управляем, хаотичность недопустима;
необходимы повторяемость и завершенность тестов;
следует избегать добавления новых тестов уже в процессе тестирования.
