Создание модульных тестов для нечеткого тестирования с использованием IntelliTest
Область применения:Visual Studio Visual Studio для Mac
Visual Studio Code
IntelliTest изучает код .NET, чтобы создать тестовые данные и набор модульных тестов. Для каждого оператора в коде создаются входные данные теста, которые будут выполнять этот оператор. Анализ случая выполняется для каждой условной ветви в коде. Например, анализируются операторы if , утверждения и все операции, которые могут вызывать исключения. Этот анализ используется в целях создания данных теста для параметризованного модульного теста для каждого из методов, создающих модульные тесты с высоким покрытием кода. Это можно рассматривать как нечеткое смарт-тестирование, при котором обрезаются входные данные и тестовые случаи для выполнения всех ваших логических ветвей и проверки на предмет исключений.
При запуске IntelliTest легко увидеть, какие тесты завершились сбоем, и добавить код для их исправления. Вы можете выбрать, какие созданные тесты следует сохранить в тестовый проект, чтобы предоставить набор регрессий. Изменив код, необходимо перезапустить IntelliTest, чтобы синхронизировать созданные тесты с изменениями в коде.
Высокая доступность и расширения
Команды меню Создать IntelliTest и Запустить IntelliTest
- Доступны в только в версии Visual Studio Enterprise Edition.
- Поддерживают только код C#, предназначенный для .NET Framework.
- Расширяемые и поддерживают порождающие тесты в формате MSTest, MSTest V2, NUnit и xUnit.
- Не поддерживают конфигурацию x64.
Изучение. Использование IntelliTest для изучения кода и создания модульных тестов
Для формирования модульных тестов типы должны быть открытыми.
- Откройте решение в Visual Studio и откройте файл класса, содержащий методы, которые вы хотите протестировать.
- Щелкните правой кнопкой мыши метод и выберите пункт Запустить IntelliTest, чтобы создать модульные тесты для кода в используемом методе.
IntelliTest выполняет код несколько раз с разными вводными данными. Каждое выполнение представлено в таблице с входными данными теста и выходными результатами или исключением.
Чтобы создать модульные тесты для всех общедоступных методов в классе, просто щелкните правой кнопкой мыши класс, а не конкретный метод, а затем выберите команду Запустить IntelliTest. Используйте раскрывающийся список в окне Результаты просмотра, чтобы отобразить модульные тесты и входные данные для каждого метода в классе.
Убедитесь, что полученные результаты для выполненных тестов в столбце результатов соответствуют ожидаемому коду. Для тестов, которые завершились ошибкой, исправьте код соответствующим образом. Затем перезапустите IntelliTest для проверки исправлений.
Сохранение. Сохранение модульных тестов в виде набора регрессий
- Выберите строки данных, которые следует сохранить с параметризованным модульным тестом в тестовый проект.
Можно просмотреть тестовый проект и параметризованный модульный тест, который был создан, — отдельные модульные тесты, соответствующие каждой строке, сохраняются в файл .g.cs в тестовом проекте, а параметризованный модульный тест сохраняется в соответствующий CS-файл. Вы можете запускать модульные тесты и просматривать результаты в обозревателе тестов так же, как в случае с любыми созданными вручную модульными тестами.
Помощь. Использование IntelliTest для просмотра кода
- Если у вас имеется более сложный код, IntelliTest поможет сконцентрироваться на просмотре кода. Например, при наличии метода с интерфейсом в виде параметра и более одного класса, который реализует этот интерфейс, IntelliTest обнаружит эти классы и выдаст предупреждение. Просмотрите предупреждения, чтобы решить, что следует сделать.
Указание. Использование IntelliTest для проверки правильности свойств, указанных в коде
Укажите общую связь между входными и выходными данными, которые должны быть проверены созданными модульными тестами. Эта спецификация инкапсулируется в метод, который подобен методу тестирования, но связан квантором общности. Это метод параметризованного модульного теста, и все утверждения должны сохраняться для всех возможных входных значений, создаваемых IntelliTest.
Вопросы & ответы
Вопрос. Можно ли использовать IntelliTest для неуправляемого кода?
Ответ. Нет. IntelliTest работает только с управляемым кодом.
Вопрос. Каковы условия выполнения или сбоя созданного теста?
Ответ. Он, как и любой модульный тест, выполняется в случае отсутствия исключений. Сбой происходит при сбое утверждений или если код в тесте вызывает необработанное исключение.
Если у вас есть тест, который может быть выполнен при возникновении определенных исключений, можно задать один из следующих атрибутов на основе требований в методе тестирования, тестовом классе и уровне сборки:
- PexAllowedExceptionAttribute
- PexAllowedExceptionFromTypeAttribute
- PexAllowedExceptionFromTypeUnderTestAttribute
- PexAllowedExceptionFromAssemblyAttribute
Вопрос. Можно ли добавить допущения в параметризованный модульный тест?
Ответ. Да, используйте допущения, чтобы указать, какие данные теста не нужны для модульного теста при использовании определенного метода. Используйте класс PexAssume для добавления допущений. Например, можно добавить допущение, что переменная lengths не является NULL в отличие от этой.
Если добавляется допущение и перезапускается IntelliTest, тестовые данные, которые больше не нужны, будут удалены.
Вопрос. Можно ли добавить утверждения в параметризованный модульный тест?
Ответ. Да, IntelliTest проверит правильность утверждения в операторе при запуске модульных тестов. Для добавления утверждений используйте класс PexAssert или API утверждения, входящий в состав платформы тестирования. Например, можно добавить утверждение о равенстве двух переменных.
Если добавляется допущение и перезапускается IntelliTest, инструмент проверяет допустимость утверждения. Если утверждение недопустимо, происходит сбой теста.
В. Можно ли создавать параметризованные модульные тесты, не запуская предварительно IntelliTest?
О . Да, щелкните правой кнопкой мыши в коде класса или метода и выберите пункт Создать IntelliTest.
Примите формат по умолчанию для формирования тестов или измените способ именования вашего проекта и тестов. Вы можете создать новый тестовый проект или сохранить тесты в существующем проекте.
В. Можно ли использовать другие платформы модульного тестирования с IntelliTest?
О . Да, выполните инструкции по поиску и установке других платформ. Расширения платформы тестирования также доступны в Visual Studio Marketplace, например генератор тестов NUnit.
Перезапустив Visual Studio и открыв решение повторно, щелкните правой кнопкой мыши в коде класса или метода и выберите пункт Создать IntelliTest. Выберите установленную платформу здесь:
Затем запустите IntelliTest, чтобы сформировать отдельные модульные тесты в соответствующих файлах .g.cs.
Вопрос. Можно получить более подробную информацию о создании тестов?
О . Да, общий обзор приведен в этой записи блога.
Как запустить JS-код
JavaScript — популярный язык программирования с широким спектром применения. Раньше его использовали в основном для интерактивности веб-страницам: например, для анимации или валидации форм. Сейчас же JS используется еще и во многих других областях: разработка серверных, мобильных приложений и так далее.
Из-за широкого спектра применения JavaScript можно запустить несколькими способами:
- через вкладку «Консоль» в веб-браузере;
- с помощью Node.js
- с помощью веб-страницы.
Через вкладку «Консоль» в браузере
В большинстве современных браузеров уже есть встроенные механизмы JavaScript, поэтому запустить код на JS можно прямо в браузере. Вот, как это сделать:
Шаг 1. Откройте любой браузер (мы будем использовать Google Chrome).
Шаг 2. Откройте инструменты разработчика. Для этого щелкните правой кнопкой мыши на пустой области и выберите пункт «Просмотреть код» (Inspect). Горячая клавиша: F12.
Шаг 3. В инструментах разработчика перейдите на вкладку «Консоль» (Console). Здесь уже можно писать код на JavaScript. Попробуйте ввести console.log(«Hello, world!») и нажмите Enter, чтобы запустить код.
С помощью Node.js
Node — среда выполнения кода JavaScript вне браузера. Вот, как запустить JS с помощью Node.js:
Шаг 1. Установите последнюю версию Node.js.
Шаг 2. Установите IDE или текстовый редактор. Мы будем использовать Visual Studio Code.
Шаг 3. В VS Code перейдите в Файл > Новый файл и напишите код на JS. Сохраните файл с расширением .js. Мы написали программу, которая выводит на экран строку «Hello, world!», поэтому файл будет называться helloworld.js.
Шаг 4. Откройте терминал/командную строку, перейдите к расположению файла (используйте команду cd ). Введите node helloworld.js и нажмите Enter. Вывод появится в терминале.
Примечание. JavaScript-код можно написать и запустить непосредственно в терминале. Для этого просто введите node и нажмите Enter.
С помощью веб-страницы
JavaScript изначально создавали для того, чтобы сделать веб-страницы интерактивными, поэтому JavaScript и HTML идут рука об руку. Вот, как запустить код на JS с помощью веб-страницы:
Шаг 1. Откройте VS Code. Перейдите в Файл > Новый файл. Сохраните файл с расширением .html. У нас это будет main.html.
Шаг 2. Скопируйте doctype, расположенный ниже. Это необходимый для запуска HTML-страницы код. Сохраните скопированный текст в файле.
Codechick
Шаг 3. Аналогично создайте файл с расширением .js. Напишите в файле следующий JS-код и сохраните его. У нас это будет helloworld.js.
console.log("Hello, world!");
Шаг 4. Вернитесь к файлу main.html и на 11 строке впишите название JS-файла. В нашем случае это будет выглядеть так:
Шаг 5. Откройте main.html с помощью браузера.
Шаг 6. Чтобы проверить, запустился ли ваш JS-код, щелкните правой кнопкой мыши в свободной области, нажмите «Просмотреть код» и перейдите на вкладку «Консоль».
Теперь, когда вы знаете, как запустить JavaScript, приступим к изучению основ JS.
СodeСhick.io — простой и эффективный способ изучения программирования.
2023 © ООО «Алгоритмы и практика»
Установка и вход в Live Share в Visual Studio Code
Вы готовы организовать совместную работу с помощью Live Share в Visual Studio Code? В этой статье показано, как настроить сеанс совместной работы в Visual Studio Code с помощью расширения Live Share.
Действия совместной работы, описанные здесь, включают один узел сеанса совместной работы и один или несколько гостей. Организатор — это пользователь, запустивший сеанс совместной работы, а гость — любой, кто присоединится к сеансу.
Вам достаточно краткой сводки? Перейдите к кратким руководствам по общему доступу или присоединению.
Знаете ли вы, что можно присоединиться к собственному сеансу совместной работы? Так вы сможете поработать с Live Share самостоятельно или запустить экземпляр Visual Studio или Visual Studio Code и подключиться к нему удаленно. Вы можете даже использовать одно удостоверение в обоих экземплярах. Проверьте ее.
Необходимые компоненты
Прежде всего вам необходима поддерживаемая версия Visual Studio Code, соответствующая базовым требованиям для Live Share.
Вам потребуется Visual Studio Code (1.72.0 или более поздней версии) на одном из следующих операционных систем:
- Windows: 7, 8.1 или 10.
- macOS: Sierra (10.12) и более поздних версий.
- Linux: 64-разрядная версия Ubuntu Desktop 16.04 или более поздних версий, Fedora Workstation 27 или более поздних версий или CentOS 7.
- 32-разрядная версия Linux не поддерживается.
- В настоящее время ARM не поддерживается.
- Сведения об использовании нисходящих дистрибутивов и других дистрибутивов см. в статье Сведения об установке Linux.
Установка расширения Live Share
Скачивая и используя Visual Studio Live Share, вы соглашаетесь с условиями лицензии и заявлением о конфиденциальности. Если у вас возникают проблемы, ознакомьтесь с руководством по устранению неполадок.
- Установите Visual Studio Code.
- Скачайте и установите расширение Visual Studio Live Share из Marketplace.
- Перезагрузите Visual Studio Code.
Действия по установке Linux
Среда Linux бывает очень разной. Учитывая количество сред и дистрибутивов для рабочего стола, установить Live Share может быть сложно. Процесс должен быть простым, если вы используете официальные дистрибутивы Visual Studio Code и:
- Ubuntu Desktop версии 16.04 и более поздних версий.
- Рабочая станция Fedora версии 27 и более поздних версий.
- CentOS 7.
Если вы используете нестандартную конфигурацию или подчиненное распределение, у вас могут возникнуть осложнения. Дополнительные сведения см. в статье Сведения об установке Linux.
Интеграция с браузером в Linux
Visual Studio Live Share обычно не требует дополнительных действий по установке, чтобы включить интеграцию браузера в Linux.
Если интеграцию с браузером настроить не удастся, вы можете присоединяться к сеансам совместной работы вручную.
Вход в Live Share
Для совместной работы необходимо выполнить вход в Visual Studio Live Share, чтобы все пользователи знали, кто вы. Этот вход является мерой безопасности и не добавляет вас в маркетинговые мероприятия или другие исследовательские мероприятия. Вы можете войти с помощью личной учетной записи Майкрософт (например, @outlook.com), рабочей или учебной учетной записи Майкрософт (Azure Active Directory) либо учетной записи GitHub. Войти очень просто.
Выберите live Share в строке состояния или нажмите клавиши CTRL+SHIFT+P или CMD+SHIFT+P , а затем выберите Live Share: Вход.
Отображается запрос на вход. При выборе предпочтения входа откроется браузер, чтобы завершить процесс входа. Закройте браузер после завершения.
Если Visual Studio Code не выбирает вход после завершения процесса входа в браузере, ознакомьтесь с дополнительными советами по устранению неполадок .
Руководство. Тестирование библиотеки классов .NET с помощью Visual Studio Code
В этом руководстве показано, как автоматизировать модульное тестирование путем добавления тестового проекта в решение.
Необходимые компоненты
- В этом руководстве используется решение, созданное при работе со статьей Создание библиотеки классов .NET в Visual Studio Code.
Создание проекта модульного теста
Модульные тесты обеспечивают автоматическое тестирование программного обеспечения во время разработки и публикации. В этом руководстве используется платформа тестирования MSTest. MSTest — это одна из трех доступных для выбора платформ тестирования. Другими являются xUnit и nUnit.
- Запустите Visual Studio Code.
- Откройте решение ClassLibraryProjects , созданное при работе со статьей Создание библиотеки классов .NET в Visual Studio Code.
- Создайте проект модульного теста с именем StringLibraryTest.
dotnet new mstest -o 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].
dotnet sln add StringLibraryTest/StringLibraryTest.csproj
Добавление ссылки на проект
Чтобы тестовый проект работал с классом StringLibrary , добавьте в проект StringLibraryTest ссылку на проект StringLibrary .
-
Выполните следующую команду:
dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
Добавление и выполнение методов модульного теста
При вызове модульного теста 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 '': true; Actual: ", 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 '': false; Actual: ", 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 '': false; Actual: ", word == null ? "" : word, result)); > > >
dotnet test StringLibraryTest/StringLibraryTest.csproj
В выходных данных терминала показано, что все тесты пройдены.
Starting test execution, please wait. A total of 1 test files matched the specified pattern. Passed! - Failed: 0, Passed: 3, Skipped: 0, Total: 3, Duration: 3 ms - StringLibraryTest.dll (net8.0)
Обработка сбоев теста
Выполняя разработку на основе тестирования (TDD), вы сначала пишете тесты, и они завершаются сбоем при первом запуске. Затем вы добавляете код в приложение, и тест успешно выполняется. В рамках этого учебника вы создали тест после написания кода приложения для его проверки, поэтому тест был пройден. Чтобы проверить, завершается ли тест ошибкой, как и ожидается, добавьте недопустимое значение во входные данные теста.
-
Измените массив words в методе TestDoesNotStartWithUpper , включив в него строку «Error».
string[] words = < "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " >;
dotnet test StringLibraryTest/StringLibraryTest.csproj
Выходные данные терминала показывают, что один тест завершается ошибкой, и он предоставляет сообщение об ошибке для неудачного теста: «Assert.IsFalse не удалось. Expected for ‘Error’: false; actual: True». Из-за этого сбоя строки в массиве, расположенные после слова «Error», не проверялись.
Starting test execution, please wait. A total of 1 test files matched the specified pattern. Failed TestDoesNotStartWithUpper [28 ms] Error Message: Assert.IsFalse failed. Expected for 'Error': false; Actual: True Stack Trace: at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33 Failed! - Failed: 1, Passed: 2, Skipped: 0, Total: 3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
Тестирование версии выпуска для библиотеки
Теперь, когда все тесты пройдены при выполнении сборки в режиме отладки, следует запустить все тесты еще раз, теперь уже для сборки библиотеки в режиме выпуска. Некоторые факторы, например оптимизации компилятора, иногда могут вызывать разное поведение сборки в режимах отладки и выпуска.
-
Запустите тесты с конфигурацией сборки «Выпуск».
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
Отладка тестов
Если в качестве IDE вы используете Visual Studio Code, то можете следовать инструкциям из руководства по отладке консольного приложения .NET с помощью Visual Studio Code, чтобы выполнить отладку кода с применением проекта модульного теста. Вместо запуска проекта приложения ShowCase откройте StringLibraryTest/UnitTest1.cs и выберите Debug All Tests (Выполнить отладку всех тестов) между строками 7 и 8. Если вы не можете найти его, нажмите клавиши CTRL + SHIFT + P , чтобы открыть палитру команд, и введите команду перезагрузки окна.
Visual Studio Code запускает тестовый проект с присоединенным отладчиком. Выполнение будет прервано в любой точке останова, добавленной в тестовый проект или базовый код библиотеки.
Дополнительные ресурсы
Следующие шаги
В этом руководстве вы выполнили модульное тестирование библиотеки классов. Чтобы сделать библиотеку доступной другим пользователям, опубликуйте ее в NuGet в качестве пакета. Чтобы узнать, как это делать, следуйте указаниям в руководстве по NuGet:
Если библиотека опубликована как пакет NuGet, ее могут устанавливать и использовать другие пользователи. Чтобы узнать, как это делать, следуйте указаниям в руководстве по NuGet:
Библиотеку не нужно распространять как пакет. Ее можно объединить с консольным приложением, где она используется. Чтобы узнать, как опубликовать консольное приложение, ознакомьтесь с предыдущим руководством в этой серии:
Пакет средств разработки для расширения Visual Studio Code C# предоставляет дополнительные средства для разработки приложений и библиотек C#:
В этом руководстве показано, как автоматизировать модульное тестирование путем добавления тестового проекта в решение.
Необходимые компоненты
- В этом руководстве используется решение, созданное при работе со статьей Создание библиотеки классов .NET в Visual Studio Code.
Создание проекта модульного теста
Модульные тесты обеспечивают автоматическое тестирование программного обеспечения во время разработки и публикации. В этом руководстве используется платформа тестирования MSTest. MSTest — это одна из трех доступных для выбора платформ тестирования. Другими являются xUnit и nUnit.
- Запустите Visual Studio Code.
- Откройте решение ClassLibraryProjects , созданное при работе со статьей Создание библиотеки классов .NET в Visual Studio Code.
- Создайте проект модульного теста с именем StringLibraryTest.
dotnet new mstest -o StringLibraryTest
Шаблон проекта создает файл UnitTest1.cs со следующим кодом:
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace StringLibraryTest < [TestClass] public class UnitTest1 < [TestMethod] public void TestMethod1() < >> >
- Он импортирует пространство имен Microsoft.VisualStudio.TestTools.UnitTesting, которое содержит типы, используемые для модульного тестирования.
- Он применяет атрибут TestClassAttribute к классу UnitTest1 .
- Он применяет атрибут TestMethodAttribute для определения TestMethod1 .
При вызове модульного теста автоматически выполняются все методы теста, помеченные атрибутом [TestMethod], в тестовом классе, помеченном атрибутом [TestClass].
dotnet sln add StringLibraryTest/StringLibraryTest.csproj
Добавление ссылки на проект
Чтобы тестовый проект работал с классом StringLibrary , добавьте в проект StringLibraryTest ссылку на проект StringLibrary .
-
Выполните следующую команду:
dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
Добавление и выполнение методов модульного теста
При вызове модульного теста 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 '': true; Actual: ", 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 '': false; Actual: ", 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 '': false; Actual: ", word == null ? "" : word, result)); > > >
dotnet test StringLibraryTest/StringLibraryTest.csproj
В выходных данных терминала показано, что все тесты пройдены.
Starting test execution, please wait. A total of 1 test files matched the specified pattern. Passed! - Failed: 0, Passed: 3, Skipped: 0, Total: 3, Duration: 3 ms - StringLibraryTest.dll (net7.0)
Обработка сбоев теста
Выполняя разработку на основе тестирования (TDD), вы сначала пишете тесты, и они завершаются сбоем при первом запуске. Затем вы добавляете код в приложение, и тест успешно выполняется. В рамках этого учебника вы создали тест после написания кода приложения для его проверки, поэтому тест был пройден. Чтобы проверить, завершается ли тест ошибкой, как и ожидается, добавьте недопустимое значение во входные данные теста.
-
Измените массив words в методе TestDoesNotStartWithUpper , включив в него строку «Error».
string[] words = < "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " >;
dotnet test StringLibraryTest/StringLibraryTest.csproj
Выходные данные терминала показывают, что один тест завершается ошибкой, и он предоставляет сообщение об ошибке для неудачного теста: «Assert.IsFalse не удалось. Expected for ‘Error’: false; actual: True». Из-за этого сбоя строки в массиве, расположенные после слова «Error», не проверялись.
Starting test execution, please wait. A total of 1 test files matched the specified pattern. Failed TestDoesNotStartWithUpper [28 ms] Error Message: Assert.IsFalse failed. Expected for 'Error': false; Actual: True Stack Trace: at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33 Failed! - Failed: 1, Passed: 2, Skipped: 0, Total: 3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
Тестирование версии выпуска для библиотеки
Теперь, когда все тесты пройдены при выполнении сборки в режиме отладки, следует запустить все тесты еще раз, теперь уже для сборки библиотеки в режиме выпуска. Некоторые факторы, например оптимизации компилятора, иногда могут вызывать разное поведение сборки в режимах отладки и выпуска.
-
Запустите тесты с конфигурацией сборки «Выпуск».
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
Отладка тестов
Если в качестве IDE вы используете Visual Studio Code, то можете следовать инструкциям из руководства по отладке консольного приложения .NET с помощью Visual Studio Code, чтобы выполнить отладку кода с применением проекта модульного теста. Вместо запуска проекта приложения ShowCase откройте StringLibraryTest/UnitTest1.cs и выберите Debug All Tests (Выполнить отладку всех тестов) между строками 7 и 8. Если вы не можете найти его, нажмите клавиши CTRL + SHIFT + P , чтобы открыть палитру команд, и введите команду перезагрузки окна.
Visual Studio Code запускает тестовый проект с присоединенным отладчиком. Выполнение будет прервано в любой точке останова, добавленной в тестовый проект или базовый код библиотеки.
Дополнительные ресурсы
Следующие шаги
В этом руководстве вы выполнили модульное тестирование библиотеки классов. Чтобы сделать библиотеку доступной другим пользователям, опубликуйте ее в NuGet в качестве пакета. Чтобы узнать, как это делать, следуйте указаниям в руководстве по NuGet:
Если библиотека опубликована как пакет NuGet, ее могут устанавливать и использовать другие пользователи. Чтобы узнать, как это делать, следуйте указаниям в руководстве по NuGet:
Библиотеку не нужно распространять как пакет. Ее можно объединить с консольным приложением, где она используется. Чтобы узнать, как опубликовать консольное приложение, ознакомьтесь с предыдущим руководством в этой серии:
В этом руководстве показано, как автоматизировать модульное тестирование путем добавления тестового проекта в решение.
Необходимые компоненты
- В этом руководстве используется решение, созданное при работе со статьей Создание библиотеки классов .NET в Visual Studio Code.
Создание проекта модульного теста
Модульные тесты обеспечивают автоматическое тестирование программного обеспечения во время разработки и публикации. В этом руководстве используется платформа тестирования MSTest. MSTest — это одна из трех доступных для выбора платформ тестирования. Другими являются xUnit и nUnit.
- Запустите Visual Studio Code.
- Откройте решение ClassLibraryProjects , созданное при работе со статьей Создание библиотеки классов .NET в Visual Studio Code.
- Создайте проект модульного теста с именем StringLibraryTest.
dotnet new mstest -f net6.0 -o StringLibraryTest
Команда -f net6.0 изменяет целевую платформу по умолчанию на net6.0 версию. Команда -o или —output задает расположение для размещения созданных выходных данных. Шаблон проекта создает файл UnitTest1.cs со следующим кодом:
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace StringLibraryTest < [TestClass] public class UnitTest1 < [TestMethod] public void TestMethod1() < >> >
- Он импортирует пространство имен Microsoft.VisualStudio.TestTools.UnitTesting, которое содержит типы, используемые для модульного тестирования.
- Он применяет атрибут TestClassAttribute к классу UnitTest1 .
- Он применяет атрибут TestMethodAttribute для определения TestMethod1 .
При вызове модульного теста автоматически выполняются все методы теста, помеченные атрибутом [TestMethod], в тестовом классе, помеченном атрибутом [TestClass].
dotnet sln add StringLibraryTest/StringLibraryTest.csproj
Добавление ссылки на проект
Чтобы тестовый проект работал с классом StringLibrary , добавьте в проект StringLibraryTest ссылку на проект StringLibrary .
-
Выполните следующую команду:
dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
Добавление и выполнение методов модульного теста
При вызове модульного теста 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 '': true; Actual: ", 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 '': false; Actual: ", 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 '': false; Actual: ", word == null ? "" : word, result)); > > >
dotnet test StringLibraryTest/StringLibraryTest.csproj
В выходных данных терминала показано, что все тесты пройдены.
Starting test execution, please wait. A total of 1 test files matched the specified pattern. Passed! - Failed: 0, Passed: 3, Skipped: 0, Total: 3, Duration: 3 ms - StringLibraryTest.dll (net6.0)
Обработка сбоев теста
Выполняя разработку на основе тестирования (TDD), вы сначала пишете тесты, и они завершаются сбоем при первом запуске. Затем вы добавляете код в приложение, и тест успешно выполняется. В рамках этого учебника вы создали тест после написания кода приложения для его проверки, поэтому тест был пройден. Чтобы проверить, завершается ли тест ошибкой, как и ожидается, добавьте недопустимое значение во входные данные теста.
-
Измените массив words в методе TestDoesNotStartWithUpper , включив в него строку «Error».
string[] words = < "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " >;
dotnet test StringLibraryTest/StringLibraryTest.csproj
Выходные данные терминала показывают, что один тест завершается ошибкой, и он предоставляет сообщение об ошибке для неудачного теста: «Assert.IsFalse не удалось. Expected for ‘Error’: false; actual: True». Из-за этого сбоя строки в массиве, расположенные после слова «Error», не проверялись.
Starting test execution, please wait. A total of 1 test files matched the specified pattern. Failed TestDoesNotStartWithUpper [28 ms] Error Message: Assert.IsFalse failed. Expected for 'Error': false; Actual: True Stack Trace: at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33 Failed! - Failed: 1, Passed: 2, Skipped: 0, Total: 3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
Тестирование версии выпуска для библиотеки
Теперь, когда все тесты пройдены при выполнении сборки в режиме отладки, следует запустить все тесты еще раз, теперь уже для сборки библиотеки в режиме выпуска. Некоторые факторы, например оптимизации компилятора, иногда могут вызывать разное поведение сборки в режимах отладки и выпуска.
-
Запустите тесты с конфигурацией сборки «Выпуск».
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
Отладка тестов
Если в качестве IDE вы используете Visual Studio Code, то можете следовать инструкциям из руководства по отладке консольного приложения .NET с помощью Visual Studio Code, чтобы выполнить отладку кода с применением проекта модульного теста. Вместо запуска проекта приложения ShowCase откройте StringLibraryTest/UnitTest1.cs и выберите Debug All Tests (Выполнить отладку всех тестов) между строками 7 и 8. Если вы не можете найти его, нажмите клавиши CTRL + SHIFT + P , чтобы открыть палитру команд, и введите команду перезагрузки окна.
Visual Studio Code запускает тестовый проект с присоединенным отладчиком. Выполнение будет прервано в любой точке останова, добавленной в тестовый проект или базовый код библиотеки.
Дополнительные ресурсы
Следующие шаги
В этом руководстве вы выполнили модульное тестирование библиотеки классов. Чтобы сделать библиотеку доступной другим пользователям, опубликуйте ее в NuGet в качестве пакета. Чтобы узнать, как это делать, следуйте указаниям в руководстве по NuGet:
Если библиотека опубликована как пакет NuGet, ее могут устанавливать и использовать другие пользователи. Чтобы узнать, как это делать, следуйте указаниям в руководстве по NuGet:
Библиотеку не нужно распространять как пакет. Ее можно объединить с консольным приложением, где она используется. Чтобы узнать, как опубликовать консольное приложение, ознакомьтесь с предыдущим руководством в этой серии:
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по