Национальный исследовательский ядерный университет «МИФИ»
Опубликован: 28.11.2007 | Доступ: свободный | Студентов: 3887 / 335 | Оценка: 4.53 / 3.65 | Длительность: 22:18:00
ISBN: 978-5-94774-825-3
Специальности: Программист, Тестировщик
Практическая работа 3:

Тестовое окружение

< Лекция 4 || Практическая работа 3: 12 || Лекция 5 >
Аннотация: Семинар посвящен тестовому окружению. Рассматриваются вопросы проектирования тестового окружения, вводятся понятия тестовых классов и тестовых проектов.

Внимание! Для работы с этим семинаром необходимы учебные файлы, которые Вы можете загрузить здесь.

7.1. Тест

В каждом тестовом задании может быть несколько вариантов ответа. После проведения теста студенты могут попробовать обосновать свои неверные ответы.

  1. В основные обязанности тестировщика входят:

    1. Выявление ошибки
    2. Исправление ошибки
    3. Составление отчета об ошибке
    4. Объяснение причины ошибки
    5. Написание тестов

    Ответ: 1, 3, 5

  2. Одному тест-требованию может соответствовать:

    1. только один тестовый пример
    2. несколько тестовых примеров
    3. не более двух тестовых примеров

    Ответ: 2

  3. Два тестовых примера проверяют один и тот же класс эквивалентности:

    1. если от них получен один и тот же результат
    2. если от них получена одинаковая реакция системы
    3. если они построены по одному тест-требованию
    4. если от них ожидается получить одинаковую реакцию системы

    Ответ: 2, 4

  4. Сколько классов эквивалентности в общем случае выделяют для функции с двумя целочисленными входными параметрами и одним целочисленном выходным значением?

    1. 9
    2. 14
    3. 4
    4. 7
    5. 11

    Ответ: 3

  5. Ручное тестирование целесообразно применять:

    1. если тестовый пример не может быть выполнен в автоматическом режиме
    2. если тестовый пример построен по одному тест-требованию
    3. если автоматизация выполнения тестового примера очень сложна
    4. если автоматическое выполнение тестового примера требует много времени

    Ответ: 1, 3, 4

7.2. Проверка домашнего задания

Студенты приносят заполненные отчеты об ошибках для тех модулей, которые они тестировали. Преподаватель оценивает их тест-планы и смотрит, удалось ли студентам найти все допущенные в методах ошибки.

7.3. Тестовое окружение

7.3.1Теоретическое вступление

Основной объем тестирования практически любой сложной системы обычно выполняется в автоматическом режиме. Кроме того, тестируемая система обычно разбивается на отдельные модули, каждый из которых тестируется вначале отдельно от других, затем в комплексе.

Это означает, что для выполнения тестирования необходимо создать некоторую среду, которая обеспечит запуск и выполнение тестируемого модуля, передаст ему входные данные, соберет реальные выходные данные, полученные в результате работы системы на заданных входных данных (рис. 7.1). После этого среда должна сравнить реальные выходные данные с ожидаемыми и на основании данного сравнения сделать вывод о соответствии поведения модуля заданному.

Тестовое окружение также может использоваться для отчуждения отдельных модулей системы от всей системы. Разделение модулей системы на ранних этапах тестирования позволяет более точно локализовать проблемы, возникающие в их программном коде. Для поддержки работы модуля в отрыве от системы тестовое окружение должно моделировать поведение всех модулей, к функциям или данным которых обращается тестируемый модуль.

Поскольку тестовое окружение само является программой (причем, часто реализованной не на том языке программирования, на котором написана система), оно тоже должно быть протестировано. Целью тестирования тестового окружения является доказательство того, что тестовое окружение никаким образом не искажает выполнение тестируемого модуля и адекватно моделирует поведение системы.

Обобщенная схема среды тестирования

Рис. 7.1. Обобщенная схема среды тестирования

