다음을 통해 공유


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="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

첫 번째 테스트 만들기

실패한 테스트를 작성하고 통과한 다음 프로세스를 반복합니다. PrimeService.Tests 디렉터리에서 UnitTest1.cs 제거하고 다음 콘텐츠가 포함된 PrimeService_IsPrimeShould.cs 새 C# 파일을 만듭니다.

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 shouldn't 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 특성 사용하여 해당 입력에 대한 값을 지정할 수 있습니다.

새 테스트를 만드는 대신 이러한 두 특성을 적용하여 단일 데이터 기반 테스트를 만듭니다. 데이터 기반 테스트는 가장 낮은 소수인 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실행하면 이러한 테스트 중 두 가지가 실패합니다. 모든 테스트를 통과하려면 if 파일에서 IsPrime 메서드의 시작 부분에 있는 절을 변경합니다.

if (candidate < 2)

주 라이브러리에 더 많은 테스트, 더 많은 이론 및 더 많은 코드를 추가하여 계속 반복합니다. 테스트 완료된 버전과 라이브러리 완전한 구현이 있습니다.

작은 라이브러리와 해당 라이브러리에 대한 단위 테스트 집합을 빌드했습니다. 새 패키지 및 테스트를 추가하는 것이 일반 워크플로의 일부가 되도록 솔루션을 구성했습니다. 대부분의 시간과 노력을 집중하여 애플리케이션의 목표를 해결했습니다.

참고하십시오