Microsoft Fakes를 사용하여 테스트 대상 코드 격리

코드 격리는 테스트 중인 코드를 애플리케이션의 나머지 부분과 분리하는 Microsoft Fakes와 같은 도구를 사용하여 종종 구현되는 테스트 전략입니다. 이러한 분리는 테스트 중인 코드와 상호 작용하는 애플리케이션의 일부를 스텁 또는 심으로 대체함으로써 이루어집니다. 이는 테스트에서 제어하는 작은 코드 조각으로, 대체하는 실제 부품의 동작을 시뮬레이션합니다.

이 접근 방식의 장점은 코드의 특정 기능을 개별적으로 테스트하는 데 집중할 수 있다는 것입니다. 테스트가 실패하면 원인이 다른 곳이 아닌 격리된 코드 내에 있음을 알 수 있습니다. 또한 Microsoft Fakes에서 제공하는 스텁과 심을 사용하면 애플리케이션의 다른 부분이 아직 작동하지 않더라도 코드를 테스트할 수 있습니다.

요구 사항

  • Visual Studio Enterprise
  • .NET Framework 프로젝트
  • Visual Studio 2019 업데이트 6에서 미리 보기로 제공한 .NET Core, .NET 5.0 이상 및 SDK 스타일 프로젝트 지원은 업데이트 8에서 기본적으로 사용하도록 설정되어 있습니다. 자세한 내용은 .NET Core 및 SDK 스타일 프로젝트용 Microsoft Fakes를 참조하세요.

참고 항목

Visual Studio를 이용한 프로파일링은 Microsoft Fakes를 사용하는 테스트에는 사용할 수 없습니다.

코드 격리에서 Microsoft Fakes의 역할

Microsoft Fakes는 스텁과 심이라는 두 가지 메커니즘을 제공함으로써 코드 격리에서 핵심적인 역할을 합니다.

  • 스텁: 클래스를 동일한 인터페이스를 구현하는 작은 대체물로 대체하는 데 사용됩니다. 이를 위해서는 각 컴포넌트가 다른 컴포넌트가 아닌 인터페이스에만 의존하도록 애플리케이션을 설계해야 합니다.

  • : 런타임에 애플리케이션의 컴파일된 코드를 수정하는 데 사용됩니다. 애플리케이션은 지정된 메서드를 호출하는 대신 테스트에서 제공하는 심 코드를 실행합니다. 심은 .NET 어셈블리와 같이 수정할 수 없는 어셈블리에 대한 호출을 대체할 수 있습니다.

일반적으로 스텁은 Visual Studio 솔루션 내 호출에 사용되고, 심은 다른 참조 어셈블리에 대한 호출에 사용됩니다. 이는 솔루션 내에서 스텁에 필요한 방식으로 인터페이스를 정의하여 컴포넌트를 분리하는 것이 좋은 방법이기 때문입니다. 그러나 외부 어셈블리에는 별도의 인터페이스 정의가 없는 경우가 많으므로 대신 쉼을 사용합니다.

Diagram that show Fakes replacing other components.

스텁 사용 시점에 대한 권장 사항

스텁은 일반적으로 Visual Studio 솔루션 내의 호출에 사용되며, 스텁에 필요한 방식으로 인터페이스를 정의하여 컴포넌트를 분리하는 것이 좋은 방법이기 때문입니다. 스텁을 사용하려면 서로 다른 구성 요소가 서로 종속되지 않고 인터페이스 정의에만 종속되도록 애플리케이션을 설계해야 합니다.러나 System.dll과 같은 외부 어셈블리에는 일반적으로 별도의 인터페이스 정의가 제공되지 않으므로 이러한 경우 대신 심이 사용됩니다.

스텁을 사용하려면 서로 다른 구성 요소가 서로 종속되지 않고 인터페이스 정의에만 종속되도록 애플리케이션을 설계해야 합니다. 이러한 디커플링은 애플리케이션을 더욱 견고하고 유연하게 만들고 테스트 중인 구성 요소를 테스트 목적으로 인터페이스의 스텁 구현에 연결할 수 있게 해줍니다.

실제로는 Visual Studio의 인터페이스 정의에서 스텁 유형을 생성한 다음 실제 컴포넌트를 테스트의 스텁으로 대체할 수 있습니다.

스텁은 Visual Studio 솔루션 내 호출에 사용되는 반면, 심은 일반적으로 다른 참조 어셈블리에 대한 호출에 사용됩니다. 사용 시점에 대한 권장 사항

스텁은 Visual Studio 솔루션 내 호출에 사용되는 반면, 심은 일반적으로 다른 참조 어셈블리에 대한 호출에 사용됩니다. 이는 System.dll과 같은 외부 어셈블리에는 일반적으로 별도의 인터페이스 정의가 제공되지 않으므로 심을 대신 사용해야 하기 때문입니다.

그러나 쉼을 사용할 때 고려해야 할 몇 가지 요소가 있습니다:

성능: 심은 런타임에 코드를 다시 작성하기 때문에 실행 속도가 느려집니다. 스텁은 이러한 성능 오버헤드가 없으며 가상 메서드가 실행할 수 있는 만큼 빠릅니다.

정적 메서드, 봉인된 유형: 인터페이스를 구현하는 데에만 스텁을 사용할 수 있습니다. 따라서 정적 메서드, 비가상 메서드, 봉인된 가상 메서드, 봉인된 타입의 메서드 등에는 스텁 타입을 사용할 수 없습니다.

