Практическое руководство. создание модульного теста, управляемого данными
Вы можете использовать платформу модульного тестирования Майкрософт для управляемого кода, чтобы настроить метод модульного теста для получения значений из источника данных. Этот метод последовательно выполняется для каждой строки в источнике данных, что облегчает тестирование разнообразных входных данных с помощью одного метода.
Создание управляемого данными модульного теста включает в себя указанные ниже шаги.
Создайте источник данных, в котором содержатся значения, используемые в методе теста. Источник данных может быть любого типа, который зарегистрирован на компьютере, где выполняется тест.
Добавьте частное поле TestContext и общее свойство TestContext в тестовый класс.
Создайте метод модульного теста и добавьте к нему атрибут DataSourceAttribute.
Используйте свойство индексатора DataRow для получения значений, используемых в тесте.
Тестируемый метод
Например, допустим, что у вас есть:
решение с именем MyBank , которое принимает и обрабатывает транзакции для различных типов счетов;
проект в MyBank с именем BankDb , который управляет транзакциями для счетов;
класс с именем Maths в проекте BankDb , выполняющий математические функции, позволяющие убедиться в том, что любая транзакция выгодна банку;
проект модульного теста с именем BankDbTests для тестирования функциональности компонента BankDb ;
класс модульного теста с именем MathsTests для проверки функциональности класса Maths .
Мы проверяем метод в Maths , который складывает два целых числа с помощью цикла:
Создание источника данных
Чтобы проверить метод AddIntegers , создайте источник данных, определяющий диапазон значений для параметров и ожидаемую возвращаемую сумму. В этом примере мы создадим базу данных SQL Compact с именем MathsData и таблицу с именем AddIntegersData , которая содержит следующие имена столбцов и значения:
FirstNumber SecondNumber SUM 0 1 1 1 1 2 2 –3 -1
Добавление TestContext в тестовый класс
Платформа модульного тестирования создает объект TestContext для хранения информации из источника данных для теста, управляемого данными. Затем платформа присваивает этому объекту значение создаваемого свойства TestContext .
В методе теста получить доступ к данным можно через свойство индексатора DataRow``TestContext .
.NET Core не поддерживает атрибут DataSource. При попытке получить доступ к данным тестирования таким образом в проекте модульного теста для .NET Core или универсальной платформы Windows вы увидите сообщение об ошибке "'TestContext' не содержит определение для 'DataRow', и доступный метод расширения 'DataRow', принимающий первый аргумент типа 'TestContext', не найден (возможно, отсутствует директива using или ссылка на сборку?)".
Написание метода теста
Метод теста для AddIntegers достаточно прост. Для каждой строки в источнике данных вызовите AddIntegers со значениями столбцов FirstNumber и SecondNumber в качестве параметров и сверьте возвращаемое значение со значением столбца Sum:
Метод Assert содержит сообщение, которое отображает значения x и y итерации, в которой произошел сбой. По умолчанию утвержденные значения expected и actual уже содержатся в сведениях неудачного теста.
Определение DataSourceAttributeАтрибут DataSource задает строку подключения для источника данных и имя таблицы, которая используется в методе теста. Точные сведения в строке подключения отличаются в зависимости от типа используемого источника данных. В этом примере используется база данных SqlServerCe.
Атрибут DataSource имеет три конструктора.
Конструктор с одним параметром использует информацию о подключении, хранящуюся в файле app.config решения. В файле конфигурации XML-элемент с именем dataSourceSettingsName содержит в себе информацию о подключении.
Использование файла app.config позволяет менять расположение источника данных и при этом не вносить изменения в сам модульный тест. Дополнительные сведения о создании и использовании файла app.config см. в статье Пошаговое руководство. Использование файла конфигурации для определения источника данных.
Конструктор DataSource с двумя параметрами задает строку подключения к источнику данных и имя таблицы, содержащей данные для метода теста.
Строки подключения зависят от типа источника данных, но они должны содержать элемент Provider, который определяет неизменяемое имя поставщика данных.
Использование TestContext.DataRow для доступа к даннымДля доступа к данным в таблице AddIntegersData используйте индексатор TestContext.DataRow . DataRow является объектом DataRow, поэтому значения столбца извлекаются по индексу или имени столбца. Так как значения возвращаются в виде объектов, преобразуйте их в соответствующий тип.
Запуск теста и просмотр результатов
Завершив написание метода теста, выполните сборку тестового проекта. Метод теста приводится в обозревателе тестов в группе Не запускавшиеся тесты. При запуске, написании и повторном запуске тестов в обозревателе тестов результаты отображаются в группах Неудачные тесты, Пройденные тесты и Незапускавшиеся тесты. Можно выбрать Запустить все , чтобы запустить все тесты, или выбрать Запустить , чтобы выбрать подмножество тестов для запуска.
Панель результатов теста в верхней части обозревателя тестов обновляется по мере выполнения тестов. По завершении тестового запуска область становится зеленой, если все тесты пройдены, или красной, если какой-либо из тестов не был пройден успешно. Сводка тестового запуска приводится в области сведений в нижней части окна обозревателя тестов. Выберите тест, чтобы просмотреть детальную информацию по данному тесту в нижней панели.
Показан результат для каждой строки данных, а также один сводный результат. Если тест пройден для каждой строки данных, в сводке отображается Пройдено. Если тест не пройден для какой-то строки данных, в сводке отображается Не пройдено.
При выполнении метода AddIntegers_FromDataSourceTest в нашем примере панель результатов станет красной, а метод теста переместится в группу Неудачные тесты. Тест, управляемый данными, завершается с ошибкой, если какая-либо итерация из источника данных завершается неудачно. При выборе неудачных тестов, управляемых данными, в окне обозревателя тестов на панели сведений выводятся результаты каждой итерации в соответствии с индексом строки данных. В этом примере оказывается, что алгоритм AddIntegers неправильно обрабатывает отрицательные значения.
После исправления тестируемого метода и повторного выполнения теста панель результатов станет зеленой и метод теста переместится в группу Пройденные тесты.
Выполнение встроенного теста, управляемого данными
Для встроенных тестов MSTest использует DataRow для получения значений из источника данных. Тест в этом примере выполняется последовательно для каждой строки данных.