Опубликован: 28.11.2007 | Уровень: специалист | Доступ: платный | ВУЗ: Национальный исследовательский ядерный университет «МИФИ»
Практическая работа 5:

Автоматизация модульного тестирования

< Лекция 7 || Практическая работа 5: 12 || Лекция 8 >
Аннотация: Семинар посвящен тестовому окружению, тестовым классам, тестовым проектам. Рассматривается подход XP (тесты перед кодом). Рассматриваются возможности MVSTE по тестированию модулей (Unit Testing).

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

12.1. Тест

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

  1. Тестовое окружение может использоваться для:

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

    Ответ: 1, 2, 4, 5

  2. Тестовое окружение для программного кода на структурных языках программирования состоит из:

    1. драйвера
    2. тестов
    3. заглушек
    4. исходного кода

    Ответ: 1, 3

  3. Модульное тестирование проводится для того, чтобы:

    1. удостовериться в корректной работе системы в целом
    2. удостовериться в корректной работе набора модулей
    3. удостовериться в корректной работе отдельного модуля

    Ответ: 3

  4. Модуль – это (с точки зрения наших семинарских занятий):

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

    Ответ: 2

  5. Какие основные задачи решаются в ходе модульного тестирования?

    1. Поиск и документирование несоответствий требованиям
    2. Поддержка разработки и рефакторинга низкоуровневой архитектуры системы и межмодульного взаимодействия
    3. Рефакторинг модулей
    4. Поддержка рефакторинга модулей
    5. Отладка
    6. Поддержка устранения дефектов и отладки

    Ответ: 1, 2, 4, 6

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

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

12.3. Возможности MVSTE по автоматизации модульного тестирования

Замечание. Подробнее о модульном тестировании можно почитать по адресу http://msdn2.microsoft.com/en-us/library/ms182515(VS.80).aspx

До сих пор мы выполняли часть работы вручную. Но при написании тестов тестировщик также может ошибиться, из-за чего в программе могут остаться различные ошибки. В случае, если программисты ведут разработку по методике экстремального программирования (XP), следуя практике написания тестов перед кодом (test driven development, TDD), количество тестов, которые нужно написать, становится по объему даже большим, чем сам код системы. Однако очевидно, что большую часть работы по разработке тестов отдельных методов (модульное тестирование, unit testing) можно автоматизировать. В MVSTE разработаны специальные средства для автоматизации модульного тестирования. Именно о них и пойдет речь дальше.

12.3.1. Начало работы

К моменту написания тестов мы уже имеем полностью готовый код. Можем приступить к созданию тестов.

12.3.2. Создание тестов

Для создания теста нажимаем правой кнопкой мыши на методе Add() и выбирая пункт меню Create Unit Tests... (рис. 12.1). Появится диалоговое окно, позволяющее создать тесты в другом проекте (рис. 12.2). По умолчанию, создаваемый проект — новый проект на Visual Basic, но также доступны тестовые проекты на C# и C ++. Выбираем Visual C# и нажимаем кнопку OK, перед тем введя имя проекта BaseCalculator.Test.

Пункт контекстного меню " Create Unit Tests ..." в методе Add()

Рис. 12.1. Пункт контекстного меню " Create Unit Tests ..." в методе Add()
Диалоговое окно "Create Unit tests"

Рис. 12.2. Диалоговое окно "Create Unit tests"

Созданный тестовый проект содержит четыре файла, связанных с тестированием.

Имя файла Примечание
AuthoringTest.txt Примечания о создании тестов, включающие инструкции по добавлению дополнительных тестов к проекту
CalcClassTest.cs Включает в себя сгенерированный тест для тестирования метода Add () наряду с методами для тестовой инициализации и очистки
ManualTest1.mht Шаблон, который заполняется инструкциями при ручном тестировании
UnitTest1.cs Пустая структура unit test класса, куда помещаются дополнительные тесты

Так как ручное тестирование мы уже провели, и файл для тестов у нас уже есть, то мы удалим ManualTest1.mht и UnitTest1.cs.

В раздел References при генерации тестового проекта добавляется ссылки на Microsoft.VisualStudio.QualityTools.UnitTestFramework и проект BaseCalculator, который и будет тестироваться. Первое – сборка, которую использует "движок" модульного тестирования при выполнении тестов. Второе — это ссылка на ту сборку, которую мы тестируем.

По умолчанию, сгенерированный тест-метод – это шаблон со следующей реализацией:

/// <summary>
///A test for Add (long, long)
///</summary>
[DeploymentItem("BaseCalculator.exe")]
[TestMethod()]
public void AddTest()
{
    long a = 0; // TODO: Initialize to an appropriate value

    long b = 0; // TODO: Initialize to an appropriate value

    int expected = 0;
    int actual;

    actual = BaseCalculator.Test.
       BaseCalculator_CalcClassAccessor.Add(a, b);

    Assert.AreEqual(expected, actual, 
        "BaseCalculator.CalcClass.Add did not return 
          the expected value.");
    Assert.Inconclusive("Verify the correctness of this test method.");
   }

Замечание. Сгенерированный код теста будет сильно зависеть от типа и сигнатуры того метода, который планируется тестировать. Например, мастер сгенерирует код, основанный на технологии reflection ("отражение"), для тестирования private функций. В нашем конкретном случае это не потребовалось, так как метод Add() объявлен как public().

Прежде всего, отметим, что сгенерированный код помечен атрибутом TestMethod типа TestMethodAttribute, а сам класс помечен атрибутом TestClassAttribute, которые объявлены в Microsoft.VisualStudio.QualityTools.UnitTesting.Framework. При помощи технологии Reflection движок модульного тестирования находит все тестовые классы в проекте, помеченные соответствующим атрибутом, а внутри все необходимые для тестирования методы.

Замечание. Об атрибутах можно почитать подробнее по адресу http://msdn2.microsoft.com/en-us/library/system.attribute(VS.80).aspx

В начале теста объявляется значение всех необходимых переменных, а также ожидаемое выходное значение. Затем происходит вызов нужного метода, которому передаются необходимые параметры. В нашем случае это

actual = BaseCalculator.Test.BaseCalculator_CalcClassAccessor.Add(a, b);

Затем идет вызов двух методов класса Assert. Прежде всего рассмотрим второй метод.

Assert.Inconclusive("Verify the correctness of this test method.");

Наличие этого метода в тесте говорит о том, что реализация теста еще не закончена. Сделаем реализацию нашего метода:

/// <summary>
///A test for Add (long, long)
///</summary>
[DeploymentItem("BaseCalculator.exe")]
[TestMethod()]
public void AddTest()
{
    long a = 150; 

    long b = 350; 

    int expected = 500;
    int actual;

    actual = BaseCalculator.
      Test.BaseCalculator_CalcClassAccessor.Add(a, b);

    Assert.AreEqual(expected, actual, 
           "BaseCalculator.CalcClass.
           Add did not return the expected value.");
}
< Лекция 7 || Практическая работа 5: 12 || Лекция 8 >
Илья Макаренко
Илья Макаренко

Добрый день.

Вопрос №1

Какова стоимость получения диплома о мини-МБА по данному курсу? Или ориентироваться на указанную на сайте?

Вопрос №2

Возможно ли начать обучение без потери результатов, не отправив документы на зачисление, а отправку выполнить позже?

Александр Медов
Александр Медов

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

Татьяна Россада
Татьяна Россада
Украина, Киев, КНУ имени Тараса Шевченка, 2009
Алексей Соболев
Алексей Соболев
Россия