MSTest SDK 구성

이 문서에서는 MSTest.Sdk에 대한 고급 구성 옵션을 설명합니다. 기본 설정 및 시작하기에 대해서는 MSTest 시작하기를 참조하세요.

중요함

기본적으로 MSTest.Sdk는 dotnet 테스트를 포함하여 MTP와 함께 MSTest Runner를 사용합니다. 이를 위해서는 CI 및 로컬 CLI 호출을 수정해야 하며 . runsettings의 사용 가능한 항목에도 영향을 줍니다. VSTest로 전환하여 이전 통합 및 도구를 유지할 수 있습니다.

MSTest.Sdk는 기본적으로 true로 설정합니다 EnableMSTestRunnerTestingPlatformDotnetTestSupport . dotnet 테스트 및 다양한 모드에 대한 자세한 내용은 dotnet 테스트를 사용하여 테스트를 참조하세요.

유틸리티 도우미 라이브러리 테스트

프로젝트가 MSTest.Sdk를 사용하여 테스트 유틸리티 도우미 라이브러리가 될 의도이며, 그 자체로 실행 가능한 테스트를 포함하지 않는 경우 프로젝트에는 <IsTestApplication>false</IsTestApplication> 있어야 합니다.

주자 선택

기본적으로 MSTest SDK는 MTP를 사용하지만 속성을 추가하여 <UseVSTest>true</UseVSTest>로 전환할 수 있습니다.

MTP 확장

NuGet 패키지 확장 집합을 통해 MTP 환경을 사용자 지정할 수 있습니다. 이 환경을 간소화하고 개선하기 위해 MSTest SDK에 다음 두 기능이 도입되었습니다.

Microsoft. Testing.Platform 프로필

profiles 개념을 사용하면 테스트 project 적용할 기본 구성 및 확장 집합을 선택할 수 있습니다.

다음 세 가지 프로필 중 하나와 함께 TestingExtensionsProfile 속성을 사용하여 프로필을 설정할 수 있습니다.

  • None - 사용하도록 설정된 확장이 없습니다.

  • Default - 이 버전의 MSTest.SDK에 권장되는 확장을 사용하도록 설정합니다. 속성이 명시적으로 설정되지 않은 경우 이는 기본값입니다.

    다음 확장을 사용하도록 설정합니다.

  • AllMicrosoft- 제한적인 라이선스가 있는 확장을 포함하여 광범위한 기본 사용을 위해 선택한 Microsoft 확장을 사용하도록 설정합니다. 실험적 및 API 전용 확장에는 명시적 옵트인이 여전히 필요할 수 있습니다.

    Default 프로필의 모든 확장 기능과 다음 확장 기능도 사용하도록 설정합니다.

    MSTest.Sdk 버전 3.11.0~ 4.2.x에서 Azure DevOps 보고서 확장은 에AllMicrosoft만 포함됩니다.

참고

프로필은 Azure DevOps 보고서 및 GitHub Actions 보고서 패키지를 참조하지만, 보고는 런타임에 비활성화된 상태로 유지됩니다. Azure DevOps 보고를 사용하도록 설정하려면 --report-azdo를 전달합니다. GitHub Actions 보고를 사용하도록 설정하려면 GitHub Actions에서 테스트를 실행하고 --report-gh를 전달하세요.

다음은 None 프로필을 사용한 전체 예입니다.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <TestingExtensionsProfile>None</TestingExtensionsProfile>
    </PropertyGroup>

</Project>
확장/프로필 없음 기본값 AllMicrosoft
코드 커버리지 ✔️ ✔️
충돌 덤프 ✔️
가짜 ✔️¹
정지 덤프 ✔️
핫 다시 로드 ✔️
HTML 보고서 ✔️
GitHub Actions 보고서 ✔️³ ✔️³
다시 시도 ✔️
Trx ✔️ ✔️
Azure DevOps 보고서 ✔️³ ✔️²

¹ MSTest.Sdk 3.7.0+ ² MSTest.Sdk 3.11.0+ ³ MSTest.Sdk 4.3.0+

확장 사용 또는 사용 안 함

확장은 Enable[NugetPackageNameWithoutDots] 패턴을 사용하여 MSBuild 속성으로 사용 및 사용하지 않도록 설정할 수 있습니다.

예를 들어 크래시 덤프 확장(NuGet 패키지 Microsoft.Testing.Extensions.CrashDump)을 활성화하려면 다음 속성을 EnableMicrosoftTestingExtensionsCrashDumptrue으로 설정할 수 있습니다.

<Project Sdk="MSTest.Sdk/4.1.0">

<PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <EnableMicrosoftTestingExtensionsCrashDump>true</EnableMicrosoftTestingExtensionsCrashDump>
</PropertyGroup>

</Project>

사용 가능한 모든 확장 목록은 MTP 기능을 참조하세요.

일부 MTP 확장은 선택 사항으로 유지되며 AllMicrosoft 또는 Default 프로필에는 포함되지 않습니다:

  • MSTest.Sdk 4.3부터는 <EnableMicrosoftTestingExtensionsJUnitReport>true</EnableMicrosoftTestingExtensionsJUnitReport>를 설정한 다음 --report-junit를 전달합니다.
  • MSTest.Sdk 4.4 프리뷰부터는 <EnableMicrosoftTestingExtensionsCtrfReport>true</EnableMicrosoftTestingExtensionsCtrfReport>을 설정한 다음 --report-ctrf을 전달합니다.
  • OpenTelemetry 확장을 참조하려면 <EnableMicrosoftTestingExtensionsOpenTelemetry>true</EnableMicrosoftTestingExtensionsOpenTelemetry>로 설정하세요. 확장에는 API 구성이 필요하므로 OpenTelemetry에 설명된 대로 사용자 지정 진입점에 등록합니다.

이러한 확장은 MTP에서만 사용할 수 있습니다.

경고

각 확장별로 라이선스 조건이 다를 수 있으므로 검토하는 것이 중요합니다.

사용 및 사용하지 않도록 설정된 확장은 선택한 확장 프로필에서 제공하는 확장과 결합됩니다.

이 속성 패턴은 암시적 Default 프로필 위에 추가 확장을 사용하도록 설정하는 데 사용할 수 있습니다(이전 CrashDumpExtension 예제에서 볼 수 있음).

선택한 프로필에서 오는 확장을 사용하지 않도록 설정할 수도 있습니다. 예를 들어, MS Code Coverage를 설정하여 <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>확장을 사용하지 않도록 설정합니다.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
    </PropertyGroup>

</Project>

MSTest.Sdk 4.3.0 이상에서는 Default 프로필이 Azure DevOps Report 및 GitHub Actions Report 패키지를 참조합니다. 두 패키지 참조 중 하나를 제거하려면 <EnableMicrosoftTestingExtensionsAzureDevOpsReport>false</EnableMicrosoftTestingExtensionsAzureDevOpsReport> 또는 <EnableMicrosoftTestingExtensionsGitHubActionsReport>false</EnableMicrosoftTestingExtensionsGitHubActionsReport>로 설정하세요. 패키지 참조를 유지하면 Azure DevOps 보고는 --report-azdo를 전달할 때만 시작됩니다. GitHub Actions 보고는 GitHub Actions에서 테스트를 실행하고 --report-gh를 전달할 때만 시작됩니다.

기능

실행기 및 실행기별 확장 선택 외에도 MSTest.Sdk는 테스트 경험을 단순화하고 향상시키는 추가 기능도 제공합니다.

Aspire을 사용한 테스트

Aspire는 명확한 견해가 있는 클라우드 준비 스택으로, 관찰 가능하고 프로덕션 준비가 된 분산 애플리케이션을 구축하기 위한 것입니다. Aspire 는 특정 클라우드 네이티브 문제를 처리하는 NuGet 패키지 컬렉션을 통해 제공됩니다. 자세한 내용은 문서를 참조 Aspire 하세요.

참고

이 기능은 MSTest.Sdk 3.4.0에서 사용할 수 있습니다.

속성 EnableAspireTestingtrue로 설정하면 usingAspire를 사용하여 테스트하는 데 필요한 모든 종속성 및 기본 MSTest 지시문을 가져올 수 있습니다.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableAspireTesting>true</EnableAspireTesting>
    </PropertyGroup>

</Project>

Playwright를 사용하여 테스트

Playwright를 사용하면 최신 web apps 신뢰할 수 있는 엔드 투 엔드 테스트를 수행할 수 있습니다. 자세한 내용은 공식 Playwright 문서를 참조하세요.

참고

이 기능은 MSTest.Sdk 3.4.0에서 사용할 수 있습니다.

속성 EnablePlaywrighttrue로 설정하면, usingPlaywright를 사용하여 테스트하는 데 필요한 모든 종속성 및 기본 MSTest 지시문을 가져올 수 있습니다.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnablePlaywright>true</EnablePlaywright>
    </PropertyGroup>

</Project>

MSTest SDK로 마이그레이션

MSTest SDK로 마이그레이션하는 데 필요한 다음 단계를 고려합니다.

프로젝트를 업데이트하세요.

기존 MSTest 테스트 프로젝트를 MSTest SDK로 마이그레이션할 때, 먼저 테스트 프로젝트의 맨 위에 있는 Sdk="Microsoft.NET.Sdk" 항목을 Sdk="MSTest.Sdk"으로 교체하여 시작하십시오.

