MSTest 및 .NET을 사용한 C# 단위 테스트
이 자습서에서는 샘플 솔루션을 단계별로 빌드하는 대화형 환경을 통해 단위 테스트 개념을 알아볼 수 있습니다. 미리 빌드된 솔루션을 사용하여 이 자습서를 진행하려는 경우 시작하기 전에 샘플 코드를 보거나 다운로드. 다운로드 지침은 샘플 및 자습서를 참조하세요.
이 문서에서는 .NET Core 프로젝트를 테스트하는 방법에 대해 설명합니다. ASP.NET Core 프로젝트를 테스트하는 경우 ASP.NET Core의 통합 테스트를 참조하세요.
필수 조건
소스 프로젝트 만들기
셸 창을 엽니다. 솔루션을 저장할 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="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<PackageReference Include="MSTest.TestAdapter" Version="2.1.1" />
<PackageReference Include="MSTest.TestFramework" Version="2.1.1" />
<PackageReference Include="coverlet.collector" Version="1.3.0" />
</ItemGroup>
테스트 프로제트는 다른 패키지에 단위 테스트를 만들고 실행하도록 요구합니다. 이전 단계에서 dotnet new
는 코드 검사 보고를 위해 MSTest SDK, MSTest 테스트 프레임워크, MSTest 실행기, coverlet을 추가했습니다.
PrimeService
클래스 라이브러리를 프로젝트에 다른 종속성으로 추가합니다. dotnet add reference
명령을 사용합니다.
dotnet add reference ../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
첫 번째 테스트 만들기
하나의 실패 테스트를 작성하고, 테스트가 통과하도록 만든 다음, 이 프로세스를 반복합니다. PrimeService.Tests 디렉터리에서 UnitTest1.cs를 제거하고 다음과 같은 내용으로 새 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 Test Runner에는 테스트를 실행할 프로그램 진입점이 포함되어 있습니다. dotnet test
는 만든 단위 테스트 프로젝트를 사용하여 Test Runner를 시작합니다.
테스트가 실패합니다. 구현은 아직 만들지 않았습니다. 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 특성을 사용하여 그러한 입력의 값을 지정할 수 있습니다.
새 테스트를 만드는 대신 이러한 두 특성을 적용하여 단일 데이터 기반 테스트를 만듭니다. 이 데이터 기반 테스트는 가장 작은 소수인 2보다 작은 값 몇 개를 테스트하는 메서드입니다. 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
를 실행합니다. 그러면 이러한 테스트 중 2개가 실패합니다. 모든 테스트를 통과하려면 PrimeService.cs 파일에서 IsPrime
메서드의 시작 부분에 있는 if
절을 변경합니다.
if (candidate < 2)
기본 라이브러리에서 더 많은 테스트, 더 많은 이론, 더 많은 코드를 추가하여 계속 반복합니다. 테스트의 완료된 버전 및 라이브러리의 완전한 구현을 얻게 됩니다.
작은 라이브러리 및 이 라이브러리에 대한 단위 테스트 집합을 작성했습니다. 새 패키지 및 테스트 추가가 정상 워크플로에 포함되도록 솔루션을 구조화했습니다. 애플리케이션의 목표를 해결하는 데 대부분의 시간과 노력을 들였습니다.
참고 항목
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기