Microsoft Fakes를 사용하여 테스트 중인 코드 격리

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

이 방법의 이점은 격리된 코드의 특정 기능을 테스트하는 데 집중할 수 있다는 것입니다. 테스트가 실패하면 원인은 격리된 코드 내에 있고 다른 곳에는 없습니다. 또한 Microsoft Fakes에서 제공하는 스텁 및 shim을 사용하면 애플리케이션의 다른 부분이 아직 작동하지 않더라도 코드를 테스트할 수 있습니다.

요구 사항

메모

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

코드 격리에서 Microsoft Fakes의 역할

Microsoft Fakes는 스텁과 shim이라는 두 가지 메커니즘을 제공하여 코드 격리에서 중요한 역할을 합니다.

  • 스텁: 클래스를 동일한 인터페이스를 구현하는 작은 대체 항목으로 바꾸는 데 사용됩니다. 이렇게 하려면 각 구성 요소가 다른 구성 요소가 아닌 인터페이스에만 의존하도록 애플리케이션을 설계해야 합니다.

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

일반적으로 스텁은 Visual Studio 솔루션 내의 호출에 사용되고 다른 참조된 어셈블리에 대한 호출에는 shim이 사용됩니다. 이는 솔루션 내에서는 스텁 처리에 필요한 방식으로 인터페이스를 정의하여 구성 요소를 분리하는 것이 좋은 방법이기 때문입니다. 그러나 외부 어셈블리는 종종 별도의 인터페이스 정의와 함께 제공되지 않으므로 shim이 대신 사용됩니다.

Fakes가 다른 구성 요소를 대체하는 모습을 보여 주는 다이어그램

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

스텁은 일반적으로 Visual Studio 솔루션 내의 호출에 사용되는데, 이는 스터빙에 필요한 방식으로 인터페이스를 정의하여 구성 요소를 분리하는 것이 좋은 방법이기 때문입니다. 그러나 System.dll같은 외부 어셈블리는 일반적으로 별도의 인터페이스 정의와 함께 제공되지 않으므로 이러한 경우에는 shim이 대신 사용됩니다.

스텁을 사용하려면 서로 다른 구성 요소가 서로 종속되지 않고 인터페이스 정의에만 종속되도록 애플리케이션을 디자인해야 합니다. 이 분리는 애플리케이션을 보다 강력하고 유연하게 만들며 테스트 중인 구성 요소를 테스트 목적으로 인터페이스의 스텁 구현에 연결할 수 있게 해줍니다.

실제로 Visual Studio 인터페이스 정의에서 스텁 형식을 생성한 다음 실제 구성 요소를 테스트의 스텁으로 바꿀 수 있습니다.

Shim 사용 시기에 대한 권장 사항

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

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

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

정적 메서드, 봉인된 형식: 스텁만 사용하여 인터페이스를 구현할 수 있습니다. 따라서 스텁 형식은 정적 메서드, 가상이 아닌 메서드, 봉인된 가상 메서드, 봉인된 형식의 메서드 등에 사용할 수 없습니다.

내부 형식: 스텁과 shim을 모두 어셈블리 특성을 InternalsVisibleToAttribute사용하여 액세스할 수 있는 내부 형식과 함께 사용할 수 있습니다.

Private 메서드: 메서드 시그니처의 모든 형식이 표시되는 경우 Shim은 프라이빗 메서드에 대한 호출을 대체할 수 있습니다. 스텁은 표시되는 메서드만 바꿀 수 있습니다.

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


.NET Framework의 Microsoft Fakes를 SDK-Style 프로젝트로 전환

Microsoft Fakes를 사용하는 .NET Framework 테스트 프로젝트를 SDK 스타일 .NET Framework, .NET Core 또는 .NET 5개 이상의 프로젝트로 전환합니다.

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

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

  • 특정 형식은 .NET Framework 및 .NET Core/.NET 5.0의 다른 어셈블리에 있습니다(예: System.DateTimeSystem/mscorlib .NET Framework 및 .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 작업 .NET Core 및 .NET 5개 이상의 프로젝트를 사용하여 분산 테스트하려면 Visual Studio 2019 업데이트 9 미리 보기 20201020-06 이상이 필요합니다.

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

.NET Framework를 대상으로 하는 기존 프로젝트(SDK 스타일이 아닌)의 Microsoft Fakes

  • 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 버전 2015 이상에서 Microsoft Fakes를 사용하여 .NET Framework를 대상으로 하는 테스트 프로젝트에 지원됩니다.
  • Microsoft Fakes를 사용하는 .NET Core 및 .NET 5.0 이상을 대상으로 하는 테스트 프로젝트에 대한 코드 검사 지원은 Visual Studio 2019 업데이트 9 이상에서 사용할 수 있습니다.