- Sdk="Microsoft.NET.Sdk"
+ Sdk="MSTest.Sdk"

global.json에 해당 버전을 추가합니다.

{
    "msbuild-sdks": {
        "MSTest.Sdk": "4.1.0"
    }
}

그런 다음 project 단순화할 수 있습니다.

기본 속성을 제거합니다.

- <EnableMSTestRunner>true</EnableMSTestRunner>
- <OutputType>Exe</OutputType>
- <IsPackable>false</IsPackable>
- <IsTestProject>true</IsTestProject>

기본 패키지 참조 제거

- <PackageReference Include="MSTest"
- <PackageReference Include="MSTest.TestFramework"
- <PackageReference Include="MSTest.TestAdapter"
- <PackageReference Include="MSTest.Analyzers"
- <PackageReference Include="Microsoft.NET.Test.Sdk"

마지막으로 사용 중인 확장 프로필에 따라 일부 Microsoft.Testing.Extensions.* 패키지를 제거할 수도 있습니다.

CI를 업데이트하세요

프로젝트를 업데이트한 후 MTP(기본값)를 사용하고 테스트를 실행하는 경우 dotnet test CI 구성을 업데이트해야 합니다. 자세한 내용과 필요한 모든 변경 내용을 이해하려면 dotnet 테스트 통합을 참조하세요.

dotnet test VSTest 모드를 사용하는 경우 Azure DevOps DotNetCoreCLI 작업을 사용할 때의 업데이트 예제는 다음과 같습니다.

기본 MSTest.Sdk 확장 프로필은 추가된 옵션에 필요한 Microsoft.Testing.Extensions.TrxReportMicrosoft.Testing.Extensions.CodeCoverage 패키지를 제공합니다. None 프로필을 선택하는 경우 옵션을 사용하기 전에 두 확장을 모두 활성화하거나 참조해야 합니다.

\- task: DotNetCoreCLI@2
  inputs:
    command: 'test'
    projects: '**/**.sln'
-    arguments: '--configuration Release'
+    arguments: '--configuration Release -- --report-trx --results-directory $(Agent.TempDirectory) --coverage'

리플렉션 원본 생성기

중요함

다음 MSTest 4.4 동작은 MSTest 4.4.0이 릴리스될 때까지 미리 보기 빌드에서만 사용할 수 있습니다.

MSTest 4.3은 독립적으로 버전이 지정된 실험적 MSTest.SourceGeneration 패키지에 리플렉션 원본 생성기를 도입했습니다. MSTest 4.4부터 패키지는 실험적 상태를 졸업하고 MSTest 버전을 사용합니다.

네이티브 AOT 프로젝트에는 원본 생성기가 자동으로 포함됩니다. MSTest.Sdk를 사용하는 NativeAOT가 아닌 프로젝트의 경우 <EnableMSTestSourceGeneration>true</EnableMSTestSourceGeneration>를 사용하도록 설정합니다. MSTest.Sdk는 MSTestVersion를 통해 MSTest.SourceGeneration, MSTest.TestFramework, MSTest.TestAdapter의 버전을 일치시킵니다.

또한 SDK는 중앙 패키지 관리를 사용하는 재사용 가능한 테스트 라이브러리 및 프로젝트에서 원본 생성을 지원합니다. 일치하는 MSTest.TestAdapter 런타임 후크를 제공하고 필요한 PackageVersion 항목을 생성합니다.

.NET Standard는 이러한 런타임 후크를 지원하지 않습니다. .NET Standard 대상에 원본 생성을 사용하도록 설정하면 SDK에서 다음 오류를 보고합니다.

필요한 MSTest.TestAdapter 런타임 후크를 사용할 수 없으므로 .NET 표준 대상 프레임워크에서는 MSTest 원본 생성이 지원되지 않습니다.

원본 생성기는 컴파일 시간에 테스트를 검색합니다. 생성기가 활성화된 경우 테스트 클래스는 생성기를 상속하는 대신 직접 선언 [TestClass] 해야 합니다. MSTEST0069 분석기는 상속된 [TestClass]클래스에 플래그를 지정합니다.

MSTest 4.3.2부터 트리밍된 프로젝트 및 Native AOT 프로젝트에서는 MSTestSourceGenMode가 기본적으로 ReflectionFree로 설정됩니다. 이 모드는 생성된 메타데이터 및 테스트 셰이프를 지원하는 호출자를 사용합니다. 리플렉션을 지원하는 런타임에서 MSTest는 지원되지 않거나 누락된 생성된 항목에 대한 리플렉션으로 대체됩니다.

