Руководство. Тестирование библиотеки классов .NET с помощью Visual Studio Code
В этом руководстве показано, как автоматизировать модульное тестирование путем добавления тестового проекта в решение.
Необходимые условия
- В этом руководстве используется решение, созданное вами в разделе Создание библиотеки классов .NET с помощью Visual Studio Code.
Создание проекта модульного теста
Модульные тесты обеспечивают автоматическое тестирование программного обеспечения во время разработки и публикации. Платформа тестирования, используемая в этом руководстве, — MSTest. MSTest является одной из трех платформ тестирования, которые можно выбрать. Другие — xUnit и nUnit.
Запустите Visual Studio Code.
Откройте решение
ClassLibraryProjects
, созданное в создание библиотеки классов .NET с помощью Visual Studio Code.В обозревателе решений выберите новый проектили в палитре команд выберите .NET: новый проект.
Выберите тестовый проект MSTest, присвойте ему имя StringLibraryTest, выберите каталог по умолчанию и выберите Создать проект.
Шаблон проекта создает файл UnitTest1.cs со следующим кодом:
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
Исходный код, созданный шаблоном модульного теста, выполняет следующие действия:
- Он применяет атрибут TestClassAttribute к классу
UnitTest1
. - Он применяет атрибут TestMethodAttribute для определения
TestMethod1
. - Он импортирует пространство имен Microsoft.VisualStudio.TestTools.UnitTesting, содержащее типы, используемые для модульного тестирования. Пространство имен импортируется с помощью директивы
global using
в GlobalUsings.cs.
Каждый метод, помеченный [TestMethod], в тестовом классе, помеченном [TestClass], выполняется автоматически при вызове модульного теста.
- Он применяет атрибут TestClassAttribute к классу
Добавление ссылки на проект
Чтобы тестовый проект работал с классом StringLibrary
, добавьте ссылку в проект StringLibraryTest
в проект StringLibrary
.
В обозревателе решений
щелкните правой кнопкой мыши на проекте StringLibraryTest и выберите Добавить ссылку на проект. Выберите StringLibrary.
Добавление и запуск методов модульного теста
При вызове модульного теста Visual Studio запускает каждый метод, помеченный атрибутом TestMethodAttribute в классе, помеченном атрибутом TestClassAttribute. Метод теста заканчивается, когда обнаружен первый сбой или когда все тесты, содержащиеся в методе, успешно выполнены.
Наиболее распространенные тесты вызываются членами класса Assert. Многие методы утверждения включают по крайней мере два параметра, один из которых является ожидаемым результатом теста, а другой — фактическим результатом теста. Некоторые из наиболее часто вызываемых методов класса Assert
показаны в следующей таблице:
Методы Assert | Функция |
---|---|
Assert.AreEqual |
Проверяет, равны ли два значения или объекты. Ассерция терпит неудачу, если значения или объекты не равны. |
Assert.AreSame |
Проверяет, что две переменные объекта ссылаются на один и тот же объект. Утверждение завершается ошибкой, если переменные ссылаются на разные объекты. |
Assert.IsFalse |
Проверяет, что условие false выполняется. Асерция завершается ошибкой, если условие true . |
Assert.IsNotNull |
Проверяет, что объект не null . Утверждение завершается ошибкой, если объект null . |
Можно также использовать метод Assert.ThrowsException в методе теста, чтобы указать тип исключения, который он должен вызывать. Тест завершится сбоем, если указанное исключение не будет вызвано.
При тестировании метода StringLibrary.StartsWithUpper
необходимо указать ряд строк, начинающихся с верхнего регистра. Вы ожидаете, что метод возвращает true
в этих случаях, поэтому можно вызвать метод Assert.IsTrue. Аналогичным образом необходимо указать ряд строк, которые начинаются с символа, отличного от символа верхнего регистра. Вы ожидаете, что метод возвращает false
в этих случаях, поэтому можно вызвать метод Assert.IsFalse.
Так как метод библиотеки обрабатывает строки, необходимо также убедиться, что он успешно обрабатывает пустую строку (String.Empty
) и строку null
. Пустая строка — это строка, которая не имеет символов и Length 0. Строка null
— это строка, которая не была инициализирована. Вы можете вызывать StartsWithUpper
напрямую как статический метод и передавать один аргумент String. Или можно вызвать StartsWithUpper
как метод расширения для переменной string
, назначенной null
.
Вы определите три метода, каждый из которых вызывает метод Assert для каждого элемента в массиве строк. Вы вызовете перегрузку метода, которая позволяет указать сообщение об ошибке, отображаемое в случае сбоя теста. Сообщение определяет строку, которая вызвала сбой.
Чтобы создать методы тестирования, выполните следующие действия.
Откройте StringLibraryTest/UnitTest1.cs и замените весь код следующим кодом.
using Microsoft.VisualStudio.TestTools.UnitTesting; using UtilityLibraries; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestStartsWithUpper() { // Tests that we expect to return true. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsTrue(result, string.Format("Expected for '{0}': true; Actual: {1}", word, result)); } } [TestMethod] public void TestDoesNotStartWithUpper() { // Tests that we expect to return false. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word, result)); } } [TestMethod] public void DirectCallWithNullOrEmpty() { // Tests that we expect to return false. string?[] words = { string.Empty, null }; foreach (var word in words) { bool result = StringLibrary.StartsWithUpper(word); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word == null ? "<null>" : word, result)); } } } }
Тест прописных символов в методе
TestStartsWithUpper
включает греческую заглавную букву альфа (U+0391) и кириллическую заглавную букву М (U+041C). Тест строчных символов в методеTestDoesNotStartWithUpper
включает в себя греческую строчную букву альфа (U+03B1) и кириллическую строчную букву Г (U+0433).Сохраните изменения.
Сборка и запуск тестов
В обозревателе решенийщелкните правой кнопкой мыши на решении и выберите Сборка, или в палитре команд выберите .NET: Сборка.
Выберите окно тестирования, выберите Выполнить тесты или в Палитре команд выберите Тест: Запуск всех тестов.
Обработка сбоев тестов
Если вы выполняете разработку на основе тестов (TDD), сначала напишите тесты, и они завершаются сбоем при первом запуске. Затем вы добавите код в приложение, которое делает тест успешным. В этом руководстве вы создали тест после написания кода приложения, который он проверяет, поэтому вы не видели сбой теста. Чтобы убедиться, что тест завершается ошибкой, если ожидается, что он завершится ошибкой, добавьте недопустимое значение в входные данные теста.
Измените массив
words
в методеTestDoesNotStartWithUpper
, чтобы включить строку "Error".string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Запустите тесты, щелкнув зеленую ошибку рядом с тестом в редакторе.
Выходные данные показывают, что тест завершается ошибкой, и он предоставляет сообщение об ошибке для неудачного теста: "Assert.IsFalse не удалось. Ожидалось для "Error": false; фактически: True. Из-за сбоя строки в массиве после "Ошибка" не были протестированы.
Удалите строку "Ошибка", которую вы добавили на шаге.
Повторно запустите тесты, и они пройдут успешно.
Тестирование релизной версии библиотеки
Теперь, когда все тесты прошли при выполнении отладочной сборки библиотеки, запустите тесты ещё раз для финальной сборки библиотеки. Некоторые факторы, включая оптимизацию компилятора, иногда могут приводить к различному поведению между отладочной и финальной сборками.
Запустите тесты с конфигурацией релизной сборки.
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
Тесты успешно пройдены.
Отладка тестов
Если вы используете Visual Studio Code в качестве интегрированной среды разработки, можно использовать тот же процесс, который показан в Отладка консольного приложения .NET с помощью Visual Studio Code для отладки кода с помощью проекта модульного теста. Вместо запуска проекта приложения ShowCase откройте StringLibraryTest/UnitTest1.csи выберите Отладка тестов в текущем файле между строками 7 и 8. Если не удается найти его, нажмите CTRL +SHIFT+P, чтобы открыть палитру команд и ввести Перезагрузить окно.
Visual Studio Code запускает тестовый проект с присоединенным отладчиком. Выполнение остановится в любой точке останова, которую вы добавили в тестовый проект или код базовой библиотеки.
Дополнительные ресурсы
- модульное тестирование в .NET
Дальнейшие действия
В этом руководстве вы проводили модульное тестирование библиотеки классов. Вы можете сделать библиотеку доступной для других пользователей, публикуя ее в NuGet в виде пакета. Чтобы узнать, как это сделать, следуйте инструкциям по NuGet.
Если вы публикуете библиотеку в виде пакета NuGet, другие пользователи могут установить и использовать ее. Чтобы узнать, как это сделать, следуйте инструкциям по NuGet.
Библиотеку не нужно распространять как пакет. Его можно объединить с консольным приложением, использующим его. Чтобы узнать, как опубликовать консольное приложение, ознакомьтесь с предыдущим руководством в этой серии:
Пакет средств разработки для расширения Visual Studio Code C# предоставляет дополнительные средства для разработки приложений и библиотек C#: