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

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

В этом разделе содержатся следующие подразделы.

Создание управляемого данными модульного теста включает в себя следующие шаги:

  1. Создайте источник данных, в котором содержатся значения, используемые в методе теста.Источник данных может быть любого типа, который зарегистрирован на компьютере, где выполняется тест.

  2. Добавьте закрытое поле TestContext и открытое свойство TestContext в тестовый класс.

  3. Создайте метод модульного теста и добавьте к нему атрибут DataSourceAttribute.

  4. Используйте свойство индексатора DataRow для получения значений, используемых в тесте.

Тестируемый метод

Например, допустим, что было создано:

  1. Решение с названием MyBank, которое принимает и обрабатывает транзакции для различных типов учетных записей.

  2. Проект в MyBank с названием BankDb, который управляет транзакциями для учетных записей.

  3. Класс с названием Maths в проекте DbBank, выполняющий математические функции, позволяющие убедиться, что любая транзакция выгодна банку.

  4. Проект модульных тестов с названием BankDbTests для тестирования функциональности компонента BankDb.

  5. Класс модульного теста с названием MathsTests для проверки функциональности класса Maths.

Мы проверяем метод в Maths, который складывает 2 целых числа с помощью цикла:

public int AddIntegers(int first, int second)
{
    int sum = first;
    for( int i = 0; i < second; i++)
    {
        sum += 1;
    }
    return sum;
}

Создание источника данных

Чтобы проверить метод AddIntegers, создадим источник данных, определяющий диапазон значений для параметров и ожидаемых возвращенных значений суммы.В нашем примере, создадим базу данных Sql Compact с названием MathsData и таблицу с названием AddIntegersData, которая содержит следующие имена столбцов и значений

FirstNumber

SecondNumber

Sum

0

1

1

1

1

2

2

-3

-1

Добавление TestContext в тестовый класс

Платформа модульного тестирования создает объект TestContext для хранения информации из источника данных для теста, управляемого данными.Затем платформа задает этому объекту значения свойства TestContext, которое мы создаем.

    private TestContext testContextInstance;
    public TestContext TestContext
    {
        get { return testContextInstance; }
        set { testContextInstance = value; }
    }

В методе теста получить доступ к данным можно через свойство индексатора DataRowTestContext.

Написание метода теста

Метод теста для AddIntegers достаточно прост.Для каждой строки в источнике данных вызываем AddIntegers со значениями столбцов FirstNumber и SecondNumber в качестве параметров и сверяем возвращаемое значение со значением столбца Sum:


    [DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0; Data Source=C:\Data\MathsData.sdf;", "Numbers")]
    [TestMethod()]
    public void AddIntegers_FromDataSourceTest()
    {
        var target = new Maths();
        
        // Access the data
        int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
        int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]); 
        int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
        int actual = target.IntegerMethod(x, y);
        Assert.AreEqual(expected, actual,
            "x:<{0}> y:<{1}>",
            new object[] {x, y});

    }

Обратите внимание, что метод Assert содержит сообщение, которое отображает значения x и y итерации, на которой произошел сбой.По умолчанию утверженные значения expected и actual, уже содержатся в сведениях неудачного теста.

ms182527.collapse_all(ru-ru,VS.110).gifОпределение DataSourceAttribute

Атрибут DataSource задает строку подключения для источника данных и название таблицы, которая используется в методе теста.Точные сведения в строке подключения отличаются, в зависимости от используемого типа источника данных.В этом примере используется база данных SqlServerCe.

    [DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0;Data Source=C:\Data\MathsData.sdf", "AddIntegersData")]

Атрибут источника данных имеет 3 конструктора.

[DataSource(dataSourceSettingName)]

Конструктор с одним параметром использует информацию о соединении, хранящуюся в конфигурационном файле решения app.config.В файле конфигурации Xml элемент с названием dataSourceSettingsName содержит в себе информацию о подключении.

Использование файла app.config позволяет менять расположение источника данных, и при этом не вносить изменения в сам модульный тест.Дополнительные сведения о создании и использовании файла app.config см. в разделе Пошаговое руководство. Использование файла конфигурации для определения источника данных

[DataSource(connectionString, tableName)]

Конструктор DataSource с двумя параметрами, которые задают строку подключения к источнику данных и название таблицы, содержащую данные для метода теста.

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

[DataSource(
    dataProvider, 
    connectionString, 
    tableName,
    dataAccessMethod
    )]

ms182527.collapse_all(ru-ru,VS.110).gifИспользование TestContext.DataRow для доступа к данным

Для доступа к данным таблицы AddIntegersData используйте индексатор TestContext.DataRow.DataRow является объектом DataRow, поэтому значения столбца извлекаются по индексу или названию столбца.Поскольку значения возвращаются в виде объектов, необходимо преобразовать их к соответствующему типу.

int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);

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

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

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

При запуске метода AddIntegers_FromDataSourceTest в нашем примере панель результатов станет красной и метод теста переместится в Неудачные тесты. Тест, управляемый данными, завершается с ошибкой, если какая-либо итерация из источника данных завершается неудачно.При выборе неудачных тестов, управляемых данными, в окне обозревателя тестов, панель с подробными данными отображает результаты каждой итерации в соответствии с индексом строки данных.В данном примере оказывается, что алгоритм AddIntegers неправильно обрабатывает отрицательные значения.

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

См. также

Ссылки

Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute

Microsoft.VisualStudio.TestTools.UnitTesting.TestContext

TestContext.DataRow

Microsoft.VisualStudio.TestTools.UnitTesting.Assert

Основные понятия

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

Написание модульных тестов для платформы .NET Framework с использованием платформы модульного тестирования Майкрософт для управляемого кода

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

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

Выполнение модульных тестов с помощью обозревателя тестов