.NET 10에서 Dotnet Test로 테스트 실행하는 방법

Ashley Goolam

Ashley Goolam

27 August 2025

.NET 10에서 Dotnet Test로 테스트 실행하는 방법

안녕하세요, .NET 개발자 여러분! **Microsoft Testing Platform (MTP)**과 **.NET 10**으로 테스트 게임을 한 단계 업그레이드할 준비가 되셨나요? 기존 VSTest 러너와 함께 dotnet test를 사용해 오셨다면, **MTP**가 테스트를 더 부드럽고, 빠르고, 유연하게 만들어 줄 것입니다. 이 대화형 가이드에서는 **MTP**, 즉 **MicrosoftTestingPlatform**이 무엇인지, 왜 VSTest보다 한 단계 발전했는지, 그리고 **.NET 10**에서 dotnet test와 함께 이를 활용하여 프로젝트를 위한 견고한 테스트를 구축하는 방법을 살펴보겠습니다. 기본 MSTest 프로젝트부터 독립 실행형 실행 파일이 포함된 다중 프로젝트 솔루션에 이르기까지, 제가 이 설정을 실험하기 위해 거쳤던 단계를 안내해 드릴 것입니다. **MTP, MicrosoftTestingPlatform, .NET 10, dotnet test**의 세계로 뛰어들어 테스트를 더 쉽고 즐겁게 만들어 봅시다!

💡
아름다운 API 문서를 생성하는 훌륭한 API 테스트 도구를 원하십니까?

개발팀이 최대의 생산성으로 함께 작업할 수 있는 통합된 올인원 플랫폼을 원하십니까?

Apidog는 귀하의 모든 요구 사항을 충족하며, Postman을 훨씬 더 저렴한 가격으로 대체합니다!
버튼

.NET 개발에서 테스트가 왜 중요한가요?

본격적으로 시작하기 전에, 테스트가 왜 중요한지 이야기해 봅시다. 작은 앱을 만들든 거대한 엔터프라이즈 시스템을 구축하든, 테스트는 코드가 예상대로 작동하는지 확인하고, 버그를 조기에 발견하며, 밤샘 디버깅 세션에서 여러분을 구해줍니다. **MSTest**와 **MTP**로 만들 자동화된 단위 테스트는 기능을 검증하고, 코드 품질을 향상시키며, 리팩토링을 쉽게 만듭니다. **.NET 10**의 성능 향상과 **MTP**의 현대적인 테스트 프레임워크를 통해 빠르고 안정적이며 CI/CD 파이프라인에 쉽게 통합할 수 있는 테스트를 작성할 수 있습니다. 어떻게 하는지 볼 준비가 되셨나요? 제 여정을 따라가 봅시다!

Microsoft Testing Platform (MTP)이란 무엇인가요?

**Microsoft Testing Platform (MTP)**, 또는 **MicrosoftTestingPlatform**은 노후화된 VSTest 러너를 대체하기 위해 도입된 Microsoft의 차세대 테스트 프레임워크입니다. 복잡한 어댑터와 DLL 기반 실행에 의존하는 VSTest와 달리, **MTP**는 .NET에서 테스트를 실행하기 위한 간소화된 네이티브 경험을 제공합니다. **.NET 10**에 내장되어 있어 독립 실행형 실행 파일 테스트 러너 및 dotnet test와의 더 나은 통합과 같은 기능을 통해 더 빠르고 유연합니다. **MTP**는 MSTest, NUnit, xUnit을 지원하며, CI/CD 및 크로스 플랫폼 개발을 포함한 현대적인 워크플로우를 위해 설계되었습니다. **.NET 10**의 성능 향상에 최적화된 VSTest의 더 멋지고 효율적인 형제라고 생각할 수 있습니다.

1단계: MTP를 사용하여 기본 MSTest 프로젝트 설정하기

**MTP**가 작동하는 모습을 보기 위해 간단한 MSTest 프로젝트를 생성하는 것으로 시작해 봅시다. 제가 시작했던 방법은 다음과 같습니다:

**프로젝트 생성**:

dotnet new mstest -n MyMtpTests

**프로젝트 파일 확인**:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
    <IsTestProject>true</IsTestProject>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
    <PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
    <PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
  </ItemGroup>
</Project>

**테스트 실행**:

cd MyMtpTests
dotnet test
vstest runner

**무슨 일인가요?** 이것은 VSTest를 사용하는 전통적인 설정이지만, **MTP**로 업그레이드하기 전의 견고한 기준점입니다. 프로젝트는 DLL로 테스트를 실행하는데, 이는 괜찮지만 **MTP**의 실행 파일 접근 방식만큼 유연하지는 않습니다.

2단계: MTP 실행 파일 기반 테스트 러너로 발전시키기

이제 dotnet test 없이도 테스트를 실행할 수 있는 **MTP**의 독립 실행형 실행 파일 러너로 전환하여 더 흥미롭게 만들어 봅시다. 제가 했던 방법은 다음과 같습니다:

**프로젝트 파일 업데이트**:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
    <IsTestProject>true</IsTestProject>
    <!-- Enable MTP runner and executable output -->
    <EnableMSTestRunner>true</EnableMSTestRunner>
    <TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
    <OutputType>Exe</OutputType>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
    <PackageReference Include="MSTest.TestFramework" Version="3.10.2" />
    <PackageReference Include="MSTest.TestAdapter" Version="3.10.2" />
  </ItemGroup>
  <ItemGroup>
    <Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
  </ItemGroup>
</Project>

**주요 변경 사항:**

**프로젝트 빌드**:

dotnet build
exe file generated

**실행 파일 실행**:

