이 자습서에서는 단위 테스트 개념을 알아보기 위해 샘플 솔루션을 단계별로 빌드하는 대화형 환경을 안내합니다.
이 문서에서는 .NET Core 프로젝트를 테스트하는 방법에 대해 알아봅니다. ASP.NET Core 프로젝트를 테스트하는 경우 ASP.NET Core 통합 테스트를 참조하세요.
Prerequisites
- .NET 10 SDK 또는 이후 버전.
- 선택하는 텍스트 편집기 또는 코드 편집기입니다.
TUnit은 전적으로 Microsoft.Testing.Platform (MTP) 기반으로 빌드되며 VSTest를 지원하지 않습니다. 이 자습서에서는 .NET 10 SDK가 필요한 dotnet test의 MTP 모드를 사용합니다.
원본 프로젝트 만들기
셸 창을 엽니다. 솔루션을 저장할 unit-testing-using-tunit이라는 디렉터리를 만듭니다. 이 새 디렉터리 내에서 다음 명령을 실행하여 클래스 라이브러리 및 테스트 프로젝트에 대한 새 솔루션 파일을 만듭니다.
dotnet new sln
다음으로, PrimeService 디렉터리를 만듭니다. 다음 개요는 지금까지의 디렉터리 및 파일 구조를 보여줍니다.
/unit-testing-using-tunit
unit-testing-using-tunit.slnx
/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-tunit 디렉터리로 돌아갑니다. 다음 명령을 실행하여 솔루션에 클래스 라이브러리 프로젝트를 추가합니다.
dotnet sln add PrimeService/PrimeService.csproj
테스트 프로젝트 만들기
다음으로, PrimeService.Tests 디렉터리를 만듭니다. 다음 개요는 디렉터리 구조를 보여줍니다.
/unit-testing-using-tunit
unit-testing-using-tunit.slnx
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
TUnit 프로젝트 템플릿은 .NET SDK에 포함되지 않습니다. 다음 명령을 사용하여 설치합니다.
dotnet new install TUnit.Templates
디렉터리를 PrimeService.Tests 디렉터리로 변경하고 다음 명령을 사용하여 새 프로젝트를 만듭니다.
dotnet new TUnit
Note
템플릿 짧은 이름은 대/소문자를 구분합니다.
TUnit이 아니라 tunit을 사용합니다.
dotnet new 명령은 TUnit을 테스트 라이브러리로 사용하는 테스트 프로젝트를 만듭니다. 생성된 PrimeService.Tests.csproj 파일은 TUnit 패키지를 참조하는 실행 가능한 프로젝트입니다(버전 번호가 다를 수 있음).
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="TUnit" Version="1.*" />
</ItemGroup>
TUnit 패키지에는 테스트 프레임워크, 어설션 라이브러리 및 MTP 테스트 실행기가 포함되어 있으므로 프로젝트에 다른 테스트 패키지가 필요하지 않습니다. 템플릿은 샘플 테스트도 추가합니다. 이 자습서에서 자체 테스트로 이를 대체하므로 PrimeService.Tests 디렉터리에서 모든 .cs 파일 및 Data 디렉터리를 삭제합니다.
이제 PrimeService 클래스 라이브러리를 프로젝트에 다른 종속성으로 추가합니다.
dotnet reference add 명령을 사용합니다.
dotnet reference add ../PrimeService/PrimeService.csproj
다음 개요는 최종 솔루션 레이아웃을 보여줍니다.
/unit-testing-using-tunit
unit-testing-using-tunit.slnx
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeService.Tests.csproj
unit-testing-using-tunit 디렉터리에서 다음 명령을 실행합니다.
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
dotnet test의 MTP 모드 구성
TUnit은 VSTest를 지원하지 않으므로 dotnet test는 해당 MTP 모드에서 실행해야 합니다.
unit-testing-using-tunit 디렉터리에서 다음 내용으로 global.json 파일을 만듭니다.
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
자세한 내용은 dotnet 테스트의 MTP 모드를 참조하세요.
첫 번째 테스트 만들기
실패한 테스트 하나를 작성하고 통과한 다음 프로세스를 반복합니다. PrimeService.Tests 디렉터리에서 다음 코드를 사용하여 PrimeService_IsPrimeShould.cs 파일을 만듭니다.
namespace Prime.UnitTests.Services
{
using Prime.Services;
public class PrimeService_IsPrimeShould
{
private readonly PrimeService _primeService = new();
[Test]
public async Task IsPrime_InputIs1_ReturnFalse()
{
var result = _primeService.IsPrime(1);
await Assert.That(result).IsFalse();
}
}
}
[Test] 특성은 메서드가 테스트 메서드임을 나타냅니다. TUnit은 클래스에 특성(attribute)이 필요하지 않습니다. TUnit 어설션은 비동기이므로 테스트 메서드는 Task를 반환하고 Assert.That를 await합니다. 패키지는 자체 네임스페이스에 대한 전역 using 지시문을 추가하므로 파일에는 필요하지 않습니다.
Note
지시 using Prime.Services; 문은 의도적으로 네임스페이스 내에 있습니다. MTP는 프로젝트의 루트 네임스페이스에서 테스트 애플리케이션의 진입점을 생성합니다 PrimeService.Tests. 해당 네임스페이스는 파일 맨 위에 있는 using 지시문에서 PrimeService 클래스를 숨기지만 네임스페이스 내부의 지시문에서는 숨겨지지 않습니다.
이 파일을 저장하고 dotnet test 명령을 실행하여 테스트 및 클래스 라이브러리를 빌드하고 테스트를 실행합니다. TUnit 테스트 프로젝트에는 테스트를 실행할 프로그램 진입점이 포함되어 있습니다.
dotnet test는 만든 단위 테스트 프로젝트를 사용하여 테스트 애플리케이션을 시작합니다.
테스트가 실패합니다. 아직 구현을 만들지 않았습니다. 작동하는 PrimeService 클래스에서 가장 간단한 코드를 작성하여 테스트를 통과합니다.
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
unit-testing-using-tunit 디렉터리에서 dotnet test를 다시 실행합니다.
dotnet test 명령은 PrimeService 프로젝트 및 PrimeService.Tests 프로젝트에 대한 빌드를 실행합니다. 두 프로젝트를 모두 빌드한 후 이 단일 테스트를 실행합니다. 통과합니다.
추가 기능 추가
테스트를 한 번 통과했으니 이제 더 많은 테스트를 작성해야 합니다. 소수에 대한 몇 가지 다른 간단한 사례가 있습니다: 0, -1.
[Test] 특성을 사용하여 새 테스트를 추가할 수 있지만 빠르게 지루해집니다. TUnit은 동일한 코드를 실행하지만 입력 인수가 다른 테스트 모음을 만들기 위한 [Arguments] 특성을 제공합니다.
새 테스트를 만드는 대신 이 특성을 적용하여 단일 데이터 기반 테스트를 만듭니다. 메서드를 IsPrime_InputIs1_ReturnFalse 다음 코드로 바꿉다. 데이터 기반 테스트는 가장 낮은 소수인 2보다 작은 여러 값을 테스트하는 방법입니다.
[Test]
[Arguments(-1)]
[Arguments(0)]
[Arguments(1)]
public async Task IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService.IsPrime(value);
await Assert.That(result).IsFalse();
}
dotnet test실행하면 이러한 테스트 중 두 가지가 실패합니다. 모든 테스트를 통과하려면 if 파일에서 IsPrime 메서드의 시작 부분에 있는 절을 변경합니다.
if (candidate < 2)
주 라이브러리에 더 많은 테스트 및 코드를 추가하여 계속 반복하세요.
작은 라이브러리와 해당 라이브러리에 대한 단위 테스트 집합을 빌드했습니다. 또한 새 패키지 및 테스트를 추가하는 것이 표준 워크플로의 일부가 되도록 솔루션을 구성했습니다. 애플리케이션의 목표를 해결하는 데 대부분의 시간과 노력을 집중했습니다.
또한, 다음을 참조하세요.
- TUnit 설명서
- 선택한 단위 테스트 실행
- 단위 테스트 순서 지정
- dotnet reference add - .NET 참조 추가 명령어
- dotnet 테스트
.NET