Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве показано, как автоматизировать модульное тестирование путем добавления тестового проекта в решение.
Предпосылки
В этом руководстве описано решение, которое вы создаете в Создание библиотеки классов .NET.
Создание проекта модульного теста
Модульные тесты обеспечивают автоматическое тестирование программного обеспечения во время разработки и публикации. MSTest является одной из трех платформ тестирования, которые можно выбрать. Другие — xUnit и nUnit.
Запустите Visual Studio.
Откройте решение
ClassLibraryProjects, созданное в Создать библиотеку классов .NET.Добавьте в решение новый проект модульного теста с именем StringLibraryTest.
Щелкните правой кнопкой мыши решение в Solution Explorer и выберите Add>New project.
На странице Добавление нового проекта введите mstest в поле поиска. Выберите C# или Visual Basic в списке языков и выберите платформы All из списка платформ.
Выберите шаблон проекта тестирования MSTest , а затем выберите Далее.
На странице
Настройка нового проекта введитеStringLibraryTest в поле имени проекта. Затем нажмите кнопку "Далее". На странице Additional information выберите .NET 10 в поле Framework> выберите Microsoft.Testing.Platform для Test runner и выберите Create.
Visual Studio создает проект и открывает файл класса в окне кода со следующим кодом. Если язык, который вы хотите использовать, не отображается, измените селектор языка в верхней части страницы.
namespace StringLibraryTest { [TestClass] public sealed class Test1 { [TestMethod] public void TestMethod1() { } } }Imports Microsoft.VisualStudio.TestTools.UnitTesting Namespace StringLibraryTest <TestClass> Public Class Test1 <TestMethod> Sub TestSub() End Sub End Class End NamespaceИсходный код, созданный шаблоном модульного теста, выполняет следующие действия:
- Включает Microsoft.VisualStudio.TestTools.UnitTesting в файл проекта StringLibraryTest в C# и импортирует Microsoft.VisualStudio.TestTools.UnitTesting в Visual Basic.
- Применяет TestClassAttribute атрибут к классу
Test1. - Применяет атрибут TestMethodAttribute для определения
TestMethod1в C# илиTestSubв Visual Basic.
Каждый метод, помеченный [TestMethod] в классе тестирования, помеченном [TestClass] , выполняется автоматически при выполнении модульного теста.
Запустите Visual Studio Code.
Откройте решение
ClassLibraryProjects, созданное в Создание библиотеки классов .NET.В Solution Explorer выберите New Project или в палитре команд выберите .NET: Новый проект.
Выберите проект тестирования MSTest, присвойте ему имя StringLibraryTest, выберите каталог по умолчанию и нажмите кнопку "Создать проект".
Шаблон проекта создает StringLibraryTest/Test1.cs со следующим кодом:
namespace StringLibraryTest; [TestClass] public class Test1 { [TestMethod] public void TestMethod1() { } }Исходный код, созданный шаблоном модульного теста, выполняет следующие действия:
- Он применяет TestClassAttribute атрибут к классу
Test1. - Он применяет TestMethodAttribute атрибут для определения
TestMethod1. - Импортируется пространство имен Microsoft.VisualStudio.TestTools.UnitTesting, которое содержит типы, используемые для модульного тестирования. Пространство имен импортируется с помощью
global usingдирективы в GlobalUsings.cs.
Каждый метод, помеченный [TestMethod] в классе тестирования, помеченном [TestClass] , выполняется автоматически при вызове модульного теста.
- Он применяет TestClassAttribute атрибут к классу
Откройте терминал и перейдите в папку учебников, содержащую проекты StringLibrary и ShowCase.
Создайте тестовый проект MSTest:
dotnet new mstest -n StringLibraryTestШаблон проекта создает StringLibraryTest/Test1.cs со следующим кодом:
namespace StringLibraryTest; [TestClass] public class Test1 { [TestMethod] public void TestMethod1() { } }Исходный код, созданный шаблоном модульного теста, выполняет следующие действия:
- Он применяет TestClassAttribute атрибут к классу
Test1. - Он применяет TestMethodAttribute атрибут для определения
TestMethod1. - Он импортирует Microsoft.VisualStudio.TestTools.UnitTesting пространство имен, содержащее типы, используемые для юнит-тестирования.
Каждый метод, помеченный [TestMethod] в классе тестирования, помеченном [TestClass] , выполняется автоматически при вызове модульного теста.
- Он применяет TestClassAttribute атрибут к классу
Добавление ссылки на проект
Чтобы тестовый проект работал с классом StringLibrary, добавьте ссылку на проект StringLibrary в проект StringLibraryTest.
В Solution Explorer щелкните правой кнопкой мыши на узле Dependencies проекта StringLibraryTest и выберите Добавить ссылку на проект в контекстном меню.
В диалоговом окне диспетчера ссылок выберите поле рядом с StringLibrary.
Нажмите ОК.
В Solution Explorer щелкните правой кнопкой мыши проект StringLibraryTest и выберите Add Project Reference.
Выберите StringLibrary.
Перейдите в папку StringLibraryTest и добавьте ссылку на проект:
cd StringLibraryTest dotnet add reference ../StringLibrary/StringLibrary.csproj
Добавление и запуск методов модульного теста
При выполнении модульного теста каждый метод, помеченный атрибутом TestMethodAttribute в классе, помеченном атрибутом TestClassAttribute, выполняется автоматически. Метод теста заканчивается при обнаружении первого сбоя или при успешном выполнении всех тестов, содержащихся в методе.
Наиболее распространенные тесты вызывают функции из класса Assert. Многие методы утверждения включают по крайней мере два параметра, один из которых является ожидаемым результатом теста, а другой — фактическим результатом теста. Некоторые из наиболее часто вызываемых методов класса Assert показаны в следующей таблице:
| Методы Assert | Функция |
|---|---|
Assert.AreEqual |
Проверяет, равны ли два значения или объекты. Утверждение завершается ошибкой, если значения или объекты не равны. |
Assert.AreSame |
Проверяет, что две переменные объекта ссылаются на один и тот же объект. Утверждение завершается ошибкой, если переменные ссылаются на разные объекты. |
Assert.IsFalse |
Проверяет, что условие соответствует false. Утверждение завершается ошибкой, если условие true. |
Assert.IsNotNull |
Проверяет, что объект не является null. Утверждение завершается ошибкой, если объект null. |
Вы также можете использовать Assert.Throws метод в методе теста, чтобы указать тип исключения, который он должен вызывать. Тест завершается ошибкой, если указанное исключение не выбрасывается.
При тестировании StringLibrary.StartsWithUpper метода необходимо указать ряд строк, начинающихся с верхнего регистра. Вы ожидаете, что метод возвращает true в этих случаях, поэтому можно вызвать метод Assert.IsTrue. Аналогичным образом необходимо указать ряд строк, которые начинаются с символа, отличного от символа верхнего регистра. Вы ожидаете, что метод возвращает false в этих случаях, поэтому можно вызвать метод Assert.IsFalse.
Так как метод библиотеки обрабатывает строки, вы также хотите убедиться, что он успешно обрабатывает пустую строку (String.Empty) и null строку. Пустая строка — это строка, которая не имеет символов и Length имеет значение 0.
null Одна строка — это та, которая ещё не была инициализирована. Можно вызывать StartsWithUpper непосредственно как статический метод и передавать один String аргумент. Или можно вызвать StartsWithUpper как метод расширения переменной, которая присвоена null, на string.
Вы определите три метода, каждый из которых вызывает Assert метод для каждого элемента в строковом массиве. Вы вызовете перегрузку метода, которая позволяет указать сообщение об ошибке, отображаемое в случае сбоя теста. Сообщение определяет строку, которая вызвала сбой.
Чтобы создать методы тестирования, выполните следующие действия.
В окне кода Test1.cs или Test1.vb замените код следующим кодом:
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public sealed class Test1 { [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}"); } } } }Imports Microsoft.VisualStudio.TestTools.UnitTesting Imports UtilityLibraries Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Public Sub TestStartsWithUpper() ' Tests that we expect to return true. Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsTrue(result, $"Expected for '{word}': true; Actual: {result}") Next End Sub <TestMethod> Public Sub TestDoesNotStartWithUpper() ' Tests that we expect to return false. Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " "} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsFalse(result, $"Expected for '{word}': false; Actual: {result}") Next End Sub <TestMethod> Public Sub DirectCallWithNullOrEmpty() ' Tests that we expect to return false. Dim words() As String = {String.Empty, Nothing} For Each word In words Dim result As Boolean = StringLibrary.StartsWithUpper(word) Assert.IsFalse(result, $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}") Next End Sub End Class End NamespaceТест прописных символов в методе
TestStartsWithUpperвключает греческую заглавную букву альфа (U+0391) и кириллическую заглавную букву ЭМ (U+041C). Тест маленьких символов в методеTestDoesNotStartWithUpperвключает в себя греческую маленькую букву альфа (U+03B1) и маленькую кириллическую букву г (U+0433).На строке меню выберите File>Save Test1.cs As или File>Save Test1.vb As. В диалоговом окне Сохранить файл как щелкните стрелку рядом с кнопкой Сохранить и нажмите кнопку Сохранить с помощью кодировки.
В диалоговом окне Подтвердить сохранение как выберите кнопку Да для сохранения файла.
В диалоговом окне "Дополнительные параметры сохранения" выберите Юникод (UTF-8 с подписью) — Codepage 65001 в раскрывающемся списке кодировки и нажмите кнопку ОК.
Если не удается сохранить исходный код в виде файла в кодировке UTF8, Visual Studio может сохранить его в виде ФАЙЛА ASCII. В этом случае среда выполнения не декодирует символы UTF8 за пределами диапазона ASCII, а результаты теста неверны.
В строке меню выберите Тест>Выполнить все тесты. Если окно Обозреватель тестов не открыто, откройте его, выбрав Тест>Обозреватель тестов. Три теста перечислены в разделе Пройденные тесты, а раздел Сводка сообщает результат выполнения тестов.
окно обозревателя тестов
Откройте StringLibraryTest/Test1.cs и замените весь код следующим кодом.
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public sealed class Test1 { [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}"); } } } }Тест прописных символов в методе
TestStartsWithUpperвключает греческую заглавную букву альфа (U+0391) и кириллическую заглавную букву ЭМ (U+041C). Тест маленьких символов в методеTestDoesNotStartWithUpperвключает в себя греческую маленькую букву альфа (U+03B1) и маленькую кириллическую букву г (U+0433).Сохраните свои изменения.
Создание и запуск тестов
В Solution Explorer щелкните решение правой кнопкой мыши и выберите Build или в палитре команд выберите .NET: Build.
Выберите окно тестирования , выберите "Выполнить тесты " или в палитре команд, выберите "Тест: выполнить все тесты".
Откройте StringLibraryTest/Test1.cs и замените весь код следующим кодом:
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public sealed class Test1 { [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}"); } } } }Тест прописных символов в методе
TestStartsWithUpperвключает греческую заглавную букву альфа (U+0391) и кириллическую заглавную букву ЭМ (U+041C). Тест маленьких символов в методеTestDoesNotStartWithUpperвключает в себя греческую маленькую букву альфа (U+03B1) и маленькую кириллическую букву г (U+0433).Сохраните изменения и запустите тесты:
dotnet testТесты должны успешно завершиться.
Управление сбоями тестов
Если вы выполняете разработку на основе тестов (TDD), сначала напишите тесты, и они завершаются сбоем при первом запуске. Затем вы добавите код в приложение, которое делает тест успешным. В этом руководстве вы создали тест после написания кода приложения, который он проверяет, поэтому вы не видели, чтобы тест проваливался. Чтобы убедиться, что тест завершается ошибкой, когда это ожидается, добавьте недопустимое значение в входные данные теста.
Измените массив
wordsв методеTestDoesNotStartWithUpper, чтобы включить строку "Error".string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }
Запустите тест, выбрав тест>запустить все тесты в строке меню. В окне обозревателя тестов
указано, что два теста успешно выполнены, а один завершился сбоем. окно обозревателя тестов
Выберите проваленный тест,
TestDoesNotStartWith.В окне обозревателя тестов
отображается сообщение, созданное выражением assert: "Assert.IsFalse завершилось сбоем. Ожидается значение "Error": false; фактическое: истина. Из-за ошибки строки в массиве после "Error" не были проверены. окно обозревателя тестов
Запустите тесты, щелкнув зеленую ошибку рядом с тестом в редакторе.
Выходные данные показывают, что тест завершается ошибкой, и он предоставляет сообщение об ошибке для неудачного теста: "Assert.IsFalse не удалось. Ожидалось для 'Error': false; фактически: true. Из-за сбоя строки массива после "Ошибка" не были проверены.
Выполните тесты:
dotnet testВыходные данные показывают, что тест завершается ошибкой, и он предоставляет сообщение об ошибке для неудачного теста: "Assert.IsFalse не удалось. Ожидалось для 'Error': false; фактически: true. Из-за сбоя строки массива после "Ошибка" не были проверены.
Удалите строку "Ошибка", которую вы добавили.
Повторно запустите тест, и тесты проходят.
Тестирование релизной версии библиотеки
Теперь, когда все тесты прошли при выполнении отладочной сборки библиотеки, запустите тесты ещё раз для релизной сборки библиотеки. Несколько факторов, включая оптимизацию компилятора, иногда могут вызывать разное поведение между сборками Debug и Release.
Чтобы протестировать релизную сборку, выполните следующие действия.
На панели инструментов Visual Studio измените конфигурацию сборки с Debug на Release.
В Solution Explorer щелкните правой кнопкой мыши проект StringLibrary и выберите Build в контекстном меню для повторной компиляции библиотеки.
Запустите модульные тесты, выбрав из строки меню Тест>Выполнить все тесты. Тесты успешно пройдены.
Запустите тесты с конфигурацией сборки Release.
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
Тесты успешно пройдены.
Запустите тесты с конфигурацией сборки Release.
dotnet test --configuration Release
Тесты успешно пройдены.
Отладка тестов
Если вы используете Visual Studio в качестве интегрированной среды разработки, можно использовать тот же процесс, что и в Tutorial: отладка консольного приложения .NET для отладки кода с помощью проекта модульного теста. Вместо запуска приложения ShowCase, щелкните правой кнопкой мыши проект StringLibraryTests и выберите пункт Отладка тестов в контекстном меню.
Visual Studio запускает тестовый проект с присоединенным отладчиком. Выполнение останавливается в любой точке останова, которую вы добавили в тестовый проект или базовый код библиотеки.
Если вы используете Visual Studio Code в качестве интегрированной среды разработки, можно использовать тот же процесс, который показан в Debug консольного приложения .NET для отладки кода с помощью проекта модульного тестирования. Вместо запуска проекта приложения ShowCase откройте StringLibraryTest/Test1.cs и выберите "Тесты отладки" в текущем файле между строками 7 и 8. Если ее найти не удается, нажмите клавиши CTRL+SHIFT+P , чтобы открыть палитру команд и ввести окно перезагрузки.
Visual Studio Code запускает тестовый проект с присоединенным отладчиком. Выполнение остановится в любой точке останова, которую вы добавили в тестовый проект или код базовой библиотеки.
Дополнительные ресурсы
- основы модульного тестирования — Visual Studio
- Модульное тестирование в .NET
Очистка ресурсов
GitHub автоматически удаляет пространство кода через 30 дней бездействия. Если вы планируете ознакомиться с дополнительными руководствами в этой серии, вы можете оставить ваш Codespace активным. Если вы готовы посетить сайт .NET, чтобы скачать пакет SDK .NET, можно удалить пространство codespace. Чтобы удалить ваш Codespace, откройте окно браузера и перейдите к вашим Codespace. В окне вы видите список ваших codespaces. Выберите три точки (...) в записи пространства кода учебного руководства. Затем нажмите кнопку "Удалить".
Дальнейшие шаги
В этом руководстве вы провели модульное тестирование библиотеки классов. Вы можете сделать библиотеку доступной для других пользователей, публикуя ее в NuGet в виде пакета. Чтобы узнать, как это сделать, следуйте инструкциям по NuGet.
Если вы публикуете библиотеку в виде пакета NuGet, другие пользователи могут установить и использовать ее. Чтобы узнать, как это сделать, следуйте инструкциям по NuGet.
Библиотеку не нужно распространять как пакет. Его можно объединить с консольным приложением, использующим его. Чтобы узнать, как опубликовать консольное приложение, ознакомьтесь с предыдущим руководством в этой серии: