Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве вы познакомитесь с интерактивным процессом пошагового создания примерного решения, чтобы изучить концепции модульного тестирования. Если вы предпочитаете следовать руководству с помощью предварительно созданного решения, просмотрите или скачайте пример кода перед началом. Инструкции по скачиванию смотрите в разделах Образцы и руководства.
В этой статье описывается тестирование проекта .NET Core. Если вы тестируете проект ASP.NET Core, см. тесты интеграции в ASP.NET Core.
Предпосылки
- Последняя версия .NET SDK
- Visual Studio Code редактор
- C# DevKit
Создание исходного проекта
Откройте окно оболочки. Создайте каталог с именем unit-testing-using-mstest для хранения решения. В этом новом каталоге запустите dotnet new sln
, чтобы создать новый файл решения для библиотеки классов и тестового проекта. Создайте каталог PrimeService. Следующая схема показывает структуру каталогов и файлов:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Сделайте PrimeService текущим каталогом и запустите dotnet new classlib
для создания исходного проекта. Переименуйте Class1.cs в PrimeService.cs. Замените код в файле следующим кодом, чтобы создать неудачную реализацию класса PrimeService
:
using System;
namespace Prime.Services
{
public class PrimeService
{
public bool IsPrime(int candidate)
{
throw new NotImplementedException("Please create a test first.");
}
}
}
Измените каталог обратно в каталог unit-testing-using-mstest. Запустите dotnet sln add
, чтобы добавить проект библиотеки классов в решение:
dotnet sln add PrimeService/PrimeService.csproj
Создание тестового проекта
Создайте каталог PrimeService.Tests. В следующей схеме показана структура каталога:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Сделайте каталог PrimeService.Tests текущим каталогом и создайте новый проект с помощью dotnet new mstest
. Команда dotnet new создает тестовый проект, использующий MSTest в качестве тестовой библиотеки. Шаблон настраивает тестовый запуск в файле PrimeServiceTests.csproj:
<ItemGroup>
<PackageReference Include="MSTest" Version="3.2.0" />
<PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
</ItemGroup>
Тестовый проект требует создания и запуска модульных тестов других пакетов.
dotnet new
на предыдущем шаге добавил необходимые пакеты и средства MSTest для создания отчетов о покрытии кода.
Добавьте библиотеку классов PrimeService
в качестве другой зависимости в проект. Используйте команду dotnet reference add
:
dotnet reference add ../PrimeService/PrimeService.csproj
Весь файл можно увидеть в репозитории примеров на сайте GitHub.
В следующей схеме показан окончательный макет решения:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeServiceTests.csproj
Перейдите в каталог unit-testing-using-mstest и запустите dotnet sln add
:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
Создание первого теста
Напишите тест, который не проходит, сделайте его проходящим, затем повторите этот процесс. Удалите UnitTest1.cs из каталога PrimeService.Tests и создайте файл C# с именем PrimeService_IsPrimeShould.cs со следующим содержимым:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;
namespace Prime.UnitTests.Services
{
[TestClass]
public class PrimeService_IsPrimeShould
{
private readonly PrimeService _primeService;
public PrimeService_IsPrimeShould()
{
_primeService = new PrimeService();
}
[TestMethod]
public void IsPrime_InputIs1_ReturnFalse()
{
bool result = _primeService.IsPrime(1);
Assert.IsFalse(result, "1 should not be prime");
}
}
}
Атрибут TestClass обозначает класс, содержащий модульные тесты. Атрибут TestMethod указывает, что метод является методом теста.
Сохраните этот файл и выполните dotnet test
, чтобы создать тесты и библиотеку классов, а затем запустить тесты. Средство выполнения тестов MSTest содержит точку входа программы, чтобы запустить ваши тесты.
dotnet test
запускает средство выполнения тестов, используя проект модульного теста, который вы создали.
Ваш тест не удался. Вы еще не создали реализацию. Выполните этот тест, написав самый простой код в классе PrimeService
, который работает:
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
В директории unit-testing-using-mstest запустите dotnet test
еще раз. Команда dotnet test
запускает сборку для проекта PrimeService
, а затем для проекта PrimeService.Tests
. После создания обоих проектов он запускает этот единичный тест. Это пройдет.
Добавление дополнительных функций
Теперь, когда вы выполнили один тест, пришло время написать больше тестов. Существует несколько других простых случаев для простых чисел: 0, -1. Вы можете добавить новые тесты с помощью атрибута TestMethod, но это быстро становится утомительно. Существуют другие атрибуты MSTest, позволяющие создавать набор аналогичных тестов. Метод теста может выполнять один и тот же код, но иметь разные входные аргументы. Атрибут dataRow можно использовать для указания значений для этих входных данных.
Вместо создания новых тестов примените эти два атрибута для создания одного управляемого данными теста. Тест на основе данных — это метод, который проверяет несколько значений менее двух значений, что является самым низким простым числом. Добавьте новый метод теста в PrimeService_IsPrimeShould.cs:
[TestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService.IsPrime(value);
Assert.IsFalse(result, $"{value} should not be prime");
}
Запустите dotnet test
, и два из этих тестов завершаются с ошибкой. Чтобы выполнить все тесты, измените предложение if
в начале метода IsPrime
в файле PrimeService.cs:
if (candidate < 2)
Продолжайте итерацию, добавляя дополнительные тесты, дополнительные теории и другие коды в основной библиотеке. У вас есть завершенная версия тестов, а полная реализация библиотеки.
Вы создали небольшую библиотеку и набор модульных тестов для этой библиотеки. Вы структурировали решение таким образом, чтобы добавление новых пакетов и тестов было частью обычного рабочего процесса. Вы сосредоточили большую часть времени и усилий на решении целей приложения.