cd bin/Debug/net8.0
run test on .exe file

**이것이 최고인 이유**: 실행 파일 접근 방식은 사용자 지정 CI/CD 설정이나 .NET SDK가 설치되지 않은 환경에 완벽합니다. 유연성을 위한 혁신적인 변화이며, **MTP**는 오버헤드를 줄여 VSTest보다 빠르게 만듭니다.

3단계: .NET 10 및 다중 프로젝트 테스트로 전문가 되기

실제 시나리오에서 **MTP**와 **.NET 10**이 빛을 발하는 것을 보기 위해, 클래스 라이브러리와 테스트를 포함하는 다중 프로젝트 솔루션을 구축해 봅시다. 제가 설정한 방법은 다음과 같습니다:

**최종 프로젝트 구조**:

MyMtpSolution/
│
├── MyLibrary/
│   ├── Calculator.cs
│   └── MyLibrary.csproj
│
├── MyLibrary.Tests/
│   ├── CalculatorTests.cs
│   └── MyLibrary.Tests.csproj
│
├── MyMtpSolution.sln
└── dotnet.config

1. 솔루션 생성:

dotnet new sln -n MyMtpSolution

2. 클래스 라이브러리 생성:

dotnet new classlib -n MyLibrary
namespace MyLibrary
{
    public class Calculator
    {
        public int Add(int a, int b) => a + b;
        public int Subtract(int a, int b) => a - b;
        public int Multiply(int a, int b) => a * b;
        public int Divide(int a, int b) => 
            b == 0 ? throw new ArgumentException("Cannot divide by zero.") : a / b;
    }
}

3. 테스트 프로젝트 생성:

dotnet new mstest -n MyLibrary.Tests
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MyLibrary;

namespace MyLibrary.Tests
{
    [TestClass]
    public class CalculatorTests
    {
        private Calculator _calculator;

        [TestInitialize]
        public void Setup()
        {
            _calculator = new Calculator();
        }

        [TestMethod]
        public void Add_ReturnsCorrectSum()
        {
            Assert.AreEqual(5, _calculator.Add(2, 3));
        }

        [TestMethod]
        public void Subtract_ReturnsCorrectDifference()
        {
            Assert.AreEqual(1, _calculator.Subtract(3, 2));
        }

        [TestMethod]
        public void Multiply_ReturnsCorrectProduct()
        {
            Assert.AreEqual(6, _calculator.Multiply(2, 3));
        }

        [TestMethod]
        public void Divide_ReturnsCorrectQuotient()
        {
            Assert.AreEqual(2, _calculator.Divide(6, 3));
        }

        [TestMethod]
        [ExpectedException(typeof(ArgumentException))]
        public void Divide_ByZero_ThrowsException()
        {
            _calculator.Divide(6, 0);
        }
    }
}

4. 프로젝트 참조 추가:

dotnet add MyLibrary.Tests reference MyLibrary

5. 솔루션에 프로젝트 추가:

dotnet sln MyMtpSolution.sln add MyLibrary/MyLibrary.csproj
dotnet sln MyMtpSolution.sln add MyLibrary.Tests/MyLibrary.Tests.csproj

6. MTP 구성:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
    <IsTestProject>true</IsTestProject>
    <EnableMSTestRunner>true</EnableMSTestRunner>
    <TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
    <PackageReference Include="MSTest.TestFramework" Version="3.10.2" />
    <PackageReference Include="MSTest.TestAdapter" Version="3.10.2" />
  </ItemGroup>
  <ItemGroup>
    <Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
  </ItemGroup>
</Project>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

7. .NET 10으로 업그레이드:

download .net10
<TargetFramework>net10.0</TargetFramework>

8. dotnet.config 파일 생성:

[dotnet.test.runner]
name = "Microsoft.Testing.Platform"

9. 테스트 빌드 및 실행:

dotnet test
running the tests

**이것이 놀라운 이유**: **.NET 10**은 성능 향상(더 빠른 JIT, 더 나은 메모리 관리)을 가져오고, **MTP**의 네이티브 통합은 VSTest의 레거시 브릿지를 제거하여 테스트를 더 빠르고 안정적으로 만듭니다. 다중 프로젝트 설정은 라이브러리와 별도의 테스트 프로젝트를 사용하여 실제 앱을 모방합니다.

.NET 10과 MTP가 테스트를 개선하는 방법

**MTP**와 **.NET 10**은 테스트를 다음 단계로 끌어올립니다:

사용자들은 **MTP**에 대해 열광하고 있습니다: "마치 VSTest 같지만, 불필요한 부분이 없고 더 빠르고 깔끔해요!" **.NET 10**으로 최첨단 성능을 얻을 수 있으며, **MTP**는 dotnet test를 즐겁게 만듭니다.

문제 해결 팁

결론

이제 **MTP (MicrosoftTestingPlatform), .NET 10, dotnet test**를 사용하여 현대적인 테스트 설정을 구축하는 전문가가 되셨습니다! 기본 MSTest 프로젝트부터 독립 실행형 실행 파일이 포함된 다중 프로젝트 솔루션에 이르기까지, **MTP**가 VSTest를 어떻게 능가하는지, 그리고 **.NET 10**이 성능을 어떻게 향상시키는지 확인했습니다. 더 많은 테스트를 추가하거나, CI/CD 파이프라인에 통합하거나, 병렬 실행과 같은 **MTP**의 고급 기능을 탐색해 보세요. 멋진 테스트 설정이 있으신가요? 공유해 주세요—테스트의 활기를 계속 이어갑시다!

버튼

Apidog에서 API 설계-첫 번째 연습

API를 더 쉽게 구축하고 사용하는 방법을 발견하세요