Одним из самых сложных и трудоемких этапов технологического процесса разработки программ является их тестирование и отладка. Как известно, при создании типичного программного проекта около 50% общего времени и более 50% общей стоимости расходуется на проверку (тестирование) разрабатываемой системы и ее отладку.
Под тестированием следует понимать процесс исполнения программы с целью обнаружения ошибок, в качестве которых принимается любое отклонение от эталонов. Хорошим считается тест, который имеет высокую вероятность обнаружения еще не выявленных ошибок.
Под отладкой понимается процесс, позволяющий получить программу, функционирующую с требуемыми характеристиками в заданной области входных данных. Таким образом, в результате отладки программа должна соответствовать некоторой фиксированной совокупности правил и показателей качества, принимаемой за эталонную для данной программы.
Эффективность тестирования является важнейшим фактором, определяющим стоимость и длительность разработки сложных комплексов программ с заданным качеством. Вследствие этого создаются различные методы тестирования, обеспечивающие наилучшее использование ресурсов проектирования.
Фактически, тестирование начинается еще в процессе кодирования очередной версии: оперативно тестируются и отлаживаются вновь разрабатываемые или изменяемые функции системы. Подобная организация работ позволяет сэкономить время и силы, поскольку значительная часть ошибок выявляется и устраняется практически в момент возникновения. Работа тестировщика (отладчика) на этом этапе как бы локализована в рамках одного модуля или части системы, разрабатываемой данной группой (для крупных систем), поэтому такое тестирование называется локальным.
При определенной степени готовности системы проводится перекрестное тестирование: разработчики различных частей «свежим взглядом» проверяют работу друг друга, одновременно обмениваясь опытом. При создании небольших программных продуктов, когда программист-разработчик одновременно является тестировщиком, этот этап обычно пропускается, часто незаслуженно.
И локальное, и перекрестное тестирование сопровождается проверкой исходного кода. Если работа тестировщика с системой – это поиск ошибок по их проявлениям в процессе выполнения программы, то работа с исходным кодом позволяет «отловить» ошибки, которые при обычном тестировании проявятся не сразу.
Существует два основных подхода к тестированию:
1) Тестирование программы как “черного ящика”. Программа рассматривается как черный ящик. Тестовые данные используются только в соответствии со спецификацией программы, т.е. без учета знаний о ее внутренней структуре. При таком подходе обнаружение всех ошибок в программе является критерием исчерпывающего входного тестирования. Последнее может быть достигнуто, если в качестве тестовых наборов использовать все возможные наборы входных данных. В этом случае для исчерпывающего тестирования требуются бесконечные наборы тестов. Однако существуют определенные методологии тестирования, позволяющие из всех возможных тестовых наборов выделить некоторое подмножество тестов, имеющих наивысшую вероятность обнаружения большинства ошибок.
2) Тестирование программы как “белого ящика”. Стратегия белого ящика, или стратегия тестирования, управляемого логикой программы, позволяет использовать внутреннюю структуру программы. В этом случае программист получает тестовые данные путем анализа логики программы.
Также существует 3 основных способа тестирования: алгоритмическое, аналитическое и содержательное.
Алгоритмическое тестирование
Алгоритмическое тестирование применяется программистом для контроля этапов алгоритмизации и программирования. Программисты проектируют тесты и начинают готовить эталонные результаты на этапе алгоритмизации, а используют их на этапе отладки.
Функциональное или аналитическое тестирование
Аналитическое тестирование служит для контроля выбранного метода решения задачи, правильности его работы в выбранных режимах и с установленными диапазонами данных. Тесты проектируют и начинают готовить сразу после выбора метода, а используют их на последнем этапе отладки или для анализа результатов пробного счета; в ходе тестирования, наряду со сверкой на совпадение, применяются и качественные оценки результатов.
Содержательное тестирование
Содержательное тестирование служит для проверки правильности постановки задачи. Для контроля при этом используются, как правило, качественные оценки и статистические характеристики программы, физический смысл полученных результатов и т.п. в проведении содержательного тестирования, принципы которого формулируются в техническом задании, самое активное участие должны принимать заказчики или идущие пользователи программы.
Содержательные и аналитические тесты проверяют правильность работы программы в целом или крупных ее частей, в то время как алгоритмические тесты в первую очередь должны проверять работу отдельных блоков или операторов программы.