В процессе тестирования программного обеспечения осуществляются следующие виды деятельности:
Ручной прогон. На этом шаге программист с помощью карандаша и листа бумаги моделирует прохождение данных через программу. При изучении текста программы от начала до конца, трудно проверить всевозможные комбинации данных. Самое большее, что можно сделать на практике, - проверить всевозможные типы или наиболее вероятные наборы комбинаций данных. Если они дают правильные результаты, предполагается, что непроверенные комбинации также дадут правильные результаты.
Проектирование тестов. Является наиболее ответственным процессом. Очень часто тест создается вручную. Иногда применяют генераторы тестовых данных - специальные программы, формирующие данные в соответствии со спецификациями, задаваемыми программистом. Тестовые данные могут систематически или случайно выбираться из другого заданного набора данных для уменьшения их общего количества.
Выполнение тестов. На этом этапе осуществляется проверка всех возможных алгоритмов специально подготовленными тестами, а также выявляется, насколько интерфейс программы выдержит реальную нагрузку. Проблема заключается в том, что тестирование происходит на очень ограниченных объемах данных. Когда база данных будет насчитывать десятки, а то и сотни тысяч записей, скорость выполнения запросов пользователей может стать неприемлемой.
Изучение результатов тестирования. Выявление и устранение ошибок часто имеет циклический характер. Устранение одной ошибки может порождать другие ошибки. Особенно это касается работы с глобальными переменными, которые коварны тем, что нельзя сказать с полной уверенностью, что где-то на нижнем уровне подпрограмм изменение состояния переменной не приведет к новой ошибке.
Программа состоит из модулей, что сильно облегчает тестирование, так как каждый модуль может быть отдельно проверен для всех возможных комбинаций, поскольку их число меньше. Если программа хорошо структурирована, необходимо проверять только интерфейс между проверенными ранее модулями. Даже если проверяются все варианты интерфейса, это является посильной ношей как для программиста, так и для вычислительной системы.
К сожалению, объектно-ориентированное программирование ускоряет создание сложных программ, но зато увеличивает число ошибок, которые к тому же очень тяжело искать.
Автономное тестирование модуля должно как минимум обеспечивать прохождение всех путей вычислений. Проектная процедура тестирования модуля состоит из следующих действий:
1) по внешним спецификациям модуля готовятся тесты для каждой ситуации и каждого недопустимого условия;
2) просматривается текст модуля с целью убедиться, что все условные переходы будут выполняться в каждом направлении. При необходимости добавляются соответствующие тесты;
3) изучается текст модуля с целью убедиться, что тесты охватывают достаточно много путей. Для циклов должны быть тесты без повторения, с одним повторением и с несколькими повторениями;
4) проверяется текст модуля, чтобы определить его чувствительность к особым значениям данных. Наиболее опасные числа это ноль и единица. В случае необходимости нужно добавить тесты.