Совместное тестирование модулей Известны два подхода к совместному тестированию модулей:
· пошаговое тестирование:
o нисходящее
o восходящее
· монолитное тестирование.
При монолитном тестированиисначала по отдельности тестируются все модули программного комплекса, а затем все они объединяются в рабочую программу для комплексного тестирования.
При пошаговом тестировании каждый модуль для своего тестирования подключается к набору уже проверенных модулей.
Нисходящее тестирование начинается с верхнего, головного класса (или модуля) программы. Очередной класс, выбранный для тестирования, должен быть один из классов, методы которого вызываются классом, предварительно прошедшим тестирование. В этом методе используется заглушки, замещающие нижние классы. После завершения тестирования очередного класса одна из заглушек заменяется реальным классом и добавляются заглушки, необходимые уже этому классу.
Восходящее тестирование начинается с тестирования терминальных классов (т. е. классов, не использующих методы других классов). Очередной тестируемый класс должен использовать уже оттестированные классы. В этом методе используется драйвер, т. е. программа, которая содержит фиксированные тестовые данные, вызывает тестируемый класс и отображает выходные результаты.
Сравнение нисходящего и восходящего тестирования
Преимущества
| Недостатки
| Нисходящее тестирование
| 1.Имеет преимущества, если ошибки главным образом в верхней части программы.
2.Представление теста облегчается после подключения функции ввода-вывода.
3.Раннее формирование структуры программы позволяет провести ее демонстрацию пользователю и служит моральным стимулом.
| 1.Необходимо разрабатывать заглушки.
2.Заглушки часто оказываются сложнее, чем кажется вначале.
3.До применения функций ввода-вывода может быть сложно представлять тестовые данные в заглушки.
4.Может оказаться трудным или невозможным создать тестовые условия.
5.Сложнее оценка результатов тестирования.
6.Допускается возможность формирования представления о совмещении тестирования и проектирования.
7.Стимулируется незавершение тестирования некоторых классов/модулей.
| Восходящее тестирование
| 1.Имеет преимущества, если ошибки главным образом в классе/модуле нижнего уровня.
2.Легче создавать тестовые условия.
3.Проще оценка результатов.
| 1.Необходимо разрабатывать драйверы.
2.Программа как единое целое не существует до тех пор, пока не добавлен последний класс/модуль.
| | | | Выделяются три стадии тестирования:
1. для обнаружения ошибок в программе;
2. для диагностики и локализации причин обнаруженных искажений результатов,
3. для контроля выполненных корректировок программ и данных.
Основная цель тестирования для обнаружения ошибок - выявление всех отклонений результатов функционирования реальной программы от заданных эталонных значений. Задача состоит в обнаружении максимально числа ошибок, в качестве которых принимается любое отклонение от эталонов. Чем больше ошибок выявляется на этой стадии при каждой операции тестирования, тем выше эффективность тестов и обоснованность затрат на их выполнение.
После этого тестирования применяется тестирование для диагностики и локализации причин возникновения ошибок. Основной целью здесь является выявление и оценивание причин появления ошибок. На этой стадии выбираются методы устранения ошибок, а также производится и само устранение выявленных ошибок.
На последней стадии производится контрольное тестирование. Основная цель его является подтверждение правильности выполненной корректировки программы.
Тестовые данныедля каждого теста должны обеспечивать проверку всех возможных условий возникновения ошибок. Первой целью любого тестирования является проверка на то чтобы убедиться работает ли программа вообще. Такую проверку называют дымовым тестом. Тест, который проверяет основные ветви программы, должен обнаружить грубые ошибки. Нужно подбирать простые тестовые данные, которые облегчают ручной контроль результатов. В некоторых случаях надо «миниатюризировать» программу, т.е. сокращать объём данных по сравнению с реальными.
Заключительные испытания должны обеспечить проверку всей программы в целом. Поэтому данные для этого теста должны быть как можно близкими к реальным при применении программы на этапе эксплуатации.
Типы тестовых данныхмогут быть различными, но все они сводятся к трём основным:
- создаваемые программистом;
- реальные модифицированные;
- реальные в полном объёме.
Каждый тест должен содержать определённый класс данных, который, в свою очередь, должен соответствовать:
· вычислению вручную;
· регистрации в книге или документации;
· получению результатов на другом ПK.
Тест является полным, если он удовлетворяет всем требованиям критериев тестирования. Полный тест называется успешным, если программа даёт правильные результаты при использовании этого теста.
Критерий тестирования надёжен и эффективен, если каждая отыскиваемая ошибка обнаруживается при использовании полного теста.
В тестировании многомодульных программных комплексов можно выделить 4 этапа:
- тестирование отдельных модулей;
- совместное тестирование модулей;
- тестирование функций программного комплекса (т.е. поиск различий между разработанной программой и ее внешней спецификацией);
- тестирование всего комплекса в целом (т.е. поиск несоответствия созданного программного продукта сформулированным ранее целям проектирования, отраженным обычно в техническом задании).
На первых двух этапах используются, прежде всего, методы структурного тестирования, т.к.: на последующих этапах тестирования эти методы использовать сложнее из-за больших размеров проверяемого программного обеспечения; последующие этапы тестирования ориентированы на обнаружение ошибок различного типа, которые не обязательно связаны с логикой программы.
Средства тестирования
Под средствами тестирования понимают:
1. Программы, которые помогают автоматизировать процесс испытаний.
2. Пакет подпрограмм, входящих в некоторую программу.
Хранение тестовых данных в целях их повторного тестирования.
Среди других вспомогательных средств тестирования можно выделить:
- Генератор тестовых данных. Он формирует данные для использования в проверяемой программе.
- Программы-утилиты.
3. Компаратор файлов - это программа, которая считывает два файла и выводит на печать их различающие результаты.
4. Программы-профилировщики. Они предназначены для отладки в тех случаях, когда надо выявить тс участки программы, которые не были использованы.
Тестовый монитор - это программа, которая пересылает нужные данные на вход тестируемого модуля и накапливает выходные данные, выдаваемые на печать или записывающие в файл.
Отладка программ.
Локализация и исправление ошибок называется отладкой.
Отладка — это процесс обнаружения причин возникновения ошибки и ее последующего исправления (в отличие от тестирования, являющегося процессом обнаружения самого факта существования ошибки).
Отладка включает в себя элементы тестирования и разработки. На некоторых проектах отладка может занимать до 50 % всего времени разработки. Для многих программистов отладка — это самая трудная часть программирования. При соответствующем подходе количество ошибок, требующих отладки, должно сократиться, и отладка должна стать самой легкой частью; при таком подходе все ошибки сводятся к небольшим недосмотрам
или опечаткам.
Как и тестирование, отладка не является способом улучшения качества ПО. Отладка — это всего лишь способ исправления дефектов в программе. Качество программ должно
обеспечиваться аккуратным анализом требований или прототипированием, грамотным проектированием и использованием лучших практик кодирования.
Виды ошибок:
Как правило, в абсолютном большинстве случаев ловятся на стадии компиляции программы. Но есть один существенный момент — когда выражение допустимо, но зависит от конкретного компилятора или интерпретатора.
- Ошибки во время выполнения.
К ошибкам во время выполнения программы относятся ошибки в логике и алгоритмах программы. Ошибки в логике программы связаны с неправильной записью алгоритма. К этому же классу ошибок относится неправильное обращение с памятью.
- Ошибки логики взаимосвязанных программ.
- Ошибки многопользовательского доступа.
Ошибки многопользовательских систем связаны с неправильным разграничением доступа к совместным ресурсам. Помимо файлов данных, записей в таблицах баз данных, общим ресурсов является генератор случайных чисел. Обязательно генерируйте случайные числа не только на основе времени, но и на основе уникального идентификатора процесса.
Ошибки многопользовательского доступа сложны тем, что могут не проявлять себя очень долго, до тех пор, пока в один и тот же момент времени системой ни будет запущено несколько копий одной программы.
- Невоспроизводимые ошибки.
Это наиболее сложный тип ошибок. Надо искать в программе случайности: одновременный доступ к одному ресурсу, генератор случайных чисел, неинициализированные переменные, некорректная работа с памятью или преобразование типов, которые могут проявлять себя не каждый раз.
- Ошибки инструментария и других компонентов системы.
Ошибки самого компилятора или интерпретатора очень редки, но и такие бывают.
Методы поиска ошибок:
1. Локализация ошибки. Программа — это черный ящик, который что-то принимает на вход и выдает что-то на выходе.
Первое, что вам необходимо сделать, — понять, где именно в этом черном ящике происходит сбой. Для этого уменьшайте количество параметров, передаваемых на вход программы. Добейтесь двух малоразличимых наборов входных параметров, чтобы при
одном из них программа работала, а при другом нет.
2. Отключение ненужных модулей программы. Закомментируйте все лишнее. Тем самым вы упростите вашу программу. Имеет смысл комментировать отдельные куски программы до тех пор, пока ошибка не исчезнет.
3. Использование отладчика.
Возможности современных отладчиков:
• точки останова на конкретных строчках кода;
• остановка на n-й итерации цикла;
• остановка при изменении переменных;
• остановка при присваивании конкретного значения;
• прохождение кода строчка за строчкой;
• откат по программе (далеко не все);
• исследование всех данных в программе, включая типы, определенные пользователем;
• присваивание новых значений переменным;
• продолжение исполнения программы;
• многоязыковая отладка (язык1, язык2, ассемблер...);
• запоминание установок.
|