Поделиться через


Пошаговое руководство. Создание и запуск модульных тестов

В руководстве приводится пошаговое описание процесса создания, запуска и настройки набора тестов с помощью Microsoft Visual Studio 2010. В руководстве производится создание проекта C#, находящегося в стадии разработки, создание тестов для проверки его кода, запуск тестов и изучение результатов. После этого производится изменение кода проекта и повторный запуск тестов.

Примечание

Сведения о запуске тестов из командной строки см. в разделе Пошаговое руководство. Использование программы командной строки для тестирования.

В этом пошаговом руководстве выполняются следующие задачи.

  • Подготовка проекта "Bank Account", который будет использоваться в данном руководстве.

  • Открытие существующего проекта.

  • Создание модульных тестов для открытых и закрытых методов.

  • Применение тестов к коду.

  • Обнаружение и исправление ошибок в тестах.

  • Обнаружение и исправление ошибок в коде.

Обязательные компоненты

Подготовка к выполнению пошагового руководства

Подготовка к выполнению пошагового руководства

  1. Откройте Visual Studio 2010 Premium.

  2. В меню Файл выберите пункт Создать, а затем команду Проект.

    Отобразится диалоговое окно Новый проект.

  3. В области Установленные шаблоны выберите шаблон Visual C#.

  4. В списке типов приложения выберите пункт Библиотека классов.

  5. В поле Имя введите Bank и нажмите кнопку ОК.

    Примечание

    Если имя "Bank" уже существует, выберите для проекта другое имя.

    Будет создан новый проект Bank. Этот проект отобразится в обозревателе решений, а его файл Class1.cs откроется в редакторе кода.

    Примечание

    Если файл Class1.cs не откроется в редакторе кода, дважды щелкните Class1.cs в обозревателе решений, чтобы открыть этот файл.

  6. Скопируйте исходный код из раздела Пример проекта для создания модульных тестов.

  7. Замените исходное содержимое файла Class1.cs кодом из примера Пример проекта для создания модульных тестов.

  8. В меню Построение выберите Построить решение.

Будет создан проект с именем "Bank". Он содержит исходный код, подлежащий тестированию, и средства для его тестирования. Пространство имен проекта "Bank", BankAccountNS, содержит открытый класс BankAccount, методы которого будут тестироваться в приведенных ниже процедурах.

Создание модульного теста

Предварительное требование: необходимо выполнить действия, приведенные в подразделе Подготовка к выполнению пошагового руководства.

Создание модульного теста

  1. Если файл Class1.cs не откроется в редакторе кода, дважды щелкните Class1.cs в обозревателе решений в проекте Bank.

  2. В классе BankAccount, расположенном в файле Class1.cs, перейдите к методу Debit().

  3. Щелкните правой кнопкой мыши метод Debit() и выберите команду Создать модульные тесты.

    Откроется диалоговое окно Создать модульные тесты.

    В области Текущий выбор отображается древовидная структура, отражающая иерархию классов и членов сборки, в которую включен класс BankAccount. С помощью данной страницы можно создавать модульные тесты для любых выбранных членов, а также выбирать тестовый проект, в который будут помещаться созданные модульные тесты.

    В древовидной структуре выделен только метод Debit(). Оставьте это выделение и также выделите метод Credit().

  4. В области Выходной проект выберите Создать новый тестовый проект Visual C#.

  5. Щелкните Параметры.

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

  6. В диалоговом окне Создать модульные тесты нажмите кнопку ОК.

    Откроется диалоговое окно Новый тестовый проект.

  7. Оставьте имя по умолчанию и нажмите кнопку Создать.

    При этом будет создан проект с именем "TestProject1", отображаемый в обозревателе решений.

    В проект TestProject1 добавляется файл BankAccountTest.cs, содержащий тестовый класс. В класс включается свойство TestContext и методы для тестирования методов Debit() и Credit().

    Примечание

    Каждому методу тестирования автоматически присваивается атрибут TestMethod().Каждый тест соответствует отдельному методу в тестируемом коде, подлежащему проверке.Методы теста включены в тестовый класс, которому присвоен атрибут TestClass().

  8. В файле BankAccountTest.cs укажите значения переменных, подлежащих тестированию. Перейдите к методу DebitTest, в котором имеются строки // TODO, указывающие переменные, которые необходимо задать.

  9. Чтобы узнать, какое из значений нужно использовать для метода DebitTest, откройте файл Class1.cs и перейдите к методу Main. Обратите внимание, что переменная customerName инициализируется значением Mr. Bryan Walton, переменная balance — значением 11,99, метод Credit вызывается с параметром 5,77, а метод Debit вызывается с параметром 11,22. Таким образом, при инициализации переменной Balance значением 11,99 вызов метода Debit с параметром 11,22 должен привести к изменению значения переменной Balance на 0,77.

    Примечание

    Это предполагаемое значение переменной Balance (0,77) будет использовано далее в этом пошаговом руководстве.

  10. В файле BankAccountTest.cs перейдите к методу DebitTest.

  11. Установите следующие значения:

    BankAccount target = new BankAccount("Mr. Bryan Walton", 11.99);
    double amount = 11.22;
    
  12. В методе CreditTest добавьте "Mr. Bryan Walton", 11,99) в новый класс BankAccount.

  13. Сохраните файл BankAccountTest.cs.

