승인·스냅숏 테스트 (골든 마스터 테스트)

단위 테스트를 작성하는 가장 기초적인 패턴은 기대하는 출력과 실제 출력을 비교하는 것입니다. 이 기대하는 출력의 내용은 단위 테스트를 나중에 읽고 수정하는 협업자 입장에서는 의도를 드러내는 일종의 간이 명세처럼 여겨지기도 합니다.

그런데, 가끔은 기대하는 출력의 내용 자체는 사람에게 크게 중요하지 않거나 의미가 없을 때도 있습니다. 예를 들어 암호학 라이브러리를 직접 구현하는 프로젝트가 아니라면, 암호학적 해시의 결과가 일치하는 테스트의 “기대 출력” 자체는 사람이 맨눈으로 보고 이해할 수 없는 의미 없는 바이트열입니다. 출력이 일치하는지만 확인하면 되는 거죠.

암호학적 해시는 극단적인 예제이지만, 사람이 맨눈으로 이해할 수 있다고 해도 그 세세한 내용이 그렇게 중요하지 않을 수도 있습니다. 테스트가 실패할 때가 아니라면 들여다 볼 이유가 없고, 테스트 코드만 쓸 데 없이 길어지는 경우도 있습니다. 거대한 JSON 트리를 비교하는 경우, 실제로 틀리기 쉬운 부분은 전체 트리의 일부에 불과한데, 굳이 테스트 소스 코드에 이 전체 JSON 트리를 하드코딩해야 하는지 회의적인 기분이 들 때도 있습니다.

이런 종류의 테스트를 깔끔하고 편하게 하기 위한 테스트 방법론으로 골든 마스터 테스트(golden master testing) 또는 승인 테스트(approval testing)라고 불리는 것이 있습니다. 최근에는 스냅숏 테스트(snapshot testing)라고도 부릅니다. (이들 사이의 미묘한 차이점들이 존재하지만, 광의적으로는 거의 같습니다. 구체적인 차이는 스택 익스체인지의 이 답변이 도움이 됩니다.)

.NET에서도 이런 식의 테스트를 할 수 있게 도와주는 라이브러리들이 있습니다. 제가 찾아본 것은 두 개인데요, 사실 아직 저도 .NET으로 승인 테스트를 해 본 적이 없어서, 둘 사이의 구체적인 비교는 하지 못했습니다.

  • ApprovalTests: 제일 먼저 찾은 건데 이제는 관리되지 않는 것 같고, 심지어 Verify를 쓰길 공식적으로 권하고 있습니다.
  • Verify: xUnit, NUnit, Expecto, MSTest 등 다양한 테스팅 프레임워크를 지원하고 있습니다.

이 둘 말고도 다른 라이브러리가 더 있다면 소개해 주시면 감사하겠습니다.

6개의 좋아요

Verify를 통해 알게 된 Snapshot Testing에 대해서 좀 더 풍부한 이해를 돕는 글 감사드립니다.

2개의 좋아요

오! 이런 테스트 방식도 있었네요. :smile:
사용해 본적은 없는데 단위 테스트할 때 사용하는 FluentAssertions의 확장으로 Snapshooter라는 패키지가 지원하고 있는 것 같아 공유 드려요. 한번 사용해 봐야 되겠습니다~

프론트앤드의 단위 테스트 프레임워크인 jest에서는 자주 사용되는 검증 방식인가 보네요~
국내 프론트앤드 개발자분이 jest의 스냅샷 테스트를 설명하는 영상이 있어 공유 드려요.

3개의 좋아요