Тестовое окружение для программного кода на структурных языках программирования состоит из двух компонентов – драйвера, который обеспечивает запуск и выполнение тестируемого модуля, и заглушек, которые моделируют функции, вызываемые из данного модуля. Разработка тестового драйвера представляет собой отдельную задачу тестирования, сам драйвер должен быть протестирован, дабы исключить неверное тестирование. Драйвер и заглушки могут иметь различные уровни сложности, требуемый уровень сложности выбирается в зависимости от сложности тестируемого модуля и уровня тестирования. Так, драйвер может выполнять следующие функции:

  1. Вызов тестируемого модуля
  2. 1 + передача в тестируемый модуль входных значений и прием результатов
  3. 2 + вывод выходных значений
  4. 3 + протоколирование процесса тестирования и ключевых точек программы

Заглушки могут выполнять следующие функции:

  1. Не производить никаких действий (такие заглушки нужны для корректной сборки тестируемого модуля и
  2. Выводить сообщения о том, что заглушка была вызвана
  3. 1 + выводить сообщения со значениями параметров, переданных в функцию
  4. 2 + возвращать значение, заранее заданное во входных параметрах теста
  5. 3 + выводить значение, заранее заданное во входных параметрах теста
  6. 3 + принимать от тестируемого ПО значения и передавать их в драйвер

Тестовое окружение для объектно-ориентированного ПО выполняет те же самые функции, что и для структурных программ (на процедурных языках). Однако, оно имеет некоторые особенности, связанные с применением наследования и инкапсуляции.

Если при тестировании структурных программ минимальным тестируемым объектом является функция, то в объектно-ориентированным ПО минимальным объектом является класс. При применении принципа инкапсуляции все внутренние данные класса и некоторая часть его методов недоступна извне. В этом случае тестировщик лишен возможности обращаться в своих тестах к данным класса и произвольным образом вызывать методы; единственное, что ему доступно – вызывать методы внешнего интерфейса класса.

Существует несколько подходов к тестированию классов, каждый из них накладывает свои ограничения на структуру драйвера и заглушек.

  1. Драйвер создает один или больше объектов тестируемого класса, все обращения к объектам происходят только с использованием их внешнего интерфейса. Текст драйвера в этом случае представляет собой т.н. тестирующий класс, который содержит по одному методу для каждого тестового примера. Процесс тестирования заключается в последовательном вызове этих методов. Вместо заглушек в состав тестового окружения входит программный код реальной системы, соответственно, отсутствует изоляция тестируемого класса. Именно такой подход к тестированию принят сейчас в большинстве методологий и сред разработки. Его классическое название – unit testing (тестирование модулей).
  2. Аналогично предыдущему подходу, но для всех классов, которые использует тестируемый класс, создаются заглушки
  3. Программный код тестируемого класса модифицируется таким образом, чтобы открыть доступ ко всем его свойствам и методам. Строение тестового окружения в этом случае полностью аналогично окружению для тестирования структурных программ.
  4. Используются специальные средства доступа к закрытым данным и методам класса на уровне объектного или исполняемого кода – скрипты отладчика или accessors в Visual Studio.

Основное достоинство первых двух методов – при их использовании класс работает точно таким же образом, как в реальной системе. Однако в этом случае нельзя гарантировать того, что в процессе тестирования будет выполнен весь программный код класса и не останется непротестированных методов.

Основной недостаток 3-го метода – после изменения исходных текстов тестируемого модуля нельзя дать гарантии того, что класс будет вести себя таким же образом, как и исходный. В частности, это связано с тем, что изменение защиты данных класса влияет на наследование данных и методов другими классами.

Тестирование наследования – отдельная сложная задача в объектно-ориентированных системах. После того, как протестирован базовый класс, необходимо тестировать классы-потомки. Однако, для базового класса нельзя создавать заглушки, т.к. в этом случае можно пропустить возможные проблемы полиморфизма. Если класс-потомок использует методы базового класса для обработки собственных данных, необходимо убедиться в том, что эти методы работают.

Таким образом, иерархия классов может тестироваться сверху вниз, начиная от базового класса. Тестовое окружение при этом может меняться для каждой тестируемой конфигурации классов.

< Лекция 4 || Практическая работа 3: 12 || Лекция 5 >
Александр Медов
Александр Медов

Здравствуйте, какова полная сумма предоставленной услуги с печатью документа и отправкой по почте?

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Марина Дайнеко
Марина Дайнеко
Россия, Moscow, Nope, 2008
Михаил Адигеев
Михаил Адигеев
Россия