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


Структура модульных тестов

Обновлен: Ноябрь 2007

Модульный тест — это метод, являющийся членом класса, написанного на языке C#, Visual Basic или Visual C++.

ms182517.alert_note(ru-ru,VS.90).gifПримечание.

Подробные сведения об использовании модульных тестов, написанных на C++ или содержащих рабочий код C++, см. в разделе Модульные тесты и C++.

Для распознания модульного теста Team System (средства тестирования) файл с его исходным кодом должен находиться в тестовом проекте, который, в свою очередь, является частью решения Visual Studio. При построении проекта или целого решения тестовый проект встраивается в сборку, которая содержит исполняемый модульный тест.

Все методы модульного теста помечены атрибутом [TestMethod()], в Visual Basic <TestMethod()>, и являются членами класса [TestClass()]. В свою очередь, класс определяется в пространстве имен Microsoft.VisualStudio.TestTools.UnitTesting. При создании модульного теста это пространство имен включается в начало автоматически создаваемого файла в оператор using или Imports.

Атрибуты и свойства модульного теста

Кроме атрибута метода модульного теста [TestMethod()] и атрибута его содержащего класса [TestClass()] используются и другие атрибуты, расширяющие функциональные возможности модульных тестов. Основными среди этих атрибутов являются [TestInitialize()] и [TestCleanup()]. Метод с пометкой [TestInitialize()] используется для подготовки аспектов среды, предназначенной для выполнения теста; целью этих действий является установка известного состояния для выполнения модульного теста. Например, метод [TestInitialize()] применяется для копирования, изменения или создания определенных файлов данных, используемых тестом.

Метод с пометкой [TestCleanup()] используется для возврата среды к известному состоянию после выполнения теста; это может означать удаление файлов в папках или возврат базы данных в известное состояние. Еще одним примером является возврат базы данных в исходное состояние после проверки метода, используемого в приложении ввода заказа. Кроме того, рекомендуется включать код очистки в метод [TestCleanup()] или ClassCleanup, но не в метод завершения. Исключения, возникающие в методе завершения, не могут быть перехвачены и могут привести к непредсказуемым результатам.

Свойство TestContext является важным для тестового класса. Свойство содержит такие сведения, как имя текущего выполняемого модульного теста, каталог развертывания, имена файлов журналов и база данных, с которой установлено соединение, для управляемого данными тестирования. Свойство TestContext возвращает экземпляр TestContext. Дополнительные сведения см. в разделе Использование класса TestContext.

Пример модульного теста

В следующем примере показан фрагмент кода простого модульного теста, написанного на языке C#.

[TestMethod()]
public void DebitTest()
{
    string customerName = "Mr. Bryan Walton"; 
    double balance = 11.99; 
    BankAccount target = new BankAccount(customerName, balance);
    double amount = 11.22; 
    target.Debit(amount);
    Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05); // 0.05 is tolerance for floating-point comparison
    //Assert.Inconclusive("A method that does not return a value cannot be verified.");
}

Другой пример см. в разделе Написание кода модульного теста, управляемого данными.

Результаты модульного теста

Существует три способа проверки прохождения модульного теста.

  • Использование одного или нескольких операторов Assert для проверки определенных результатов. Дополнительные сведения см. в разделе Использование операторов Assert.

  • Следует убедиться в отсутствии исключений. Кроме того, по-прежнему рекомендуется использовать один или несколько операторов Assert.

  • Следует убедиться в отсутствии определенного исключения. Для этого используется атрибут ExpectedExceptionAttribute.

Использование операторов Assert

Если результат теста — "Пройден" или "Ошибка" является более информативным или важным, чем произведенные действия, необходимо использовать один или несколько операторов Assert в коде теста.

Предполагается, что каждый модульный тест передается обработчику теста для запуска в состоянии прохождения. Тест остается в этом состоянии, пока оператор Assert получает результат и при его противоречии с состоянием прохождения изменит его с "Пройден" на "Ошибка" или "Неопределенный результат", или пока не возникнет исключение, определенное в атрибуте ExpectedExceptionAttribute. Другими словами, результат модульного теста без оператора Assert будет "Пройден" после каждого его выполнения. Такой тест имеет смысл, если нужно просто убедиться, что выполнение кода проходит без возникновения исключения. Выполненный код модульного теста будет передан как "покрытый" в статистику о покрытии кода независимо окончательного результата теста или даже наличия в нем оператора Assert.

Однако, чтобы убедиться, что определенное действие было выполнено или определенное состояние было достигнуто необходимо использовать операторы Assert. Некоторые операторы Assert доступны в пространстве имен Microsoft.VisualStudio.TestTools.UnitTesting. Различные операторы Assert обеспечивают хорошую гибкость; например, имеется возможность принудительно завершить тест с ошибкой с помощью оператора Assert.Fail(). В дополнении к операторам Assert разработчик, конечно, может создавать собственную функциональность, например, включать операторы Assert в блоки if.

Независимо от результатов, возвращаемых тестом, его состояние — "Пройден" или "Ошибка" зависит от операторов Assert. Если тест содержит несколько операторов Assert, его состояние остается "Пройден", пока один из операторов не изменит его на "Ошибка" или "Неопределенный результат".

Дополнительные сведения см. в разделе Использование классов Assert.

См. также

Ссылки

Microsoft.VisualStudio.TestTools.UnitTesting

Другие ресурсы

Создание модульных тестов