Тестирование программного обеспечения — процесс исследования программного обеспечения (ПО) с целью получения информации о качестве продукта. Существует несколько признаков, по которым принято производить классификацию видов тестирования. Обычно выделяют следующие: по объекту тестирования, по знанию системы, по степени изолированности компонентов, по времени проведения тестирования, по признаку позитивности сценариев, по степени подготовленности к тестированию, по степени автоматизации ручное тестирование, автоматизированное тестирование, полуавтоматизированное тестирование).
Новые методологии программирования привели к интенсивным разработкам средств автоматизированного тестирования. Отличительные особенности проектирования автоматизированных средств тестирования вытекает из специфики задач, которые ставятся перед ними: 1) Объективная трудность тестирования: это деструктивный процесс. Поэтому, проектируемые средства должны вместо сбора и обработки информации выполнять её разбиение на части и проводить анализ этих частей. 2) Тестирование абсолютно всех возможных ситуаций бесконечно велико, поэтому проектируемые средства тестирования должны учитывать невозможность перебора всех возможных тестов.
Основные принципы организации тестирования: 1. Необходимой частью каждого теста должно являться описание ожидаемых результатов работы программы; 2. Программа не должна тестироваться её автором; 3. Необходимо подбирать тесты не только для правильных (предусмотренных) входных данных, но и для неправильных (непредусмотренных); 4. При анализе результатов каждого теста необходимо проверять, не делает ли программа того, что она не должна делать; 5. "Принцип скопления ошибок" - вероятность наличия не обнаруженных ошибок в некоторой части программы прямо пропорциональна числу ошибок, уже обнаруженных в этой части.
Процесс тестирования состоит из трёх этапов: 1. Проектирование тестов. 2. Исполнение тестов. 3. Анализ полученных результатов.
На первом этапе решается вопрос о выборе некоторого подмножества множества тестов, которое сможет найти наибольшее количество ошибок за наименьший промежуток времени. На этапе исполнения тестов проводят, запуск тестов и отлавливают ошибки в тестируемом программном продукте. Существует две методологии тестирования - "чёрного" и "белого" ящика. "Чёрный ящик" - тестирование функционального поведения программы с точки зрения внешнего мира (текст программы не используется). - "Белый ящик" - тестирование кода на предмет логики работы программы и корректности её работы с точки зрения компилятора того языка на котором она писалась. Полученные результаты тестирования позволяют сделать вывод о надёжности программного продукта. Они служат основой его сертификации и гарантией качества.
Чтобы облегчить и ускорить процесс тестирования широко применяют автоматизацию одного или ряда сложных этапов тестирования. Автоматизированные средства разрабатываются в основном для следующих этапов процесса тестирования: тестирование функциональных требований, тестирование пользовательского интерфейса, тестирование отдельных модулей, комплексное тестирование, анализ сложности программных модулей, тестирование покрытия программного кода, тестирование скорости загрузки системы, тестирование граничных русловий, тестирование утечки памяти
Существует два основных вида тестирования: функциональное и структурное. При функциональном тестировании программа рассматривается как "черный ящик" (то есть ее текст не используется). Происходит проверка соответствия поведения программы ее внешней спецификации. Критерием полноты тестирования в этом случае является перебор всех возможных значений входных данных, что невыполнимо. Поскольку исчерпывающее функциональное тестирование невозможно, речь может идти о разработки методов, позволяющих подбирать тесты не "вслепую", а с большой вероятностью обнаружения ошибок в программе.
При структурном тестировании программа рассматривается как "белый ящик" (т.е. ее текст открыт для пользования). Происходит проверка логики программы. Полным тестированием в этом случае будет такое, которое приведет к перебору всех возможных путей на графе передач управления программы (ее управляющем графе). Если ограничиться перебором только линейных не зависимых путей, то и в этом случае исчерпывающее структурное тестирование практически невозможно, т. к. неясно, как подбирать тесты, чтобы обеспечить "покрытие" всех таких путей. Поэтому при структурном тестировании необходимо использовать другие критерии его полноты, позволяющие достаточно просто контролировать их выполнение, но не дающие гарантии полной проверки логики программы. Но даже если предположить, что удалось достичь полного структурного тестирования некоторой программы, в ней тем не менее могут содержаться ошибки, т.к.
1) программа может не соответствовать своей внешней спецификации, что в частности, может привести к тому, что в ее управляющем графе окажутся пропущенными некоторые необходимые пути;
2) не будут обнаружены ошибки, появление которых зависит от обрабатываемых данных (т.е. на одних исходных данных программа работает правильно, а на других - с ошибкой).
Таким образом, ни структурное, ни функциональное тестирование не может быть исчерпывающим. Чтобы увеличить процент обнаружения ошибок при проведении функционального и структурного тестирования используют средства автоматизации тестирования.
Тестирование программного продукта одновременно проводится в 3-ёх направлениях:
1. Проверка кода (review): Тестер просматривает исходный код визуально и пытается найти нём ошибки, а так же различные несоответствия кода и требований к нему. Под требованием понимается стандарт, которого придерживается разработчики данного проекта, реакция на те или иные действия со стороны среды воздействия на ПО, поведение программного продукта в различных ситуациях.
2.Тестирование высокого уровня: Здесь главная цель тестирования - выяснить, удовлетворяет ли разработка всем требованиям заказчика. Для программного продукта пишутся эмуляторы, с помощью которых тестер может наблюдать за работой системы в роли оператора. Он видит, как система осуществляет диалог с пользователем, какие сообщения она выдаёт, как реагирует на различные события, сохраняет информацию и т.д.. Большинство обнаруживаемых ошибок на этом этапе связанно с ошибками взаимодействия программного продукта с пользователем - вывод ошибочных сообщений, не правильная реакция на запрос от оператора и т.п.
3.Тестирование низкого уровня: Тестер проверяет, на сколько логически полно исходный код покрывает всё возможные варианты работы системы, для которой он разрабатывается.
С точки зрения ISO 9126, качество программного обеспечения можно определить как совокупную характеристику исследуемого ПО с учётом следующих составляющих: надёжность, сопровождаемость, практичность, эффективность, мобильность и функциональность. Таким образом, с ростом важности информационных технологий для жизни общества возрастает цена ошибок в программах. В этих условиях на первый план выходят технологии и методы тестирования ПО, которые позволяют своевременно выявить и исправить эти ошибки.