내부 타입: 스텁과 심 모두 어셈블리 속성 InternalsVisibleToAttribute을 사용하여 접근 가능한 내부 타입과 함께 사용할 수 있습니다.

비공개 메서드: 메서드 서명의 모든 타입이 표시되는 경우 쉼은 비공개 메서드에 대한 호출을 대체할 수 있습니다. 스텁은 표시된 메서드만 대체할 수 있습니다.

인터페이스 및 추상 메서드: 스텁은 테스트에 사용할 수 있는 인터페이스 및 추상 메서드의 구현을 제공합니다. shim에는 메서드 본문이 없기 때문에 인터페이스 및 추상 메서드를 계측할 수 없습니다.


Microsoft Fakes를 사용하는 .NET Framework 테스트 프로젝트를 SDK 스타일의 .NET Framework, .NET Core 또는 .NET 5+ 프로젝트로 전환하기.NET Framework의 Microsoft 페이크에서 SDK 스타일 프로젝트로 전환하기

Microsoft Fakes를 사용하는 .NET Framework 테스트 프로젝트를 SDK 스타일의 .NET Framework, .NET Core 또는 .NET 5+ 프로젝트로 전환하기.

Microsoft Fakes에 대해 설정된 .NET Framework를 .NET Core 또는 .NET 5.0으로 전환하려면 최소한의 변경만 필요합니다. 고려해야 할 사례는 다음과 같습니다.

  • 사용자 지정 프로젝트 템플릿을 사용하는 경우 해당 템플릿이 SDK 스타일이고 호환되는 대상 프레임워크에 대한 빌드인지 확인해야 합니다.

  • 일부 형식은 .NET Framework 및 .NET Core/.NET 5.0에서 서로 다른 어셈블리에 있습니다. 예를 들어 System.DateTime은 .NET Framework에서는 System/mscorlib에 있고 .NET Core 및 .NET 5.0에서는 System.Runtime에 있습니다. 이러한 시나리오에서는 모조되는 어셈블리를 변경해야 합니다.

  • Fakes 어셈블리 및 테스트 프로젝트에 대한 어셈블리 참조가 있는 경우 다음과 같은 누락된 참조에 대한 빌드 경고가 표시될 수 있습니다.

    (ResolveAssemblyReferences target) ->
    warning MSB3245: Could not resolve this reference. Could not locate the assembly "AssemblyName.Fakes". Check to make sure the assembly exists on disk.
    If this reference is required by your code, you may get compilation errors.
    

    이 경고는 Fakes 생성에서 수행해야 하는 변경 때문에 발생하며 무시할 수 있습니다. 이제 빌드 중에 어셈블리 참조를 암시적으로 추가하기 때문에 프로젝트 파일에서 어셈블리 참조를 제거하여 이 경고를 방지할 수 있습니다.

Microsoft Fakes 테스트 실행

Microsoft Fakes 어셈블리가 구성된 FakesAssemblies 디렉터리(기본값 $(ProjectDir)FakesAssemblies)에 있는 한, vstest 작업을 사용하여 테스트를 실행할 수 있습니다.

Microsoft Fakes를 사용하는 vstest task .NET Core 및 .NET 5+ 프로젝트를 사용한 분산 테스트에는 Visual Studio 2019 업데이트 9 프리뷰20201020-06 이상이 필요합니다.

다양한 .NET 및 Visual Studio 버전에서 Microsoft Fakes의 호환성 및 지원

.NET Framework를 대상으로 하는 이전 프로젝트의 Microsoft Fakes(비 SDK 스타일).

  • Microsoft Fakes 어셈블리 생성은 Visual Studio Enterprise 2015 이상에서 지원됩니다.
  • Microsoft Fakes 테스트는 모든 사용 가능한 Microsoft TestPlatform NuGet 패키지를 사용하여 실행할 수 있습니다.
  • Visual Studio Enterprise 2015 이상에서 Microsoft Fakes를 사용하는 테스트 프로젝트에 대해 코드 검사가 지원됩니다.

SDK 스타일 .NET Framework, .NET Core, .NET 5.0 이상 프로젝트의 Microsoft Fakes

  • Microsoft Fakes 어셈블리 생성은 Visual Studio Enterprise 2019 업데이트 6에서는 미리 보기로 지원되고 업데이트 8에서는 기본적으로 사용하도록 설정되어 있습니다.
  • .NET Framework를 대상으로 하는 프로젝트에 대한 Microsoft Fakes 테스트는 사용 가능한 모든 Microsoft TestPlatform NuGet 패키지를 사용하여 실행할 수 있습니다.
  • .NET Core 및 .NET 5.0 이상을 대상으로 하는 프로젝트에 대한 Microsoft Fakes 테스트는 버전이 16.9.0-preview-20210106-01 이상인 Microsoft.TestPlatform NuGet 패키지를 사용하여 실행할 수 있습니다.
  • Visual Studio Enterprise version 2015 이상에서 .NET Framework를 대상으로 Microsoft Fakes를 사용하는 테스트 프로젝트에 대해 코드 검사가 지원됩니다.
  • .NET Core 및 .NET 5.0 이상을 대상으로 Microsoft Fakes를 사용하는 테스트 프로젝트에 대한 코드 검사 지원은 Visual Studio 2019 업데이트 9 이상에서 사용할 수 있습니다.