- •1.Проблемы создания больших программ.
- •2. Основные понятия
- •3. Состав жизненного цикла по
- •1.Анализ требований
- •4.Стандартизация процессов жизненного цикла программ
- •5. Модели жизненного цикла программного обеспечения.
- •6.Техническое задание на разработку.
- •7.Документирование программ.
- •8.Выбор архитектуры по.
- •9.Структурный и объектный подходы к разработке программ.
- •10. Метод структурного анализа и проектирования sadt (idef0)
- •11. Диаграммы потоков данных dfd.
- •12. Диаграмма сущность – связь erm
- •13. Методы объектно-ориентированного анализа и проектирования. Язык uml.
- •14. Методы разработки структуры программной системы
- •15.Выбор языка программирования. Стиль программирования.
- •16.Защитное программирование.
- •17.Тестирование и отладка
- •18.Типичные ошибки
- •19.Отладка программных продуктов
- •20.Ввод в зксплуатацию
- •21.Ускорение разработки по. Технология rad
- •22. Экстремальное программирование
17.Тестирование и отладка
Тест-ние — процесс выполнения программ с целью обнаружения факта наличия ошибок. Это классическое определение тест-ния, принадлежащее Глеифорду Майерсу. Отладка — процесс локализации и устранения ошибок, обнаруженных при тест-нии ПО.
В нашей стране принято считать тест-ние одной из составляющих отладки. Отладку можно представить в виде многократного повторения трех процессов: тест-ния, в результате которого может быть констатировано наличие ошибки, поиска места ошибки в прогах и документации и редактирования программ и документации с целью устранения обнаруженной ошибки. Процесс отладки схематически может быть представлен в виде блок-схемы, приведенной на рис.
Выполнение программ при тест-нии производится на некотором наборе данных, для которого заранее известен результат применения или известны правила поведения этих программ. Указанный набор данных называют тестовым, или тестом. Тест-ние начинается с разработки множества тестов и их исполнения на основе одной из выбранных методик.
Для оценки результатов тест-ния используют эталонные файлы, которые содержат ожидаемые результаты работы проги (эталонные результаты). Основные варианты получения эталонных результатов таковы: ,
испол-ние справочников;
вычисление вручную;
испол-ние результатов, полученных при помощи другой проги, которой мы доверяем.
Тестовое покрытие — это набор тестов, покрывающих прогу (каждый линейный участок). Тестовое покрытие важно знать, чтобы определить участки кода, пропущенные при тест-нии.
После сравнения результатов работы проги с эталонными начинается либо диагностика проблемы (в случае расхождения результатов), либо оценка достаточности полноты тест-ния. Подготовка дополнительных тестов потребуется при недостаточной полноте тест-ния, невозможности локализовать проблему с помощью имеющихся тестов и необходимости выполнить контроль сделанного исправления.
Локализацией называют процесс определения оператора проги, выполнение которого вызвало нарушение нормального вычислительного процесса. Для исправления ошибки необходимо определить ее причину, т. е. определить оператор или фрагмент, содержащий ошибку. Причины ошибок Могут быть как очевидны, так и глубоко скрыты.
Стратегии тест-ния
Существуют два основных крайних подхода к выработке стратегии тест-ния программного продукта.
1.Тест-ние проги как черного ящика, при котором прога рассматривается как Объект, внутренняя структура которого неизвестна.
2.Тест-ние проги как прозрачного (белого) ящика подразумевает знание исходного кода проги и полный доступ к нему.
Первый подход заключается в том, что тесты проектируются только на основании изучения спецификаций программного средства (внешнего описания, описания архитектуры и спецификации модулей). Строение модулей при этом никак не учитывается, т. е. они рассматриваются как черные ящики.
Для выполнения такого тест-ния должны существовать спецификации проги, т. е. описание ее функц.возможностей и спецификации входных и выходных данных. Критерием исчерпывающего входного тест-ния может быть обнаружение всех ошибок. Но это может быть достигнуто, если в качестве тестовых наборов данных исполь-ть все возможные наборы данных и проверку реакции проги на невозможных наборах. Факт-ки такой подход требует полного перебора всех наборов входных данных, так как при испол-нии в качестве тестов только части этих наборов некоторые участки программ могут не работать ни на каком тесте, и, значит, содержащиеся в них ошибки не будут проявляться. Однако тест-ние прог полным множеством наборов входных данных практически неосуществимо.
Другой крайний подход заключается в том, что тесты спроектированы на основании изучения текстов прог с целью протестировать все пути выполнения каждой программ ПС. Если принять во внимание наличие в прогах циклов с переменным числом повторений, то различных путей выполнения программ ПС может оказаться чрезвычайно много, поэтому их тест-ние также будет практически невыполнимо.
Существует еще одно слабое звено тест-ния по логике, которое предусматривает показ соответствия проги и спецификаций документации. Однако ошибка возможна и в спецификациях. Например, если в проге пропущены некоторые необходимые маршруты, тест-ние по логике это не обнаружит.
Оптимальная стратегия проектирования тестов расположена внутри интервала между вышеприведенными подходами (рис.), но ближе к левому краю. Она включает проектирование значительной части тестов по спецификациям исходя из принципов: на каждую используемую функцию или возможность — хотя бы один тест, на каждую область и на каждую границу изменения какой-либо входной величины — хотя бы один тест, на каждый особый случай или на каждую исключительную ситуацию, указанную в спецификациях, — хотя бы один тест. Но она требует также проектирования некоторых тестов, и по текстам программ исходя из принципа (как минимум): каждая команда каждой проги ПС должна проработать хотя бы на одном тесте.
Разновидности тест-ния:
1.детерминированное — контролируются каждая комбинация исходных эталонных данных и соответствующая ей комбинация результатов функционирования программ. На практике полное детерминированное тест-ние обычно нереализуемо;
2. стохастическое— исходные тестовые данные берутся случайным образом, как правило, с испол-нием статистического распределения;
3. ручное — проводится без исполнения тестируемой проги на ПКе.
Поскольку задание на разработку ПО обычно формулируется не формально, то всдедствие неформализованное понятия ошибки в проге нельзя доказать формальными методами (математически) правильность программ. Невозможно показать правильность и тест-нием: оно может лишь продемонстрировать наличие в ПС ошибки. Другими словами, нельзя гарантировать, что тест-нием можно установить наличие каждой; имеющейся ошибки,
Для оптимизации набора тестов, т. е. для подготовки такого набора тестов, который позволял бы при заданном их числе (или при заданном интервале времени, обведенном на тест-ние) обнаруживать большее число ошибок, необходимо, во-первых, заранее планировать этот набор и, во-вторых, использовать рациональную стратегию планирования тестов. Планирование тестов можно начинать сразу же после завершения этапа внешнего описания.
Принципы тест-ния
Принципы тест-ния интуитивно ясны, однако на практике на них часто не обращают должного внимания.
Описание предполагаемых значений выходных данных или результатов должно быть необходимой частью тестового набора. Нарушение этого принципа может привести к тому, что правдоподобный, но неверный результат будет признан верным. Пожалуй, это наиболее опасный случай ошибки. Здесь проявляется чисто психоло.эффект; дадим то, что хотим видеть. Один из способов борьбы состоит в детальном анализе выходных данных. Тест должен включать две компоненты: описание входных данных и описание результата. В научно-технических задачах надо обязательно выполнять оценки точности решения. Для задач игровых и моделирования не всегда можно определить выходные данные, но в этом случае возможно описать поведение модели.
Следует избегать тест-ния программного продукта его автором. Создание ПП и его тест-ние — принципиально различные области деятельности. Процесс создания проги — конструктивный процесс. При тест-нии для выполнения проверок необходимо разделять проги на отдельные компоненты, т. е. процесс тест-ния является ко многом процессом разрушительным, деструктивным. После выполнения конструктивной части проектирования трудно быстро перестроиться на деструктивный образ мышления. Тест-ние подразделяют на простое и системное. Простое — тест-ние собственных компонент — может выполнять разработчик. Тест-ние системы в целом должны осуществлять специальные бригады, а отладку, т. е. исправление обнаруженных ошибок, автор.
Программирующая орг-ция не должна проводить тест-ние: аргументы те же, что в предыдущем случае. Программирующая орг-ций псих-ки настроена на созидательный труд. Надежность проги трудно оценить количественно. В соответствии с определением тест-ние можно рассматривать как средство уменьшения вероятности соответствия проги заданным параметрам. Разработчику крайне трудно настроиться на данный критерий и начать разрушать свой Продукт.
Необходимо тщательно изучать результаты каждого теста, для чего следует избегать невоспроизводимых тестов, документировать их пропуск через ПК. Принцип очевидный, но на практике им часто пренебрегают. Значительное количество ошибок, обнаруженных на поздних этапах тест-ния, можно было обнаружить на ранних тестах.
Тесты за пределами допустимого множества значений необходимо разрабатывать так же тщательно, как и в пределах допустимого. Если этого не делать, растет вер-ть получения ложного результата.
Необходимо проверять не только выполняет ли прога свои функции, но и не.выполняет ли она посторонние функции. Например, прога, выписывающая банковские счета, может правильно выписывать все необходимые счета, но если она еще выписывает несколько посторонних, то прога ошибочна.
Разработанные тесты слёдует сохранять. Эта проблема наиболее остра при интерактивной отладке, когда тестирующий по ходу диалога придумывает и выполняет тесты. Естественно, эти тесты не фиксируются и не сохраняются. После обнаружения ошибку исправляют, и продукт надо снова протестировать. Если тесты не сохранены, они придумываются снова, естественно менее тщательно.
Как отмечалось ранее,; может возникнуть каскадное размножение ошибок, и продукт разваливается, Если в прогу были внесены изменения, напр. в резалте устранения ошибки, то следует пропустить все тесты, связанные с проверкой работы какой-либо проги или ее взаимодействия с другими прогами заново.