Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве вы познакомитесь с интерактивным процессом пошагового создания примерного решения, чтобы изучить концепции модульного тестирования. Если вы предпочитаете следовать руководству с помощью предварительно созданного решения, просмотрите или скачайте пример кода перед началом работы. Инструкции по скачиванию см. в примерах и руководствах.
В этой статье описывается тестирование проекта .NET Core. Если вы тестируете проект ASP.NET Core, см. тесты интеграции в ASP.NET Core.
Предпосылки
- Пакет SDK для .NET 8 или более поздние версии.
- Текстовый редактор или редактор кода по вашему выбору.
Создание исходного проекта
Откройте окно терминала. Создайте каталог с именем unit-testing-with-fsharp для хранения решения. В этом новом каталоге выполните следующую команду, чтобы создать новый файл решения для библиотеки классов и тестового проекта:
dotnet new sln
Затем создайте каталог MathService . На следующей схеме показаны структура каталога и файлов на данный момент:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Сделайте MathService текущим каталогом и выполните следующую команду, чтобы создать исходный проект:
dotnet new classlib -lang "F#"
Вы создаете неудачную реализацию математической службы:
module MyMath =
let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))
Измените каталог обратно в каталог unit-testing-with-fsharp. Выполните следующую команду, чтобы добавить проект библиотеки классов в решение:
dotnet sln add .\MathService\MathService.fsproj
Создание тестового проекта
Затем создайте каталог MathService.Tests. В следующей схеме показана структура каталога:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Создайте каталог MathService.Tests в текущем каталоге и создайте проект с помощью следующей команды:
dotnet new nunit -lang "F#"
Эта команда создает тестовый проект, использующий NUnit в качестве платформы тестирования. Созданный шаблон настраивает средство выполнения теста в MathServiceTests.fsproj:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="NUnit" Version="4.1.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
</ItemGroup>
Тестовый проект требует создания и запуска модульных тестов других пакетов.
dotnet new
на предыдущем шаге добавлен NUnit и адаптер теста NUnit. Теперь добавьте библиотеку классов MathService
в качестве другой зависимости в проект. Используйте команду dotnet reference add
:
dotnet reference add ../MathService/MathService.fsproj
Весь файл можно увидеть в репозитории примеров на сайте GitHub.
У вас есть следующий окончательный макет решения:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Test Source Files
MathService.Tests.fsproj
Выполните следующую команду в каталоге unit-testing-with-fsharp :
dotnet sln add .\MathService.Tests\MathService.Tests.fsproj
Создание первого теста
Вы пишете один не проходящий тест, делаете его успешным, а затем повторяете процесс. Откройте UnitTest1.fs и добавьте следующий код:
namespace MathService.Tests
open System
open NUnit.Framework
open MathService
[<TestFixture>]
type TestClass () =
[<Test>]
member this.TestMethodPassing() =
Assert.That(true, Is.True)
[<Test>]
member this.FailEveryTime() = Assert.That(false, Is.True)
Атрибут [<TestFixture>]
обозначает класс, содержащий тесты. Атрибут [<Test>]
обозначает метод тестирования, выполняемый тестовым запускателем. В каталоге unit-testing-with-fsharp выполните dotnet test
, чтобы создать тесты и библиотеку классов, а затем запустить тесты. Тестовый раннер NUnit является точкой входа программы для выполнения тестов.
dotnet test
запускает средство выполнения тестов, используя проект модульного теста, который вы создали.
Эти два теста демонстрируют наиболее простые примеры успешных и неудачных тестов.
My test
успешно проходит и Fail every time
завершается ошибкой. Теперь создайте тест для метода squaresOfOdds
. Метод squaresOfOdds
возвращает последовательность квадратов всех нечетных целых значений, которые являются частью входной последовательности. Вместо того чтобы одновременно записывать все эти функции, можно итеративно создавать тесты, проверяющие функциональные возможности. Чтобы каждый тест прошел, вам нужно создать необходимую функциональность для метода.
Самый простой тест, который можно написать, заключается в вызове squaresOfOdds
со всеми четными числами, где результат должен быть пустой последовательностью целых чисел. Вот этот тест:
[<Test>]
member this.TestEvenSequence() =
let expected = Seq.empty<int>
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
Assert.That(actual, Is.EqualTo(expected))
Обратите внимание, что expected
последовательность преобразуется в список. Платформа NUnit использует множество стандартных типов .NET. Эта зависимость означает, что общедоступный интерфейс и ожидаемые результаты поддерживают ICollection, а не IEnumerable.
При запуске теста вы увидите, что тест завершается сбоем. Это связано с тем, что вы еще не создали реализацию. Выполните этот тест, написав самый простой код в классе Library.fs в проекте MathService, который работает:
let squaresOfOdds xs =
Seq.empty<int>
В каталоге unit-testing-with-fsharp выполните dotnet test
еще раз. Команда dotnet test
запускает сборку для проекта MathService
, а затем для проекта MathService.Tests
. После создания обоих проектов он запускает ваши тесты. Два теста уже пройдены.
Выполнение требований
Теперь, когда вы выполнили один тест, пришло время написать больше тестов. Следующий простой случай работает с последовательностью, единственное нечетное число которой — 1
. Число 1 проще, так как квадрат 1 равен 1. Вот следующий тест:
[<Test>]
member public this.TestOnesAndEvens() =
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
Assert.That(actual, Is.EqualTo(expected))
Исполнение dotnet test
проваливает новый тест. Для обработки этого нового теста необходимо обновить метод squaresOfOdds
. Чтобы пройти этот тест, необходимо отфильтровать все четные числа из последовательности. Это можно сделать, написав небольшую функцию фильтра и используя Seq.filter
:
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
Есть еще один шаг: возвести в квадрат каждое из нечетных чисел. Начните с написания нового теста:
[<Test>]
member public this.TestSquaresOfOdds() =
let expected = [1; 9; 25; 49; 81]
let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
Assert.That(actual, Is.EqualTo(expected))
Вы можете скорректировать тест, направив отфильтрованную последовательность с помощью операции отображения для вычисления квадрата каждого нечетного числа.
let private square x = x * x
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
|> Seq.map square
Вы создали небольшую библиотеку и набор модульных тестов для этой библиотеки. Вы структурировали решение таким образом, чтобы добавление новых пакетов и тестов было частью обычного рабочего процесса. Вы сосредоточили большую часть времени и усилий на решении целей приложения.