Был создан файл исходного кода, содержащий тесты для проекта "Bank". Теперь все готово к выполнению тестов в классе BankAccountTest в применению к коду проекта "Bank".

Запуск и настройка модульного теста

Предварительное требование: необходимо выполнить процедуру Создание модульного теста.

Запуск и настройка модульного теста

  1. В меню Тест выберите пункт Окна и Представление теста.

    Откроется окно представления теста.

  2. Щелкните правой кнопкой мыши элемент DebitTest и выберите команду Выполнить выбранное.

    Откроется окно Результаты теста, если оно не было открыто ранее. Запустится тест DebitTest.

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

  3. В окне Результаты проверки щелкните правой кнопкой мыши строку, соответствующую тесту, и выберите команду Просмотреть подробные результаты теста.

  4. На странице Подробные результаты теста отображается сообщение об ошибке "Сбой Assert.Inconclusive. Невозможно проверить метод, не возвращающий значение." Для создания успешно выполняемого теста необходимо найти и проверить оператор Assert.

  5. Чтобы найти метод теста, содержащий оператор Assert, откройте файл BankAccountTest.cs и перейдите к методу DebitTest().

  6. Оператор Assert находится в последней строке метода DebitTest. Он имеет следующий вид.

    Assert.Inconclusive("A method that does not return a value cannot be verified.");
    

    Преобразуйте этот оператор Assert в комментарий.

  7. Теперь при запуске теста результат будет Пройден, однако только потому, что при тестировании сравнение производится с Nothing. Необходимо добавить код для тестирования путем сравнения с ожидаемыми результатами. Добавьте следующий оператор в конец метода DebitTest.

    Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05);
    

    Этот оператор сравнивает ожидаемый результат (0,77) с фактическим результатом, возвращаемым при вызове метода Balance класса BankAccount. Если значения не равны, оператор Assert возвращает False, что приводит к неудачной проверке.

    Примечание

    В этом операторе Assert содержится третий параметр, delta со значением 0,05.Параметр delta является обязательным для этой перегруженной версии метода Assert.AreEqual; он компенсирует погрешность округления, характерную для типов с плавающей запятой, например Doubles.

Итак, был выполнен созданный метод DebitTest тестового класса BankAccountTest, был сделан вывод о необходимости внесения в него изменений, и соответствующие изменения были произведены. Теперь метод можно использовать для проверки правильности выполнения метода Debit в приложении.

Выполнение модульного теста и исправление кода

Предварительное требование: необходимо выполнить процедуру Запуск и настройка модульного теста.

Выполнение модульного теста и исправление кода

  1. Повторно запустите тест Debit. В файле BankAccountTest.cs щелкните правой кнопкой мыши метод DebitTest() и выберите команду Выполнить тесты.

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

  2. В окне Результаты проверки щелкните правой кнопкой мыши строку, соответствующую тесту, и выберите команду Просмотреть подробные результаты теста.

    Это приводит к открытию страницы "Сведения о результатах", на которой отображается сообщение об ошибке "Сбой Assert.AreEqual. Ожидалось различие, не большее чем <0,05> между ожидаемым значением <0,77> и фактическим значением <23,21>". Эти числа указывают на ошибку при выполнении математической операции. Так как метод DebitTest тестового класса BankAccountTest проверяет метод Debit класса BankAccount, следует начать с проверки метода Debit.

  3. Откройте файл Class1.cs и перейдите к методу Debit.

  4. Обратите внимание на следующий оператор присваивания:

    m_balance += amount;
    

    Этот оператор добавляет к переменной Balance значение переменной Amount, хотя в методе Debit он должен производить вычитание. Измените эту строку следующим образом:

    m_balance -= amount;
    
  5. Повторно запустите тест Debit.

    В столбце Результат в окне "Результаты теста" для теста DebitTest отображается Пройден.

    Примечание

    После изменения исходного кода нет необходимости в повторном построении тестового проекта, так как запуск теста приводит к автоматическому построению проекта.

Итак, был создан модульный тест и с его помощью выявлена и устранена ошибка в коде.

Создание и выполнение модульного теста для закрытого метода

Предварительное требование: необходимо выполнить процедуру Выполнение модульного теста и исправление кода.

Создание и выполнение модульного теста для закрытого метода

  1. Откройте файл Class1.cs в проекте Bank.

  2. Щелкните правой кнопкой мыши метод FreezeAccount() и выберите команду Создать модульные тесты.

    Откроется диалоговое окно Создать модульные тесты.

    В отображаемой древовидной структуре выделен только метод FreezeAccount().

  3. (Необязательно.) Щелкните Фильтр и снимите флажок Отображать не общедоступные элементы. Обратите внимание, что метод FreezeAccount() удален из списка дочерних методов класса BankAccount. Повторно щелкните Фильтр и установите флажок Отображать не общедоступные элементы, чтобы повторно отобразить метод FreezeAccount().

  4. Убедитесь, что выбран метод FreezeAccount(), и нажмите кнопку ОК.

    Это приведет к созданию нового файла закрытого метода доступа с именем Bank.accessor. Он содержит специальные методы доступа, которые используются тестом для косвенного вызова закрытых методов в классе BankAccount. Новый файл появится в обозревателе решений в папке Test References.

  5. Откройте файл BankAccountTest.cs и перейдите к методу FreezeAccountTest().

  6. Измените код метода FreezeAccountTest(), чтобы он выглядел следующим образом. Измененные и новые фрагменты выделены.

    public void FreezeAccountTest()
    {
        BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton", 11.99); // TODO: Initialize to an appropriate value
    target.FreezeAccount(); 
        // Assert.Inconclusive("A method that does not return a value cannot be verified.");
        
        bool creditAccount = false; // False means account could be credited: Fail test. 
        // Try to credit account
        try
        {
            target.Credit(1.00); 
        }
        catch (System.Exception)
        {
            // Threw exception. FreezeAccount worked correctly: Pass test. 
            creditAccount = true;
        }
        
        // Assert fails if 'creditAccount' condition is false. Fail test.
        Assert.IsTrue(creditAccount, "Was able to credit account.");
    }
    
  7. Запустите тест FreezeAccountTest.

    В столбце Результат в окне "Результаты теста" окончательное состояние теста отображается как Пройден. Этот результат является ожидаемым, поскольку тест вызвал метод Credit() после того, как счет был заморожен вызовом метода FreezeAccount().

Итак, был добавлен закрытый метод, создан новый модульный тест для этого метода и произведен запуск теста. Тест можно запускать повторно, используя другие граничные значения для переменной balance, например 15,00.

Следующие действия

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

Запуск тестов может производиться из командной строки вместо использования Visual Studio. Дополнительные сведения см. в разделе Пошаговое руководство. Использование программы командной строки для тестирования.

Visual Studio 2010 Ultimate позволяет создавать нагрузочные тесты для выявления затруднений, обусловленных нагрузкой и производительностью, используя модульные тесты.

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

См. также

Задачи

Пример проекта для создания модульных тестов