MSTest 4.4부터 리플렉션 없는 생성은 AttributeUsageAllowMultiple를 포함한 상속된 특성 메타데이터 전체를 생성합니다. MTP에서는 런타임 검색 및 일반 동기 [TestMethod][DataRow] 메서드에 대한 유효성 검사를 바이패스할 수 있습니다. 비동기 테스트, 사용자 지정 테스트 메서드 특성, DynamicData사용자 지정 ITestDataSource 구현 및 모호한 테스트 셰이프는 대체 경로를 사용합니다. VSTest는 기존 경로도 유지합니다.

리플렉션 없는 모드는 다음 진단을 보고합니다.

ID 지원되지 않는 테스트 셰이프
AOTSG0001 정적 테스트 클래스
AOTSG0002 제네릭 형식에 중첩된 클래스를 포함하여 제네릭 테스트 클래스 열기
AOTSG0003 생성된 코드가 액세스할 수 없는 클래스(파일 로컬 클래스 또는 private 또는 private-protected 중첩 클래스 포함)
AOTSG0004 제네릭 테스트 방법
AOTSG0005 in, out 또는 ref 매개 변수가 있는 테스트 메서드

실험적 기능

다음 MSTest 4.3 기능은 실험적입니다. 공용 API는 변경될 수 있으며 실험적 진단 뒤에 표시됩니다. 옵트인하려면 해당 진단 ID를 승인합니다.

ITestFilter를 사용한 프로그래밍 방식 테스트 필터링

참고

MSTest 4.3.0(실험적)에 도입되었습니다.

ITestFilter를 통해 등록되는 실험적 [TestFilterProviderAttribute] 확장 지점을 사용하면 테스트 클래스가 로드되기 전에 각 테스트를 실행할지 여부를 프로그래밍 방식으로 결정할 수 있습니다. 명령줄 필터로 표현할 수 없는 사용자 지정 선택 논리에 유용합니다.

테스트 클래스를 로드하지 않고 메타데이터를 검사하도록 구현 ITestFilter.Filter(TestFilterContext) 합니다.

public sealed class MyFilter : ITestFilter
{
    public TestFilterResult Filter(TestFilterContext context) =>
        context.DisplayName.Contains("Nightly", StringComparison.Ordinal)
            ? TestFilterResult.Run : TestFilterResult.Drop;
}

돌아가서 테스트를 실행하려면 TestFilterResult.Run, 결과 없이 생략하려면 Drop, 또는 건너뜀 결과를 보고하려면 Skip(reason)를 선택하세요. MSTest는 하나의 필터 인스턴스를 동시에 호출할 수 있으므로 구현은 스레드로부터 안전해야 합니다. 명령줄 및 테스트 탐색기 필터는 이전에 ITestFilter실행되며 [Ignore] 나중에 평가됩니다.

MSTest 4.4부터 .NET 프로젝트는 형식이 안전한 제네릭 등록 양식을 [assembly: TestFilterProvider<MyFilter>]사용할 수 있습니다. 그런 다음 컴파일러는 MyFilter이(가) ITestFilter을(를) 구현하고 public이며 매개 변수가 없는 생성자를 가져야 함을 강제합니다. 제네릭 특성은 .NET Framework에 사용할 수 없습니다. 다중 대상 프로젝트의 경우 대상 프레임워크 전처리기 기호가 있는 제네릭 또는 제네릭이 아닌 양식을 선택합니다.

#if NET
[assembly: TestFilterProvider<MyFilter>]
#else
[assembly: TestFilterProvider(typeof(MyFilter))]
#endif

MSTest 4.4부터 MSTEST0081 분석기는 제네릭이 아닌 등록 양식의 유효성을 완전히 검사합니다. 제네릭 양식의 경우 둘 이상의 공급자를 등록하는 제네릭 필터 형식 및 어셈블리를 보고합니다.

TestRun.Current 및 계획된 테스트

참고

MSTest 4.3.0(실험적)에 도입되었습니다.

RFC 014의 실험적 TestRun.Current API는 계획된 테스트 집합을 포함하여 현재 실행에 대한 정보를 노출하므로 확장 및 비품은 실행하도록 예약된 항목을 검사할 수 있습니다.

알려진 제한 사항

NuGet에서 제공하는 MSBuild SDK(MSTest.Sdk 포함)에는 버전 업데이트와 관련하여 임시 도구 지원이 있습니다. 즉, NuGet 패키지를 관리하기 위한 일반적인 NuGet 업데이트 및 Visual Studio UI가 예상대로 작동하지 않습니다. global.json 파일 및 project 파일에서 버전을 수동으로 업데이트해야 합니다. (dependabot-core#12824dependabot-core#8615 문제로 인해 Dependabot을 사용하는 경우에도 적용됩니다.

참고 자료