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

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

< Лекция 7 || Практическая работа 5: 12 || Лекция 8 >

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

Чтобы запустить все тесты в рамках проекта, необходимо просто запустить тестовый проект. Один из возможных способов сделать это — кликнуть правой кнопкой мыши на проекте BaseCalculator.Test в Solution explorer и выбрать Set as StartUp Project. Затем используем пункты меню Debug->Start (F5) или Debug->Start Without Debugging (Ctrl+F5), чтобы начать запуск тестов.

В окне Test Results будет показан список со всеми тестами проекта. В момент начала выполнения теста в нашем проекте содержалось два теста: один полностью реализованный тест AddTest, второй – неоконченный AddTest1. В момент запуска оба теста будут в состоянии "неоконченный" ( Pending ), но как только тесты будет выполнены, появятся результаты выполнения Passed и Inconcluiseve, которые мы и ожидали (Рис. 12.3).

Окно Test Results после выполнения всех тестов

Рис. 12.3. Окно Test Results после выполнения всех тестов

Замечание. Рис. 12.3 показывает окно Test Results. На этом скриншоте в дополнение к колонкам по умолчанию изображена колонка Error Message. Колонки могут быть добавлены или удалены правым щелчком мыши по меню на заголовках колонки и выборе пункта меню Add/Remove Columns... .

Чтобы посмотреть дополнительные детали о тесте, мы можем дважды щелкнуть на нем в окне Test Results и открыть окно AddTest[Result] (рис. 12.4). В нем можно узнать информацию о скорости выполнения теста, его результате, возникшей ошибке и прочее.

Окно детального описания теста AddTest [Results]

Рис. 12.4. Окно детального описания теста AddTest [Results]

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

12.3.4. Обработка исключений

На прошлом семинаре мы обнаружили, что метод RunEstimate() класса AnalaizerClass не достаточно хорошо проверяет объекты, с которыми он работает. Если инициализировать список opz значением {2,2,+,+}, то выполнение метода RunEstimate() приводит к генерации исключения. Действительно, реализуем тест:

/// <summary>
///A test for RunEstimate ()
///</summary>
[DeploymentItem("BaseCalculator.exe")]
[TestMethod()]
public void RunEstimateTest()
{
    string expected = null;
    string actual;
    // Подготовка тестового окружения
    BaseCalculator.Test.BaseCalculator_CalcClassAccessor._lastError = "";
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz = 
                                                  new System.Collections.ArrayList();
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz.Add("2");
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz.Add("2");
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz.Add("+");
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz.Add("+");

    actual = BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.RunEstimate();

    Assert.AreEqual(expected, actual, 
                    "BaseCalculator.AnalaizerClass.RunEstimate did not return the expected value.");
}
12.1.

Замечание. Для работы этого теста необходимо создать начальное тестовое окружение, при этом значение _lastError необходимо очистить, так как оно будет "испорчено" тестом AddTest1(). Подробнее о зависимости тестов от порядка выполнения и тестового окружения мы поговорим на девятом семинаре.

Несмотря на то, что явных блоков try-catch не стоит, сгенерированное исключение не приведет к прекращению работы тестов, а будет корректно обработано. В этом можно убедиться, загляну в окно на RunEstimateTest[Result] (рис. 12.5).

Результат работы RunEstimateTest

Рис. 12.5. Результат работы RunEstimateTest

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

/// <summary>
///A test for RunEstimate ()
///</summary>
[DeploymentItem("BaseCalculator.exe")]
[TestMethod()]
[ExpectedException(typeof(ArgumentOutOfRangeException),
                   "Была обработана неверная синтаксическая конструкция")]
public void RunEstimateTest1()
{
    BaseCalculator.Test.BaseCalculator_CalcClassAccessor._lastError = "";
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz = 
                                                  new System.Collections.ArrayList();
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz.Add("2");
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz.Add("2");
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz.Add("+");
    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.opz.Add("+");

    BaseCalculator.Test.BaseCalculator_AnalaizerClassAccessor.RunEstimate();
}
12.2.

Отметим, что, опять же, нет блока try-catch с явным тестом на ArgumentOutOfRangeException. Вместо этого тест включает дополнительный атрибут, ExpectedException, который принимает тип параметра, и произвольное сообщение об ошибке, которое будет показано, если исключение не было брошено. Когда тесты выполняются, среда будет явно следить за тем, чтобы исключение ArgumentException было сгенерировано, и если метод не будет генерировать такое исключение, то тест будет провален.

12.4. Раздаточный материал

12.4.1. Программа

Будут выданы исходные файлы модулей для тестирования методом "белого ящика" средствами MVSTE, пример тестового драйвера.

12.5. Домашнее задание

Составить тест-план и провести модульное тестирование (средствами MVSTE) следующих методов:

  1. public static int Mod(long a, long b)
      public static bool CheckCurrency()
  2. public static int ABS(long a)
      public static string Format()
  3. public static int IABS(long a)
      public static string Format()
  4. public static int Sub(long a, long b)
      public static System.Collections.ArrayList CreateStack()
  5. public static int Mult(long a, long b)
      public static System.Collections.ArrayList CreateStack()
  6. public static int Div(long a, long b)
      public static bool CheckCurrency()
< Лекция 7 || Практическая работа 5: 12 || Лекция 8 >
Илья Макаренко
Илья Макаренко

Добрый день.

Вопрос №1

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

Вопрос №2

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

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

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

Денис Сафронов
Денис Сафронов
Россия
жылдыз насырбекова
жылдыз насырбекова
Киргизия, бишкек