Пошаговое руководство. Создание и запуск модульных тестов
Обновлен: Ноябрь 2007
В руководстве приводится пошаговое описание процесса создания, запуска и настройки набора тестов с помощью Team System (средства тестирования). В руководстве производится создание проекта C#, находящегося в стадии разработки, создание тестов для проверки его кода, запуск тестов и изучение результатов. После этого производится изменение кода проекта и повторный запуск тестов.
Примечание. |
---|
Сведения о запуске тестов из командной строки см. в разделе Пошаговое руководство. Использование программы командной строки для тестирования. |
В этом пошаговом руководстве выполняются следующие задачи.
Подготовка проекта "Bank Account", который будет использоваться в данном руководстве.
Открытие существующего проекта.
Создание модульных тестов для открытых и закрытых методов.
Применение тестов к коду.
Обнаружение и исправление ошибок в тестах.
Обнаружение и исправление ошибок в коде.
Обязательные компоненты
- Проект "Woodgrove Bank". См. раздел Пример модульного теста.
Подготовка к выполнению пошагового руководства
Подготовка к выполнению пошагового руководства
Откройте Visual Studio Team System Test Edition.
В меню Файл выберите пункт Создать, а затем команду Проект.
Откроется диалоговое окно Создать проект.
В списке Типы проектов выберите Visual C#.
В списке Шаблоны выберите Библиотека классов.
В поле Имя введите Bank и нажмите кнопку ОК.
Примечание. Если имя "Bank" уже существует, выберите для проекта другое имя.
Новый проект "Bank" будет создан и появится в обозревателе решений.
В обозревателе решений дважды щелкните файл Class1.cs, чтобы открыть его в редакторе кода Visual Studio.
Скопируйте исходный код из раздела Пример модульного теста.
Замените исходное содержимое файла Class1.cs кодом из примера Пример модульного теста.
В меню Построение выберите команду Построить решение.
Будет создан проект с именем "Bank". Он содержит исходный код, подлежащий тестированию, и средства для его тестирования. Пространство имен проекта "Bank", BankAccountNS, содержит открытый класс BankAccount, методы которого будут тестироваться в приведенных ниже процедурах.
Создание модульного теста
Предварительное требование: необходимо выполнить действия, приведенные в подразделе Подготовка к выполнению пошагового руководства.
Создание модульного теста
В обозревателе решений дважды щелкните файл Class1.cs в проекте "Bank".
Это приведет к открытию файла исходного кода для просмотра и редактирования.
В классе BankAccount, расположенном в файлеClass1.cs, перейдите к методу Debit().
Щелкните правой кнопкой мыши метод Debit() и выберите команду Создать модульные тесты.
Откроется диалоговое окно Создать модульные тесты.
В области Текущий выбор отображается древовидная структура, отражающая иерархию классов и членов сборки, в которую включен класс BankAccount. С помощью данной страницы можно создавать модульные тесты для любых выбранных членов, а также выбирать тестовый проект, в который будут помещаться созданные модульные тесты.
В древовидной структуре выделен только метод Debit(). Оставьте это выделение и также выделите метод Credit().
В области Выходной проект выберите Создать новый тестовый проект Visual C#.
Щелкните Параметры.
Откроется диалоговое окно Параметры создания тестов. В области Параметры наименования можно изменить способ именования тестовых файлов, классов и методов при их создании. В области Общие можно изменить другие аспекты создания тестов. Оставьте значения данных параметров по умолчанию и нажмите кнопку ОК.
В диалоговом окне Создать модульные тесты нажмите кнопку ОК.
Откроется диалоговое окно Новый тестовый проект.
Оставьте имя по умолчанию и нажмите кнопку Создать.
При этом будет создан проект с именем "TestProject1", отображаемый в обозревателе решений.
В проект TestProject1 добавляется файл BankAccountTest.cs, содержащий тестовый класс. В класс включается свойство TestContext и методы для тестирования методов Debit() и Credit().
Примечание. Каждому методу тестирования автоматически присваивается атрибут TestMethod(). Каждый тест соответствует отдельному методу в тестируемом коде, подлежащему проверке. Методы теста включены в тестовый класс, которому присвоен атрибут TestClass().
В файле BankAccountTest.cs укажите значения переменных, подлежащих тестированию. Перейдите к методу DebitTest, в котором имеются строки // TODO, указывающие переменные, которые необходимо задать. Какие значения следует использовать? Для ответа на этот вопрос необходимо знать значения, которые будут использоваться при выполнении приложения. Эти значения будут определены на следующем шаге.
Откройте файл 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) будет использоваться в процедуре Запуск и настройка модульного теста.
В файле BankAccountTest.cs перейдите к методу DebitTest.
Установите следующие значения:
BankAccount target = new BankAccount("Mr. Bryan Walton", 11.99); double amount = 11.22;
В файле BankAccountTest.cs внесите такие же изменения в метод CreditTest.
Сохраните файл BankAccountTest.cs.
Был создан файл исходного кода, содержащий тесты для проекта "Bank". Теперь все готово к выполнению тестов в классе BankAccountTest в применению к коду проекта "Bank".
Запуск и настройка модульного теста
Предварительное требование: необходимо выполнить процедуру Создание модульного теста.
Запуск и настройка модульного теста
Откройте окно Представление теста.
Щелкните правой кнопкой мыши элемент DebitTest и выберите команду Выполнить выбранное.
Откроется окно "Результаты теста", если оно не было открыто ранее. Запустится тест DebitTest.
В ходе выполнения теста в столбце Результат окна "Результаты теста" состояние теста отображается как Выполняется. По завершении тестового запуска результат теста меняется на С неопределенным результатом.
В окне "Результаты теста" дважды щелкните строку, представляющую тест.
Это приводит к открытию страницы "Сведения о результатах", содержащей сведения о результатах теста.
Обратите внимание, что на странице "Сведения о результатах" отображается сообщение об ошибке "Сбой Assert.Inconclusive. Невозможно проверить метод, не возвращающий значение." Для создания успешно выполняемого теста необходимо найти и проверить оператор Assert.
Чтобы найти метод теста, содержащий оператор Assert, откройте файл BankAccountTest.cs и перейдите к методу DebitTest().
Оператор Assert находится в последней строке метода DebitTest. Он имеет следующий вид.
Assert.Inconclusive("A method that does not return a value cannot be verified.");
Преобразуйте этот оператор Assert в комментарий.
Теперь при запуске теста результат будет Пройден, однако только потому, что при тестировании сравнение производится с 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, так как он компенсирует погрешность округления, присущую типам с плавающей запятой, таким как Double.
Итак, был выполнен созданный метод DebitTest тестового класса BankAccountTest, был сделан вывод о необходимости внесения в него изменений, и соответствующие изменения были произведены. Теперь метод можно использовать для проверки правильности выполнения метода Debit в приложении.
Выполнение модульного теста и исправление кода
Предварительное требование: необходимо выполнить процедуру Запуск и настройка модульного теста.
Выполнение модульного теста и исправление кода
Повторно запустите тест Debit. В файле BankAccountTest.cs щелкните правой кнопкой мыши метод DebitTest() и выберите команду Выполнить тесты.
В ходе выполнения теста в столбце Результат окна "Результаты теста" состояние теста отображается как Выполняется. По завершении тестового запуска результат теста меняется на Не удалось.
В окне "Результаты теста" дважды щелкните строку, представляющую тест.
Это приводит к открытию страницы "Сведения о результатах", на которой отображается сообщение об ошибке "Сбой Assert.AreEqual. Ожидалось различие, не большее чем <0,05> между ожидаемым значением <0,77> и фактическим значением <23,21>". Эти числа указывают на ошибку при выполнении математической операции. Так как метод DebitTest тестового класса BankAccountTest проверяет метод Debit класса BankAccount, следует начать с проверки метода Debit.
Откройте файл Class1.cs и перейдите к методу Debit.
Обратите внимание на следующий оператор присваивания:
m_balance += amount;
Этот оператор добавляет к переменной Balance значение переменной Amount, хотя в методе Debit он должен производить вычитание. Измените эту строку следующим образом:
m_balance -= amount;
Повторно запустите тест Debit.
В столбце Результат в окне "Результаты теста" для теста DebitTest отображается Пройден.
Примечание. После изменения исходного кода нет необходимости в повторном построении проекта, так как запуск теста приводит к автоматическому построению проекта.
Итак, был создан модульный тест и с его помощью выявлена и устранена ошибка в коде.
Создание и выполнение модульного теста для закрытого метода
Предварительное требование: необходимо выполнить процедуру Выполнение модульного теста и исправление кода.
Создание и выполнение модульного теста для закрытого метода
Откройте файл Class1.cs в проекте Bank.
Щелкните правой кнопкой мыши метод FreezeAccount() и выберите команду Создать модульные тесты.
Откроется диалоговое окно Создать модульные тесты.
В отображаемой древовидной структуре выделен только метод FreezeAccount().
(Необязательно.) Щелкните Фильтр и снимите флажок Отображать не общедоступные элементы. Обратите внимание, что метод FreezeAccount() удален из списка дочерних методов класса BankAccount. Повторно щелкните Фильтр и установите флажок Отображать не общедоступные элементы, чтобы повторно отобразить метод FreezeAccount().
Убедитесь, что выбран метод FreezeAccount(), и нажмите кнопку ОК.
Это приведет к созданию нового файла закрытого метода доступа с именем Bank.accessor. Он содержит специальные методы доступа, которые используются тестом для косвенного вызова закрытых методов в классе BankAccount. Новый файл появится в обозревателе решений в папке Test References.
Откройте файл BankAccountTest.cs и перейдите к методу FreezeAccountTest().
Измените код метода 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."); }
Запустите тест FreezeAccountTest.
В столбце Результат в окне "Результаты теста" окончательное состояние теста отображается как Пройден. Этот результат является ожидаемым, поскольку тест вызвал метод Credit() после того, как счет был заморожен вызовом метода FreezeAccount().
Итак, был добавлен закрытый метод, создан новый модульный тест для этого метода и произведен запуск теста. Тест можно запустить повторно, используя другие граничные значения для переменной balance, например 15,00.
Следующие действия
При запуске тестов для проверки кода сборки можно отслеживать проверяемую часть кода проекта путем сбора данных об объеме протестированного кода. Дополнительные сведения см. в разделе Пошаговое руководство. Запуск тестов и просмотр покрытия кода.
Запуск тестов может производиться из командной строки вместо использования Visual Studio. Дополнительные сведения см. в разделе Пошаговое руководство. Использование программы командной строки для тестирования.