Skip to main content

Command Palette

Search for a command to run...

.NET Foundation 프로젝트 소개(1): Verify

Published
3 min read
.NET Foundation 프로젝트 소개(1): Verify

여러분의 시간을 아낄 수 있는 .NET Foundation의 유용한 프로젝트 소개를 소개하는 시간입니다.

오늘 소개하는 프로젝트는 Verify인데요, Verify는 복잡한 데이터 모델 및 문서의 어설션을 단순화하는 스냅숏 도구입니다.

어설션 단계에서 테스트 결과에 대한 확인이 호출됩니다. 해당 결과를 직렬화 하고 테스트 이름과 일치하는 파일에 저장합니다. 다음 테스트 실행에서 결과는 다시 직렬화 되고 기존 파일과 비교됩니다. 두 스냅숏이 일치하지 않거나 변경이 예기치 않거나 참조 스냅숏을 새 결과로 업데이트 해야 하는 경우 테스트가 실패합니다.

NuGet 패키지

Verify는 다음의 테스트 도구에 대한 NuGet 패키지를 제공합니다.

스냅샷 관리

스냅샷 파일을 수락하거나 거절하는 것은 Verify의 핵심 워크플로의 일부입니다. 이 작업을 수행하는 방법에는 여러 가지가 있으며 개인 기본 설정에 의해 접근할 수 있습니다.

  • DiffEngineTray의 윈도우 트레이
  • ReShaper 테스트 러너 지원
  • Rider 테스트 러너 지원
  • 클립보드를 통해
  • 실행된 diff 도구에서 수동으로 변경합니다. 복사 붙여 넣기를 하거나 일부 도구에는 바로 가기 또는 버튼을 통해 자동화 하는 명령이 있습니다.
  • .received. 파일을 .verified.로 이름 변경을 해서 파일 시스템에서 수동으로 할 수 있습니다. 스크립트를 통해 .received. 파일을 일괄 수락하도록 자동화 할 수 있습니다.

사용법

테스트 중일 때

테스트할 클래스:

public static class ClassBeingTested
{
    public static Person FindPerson()
    {
        return new()
        {
            Id = new("ebced679-45d3-4653-8791-3d969c4a986c"),
            Title = Title.Mr,
            GivenNames = "John",
            FamilyName = "Smith",
            Spouse = "Jill",
            Children = new()
            {
                "Sam",
                "Mary"
            },
            Address = new()
            {
                Street = "4 Puddle Lane",
                Country = "USA"
            }
        };
    }
}

xUnit

[UsesVerify]
public class Sample
{
    [Fact]
    public Task Test()
    {
        var person = ClassBeingTested.FindPerson();
        return Verifier.Verify(person);
    }
}

NUnit

[TestFixture]
public class Sample
{
    [Test]
    public Task Test()
    {
        var person = ClassBeingTested.FindPerson();
        return Verifier.Verify(person);
    }
}

Expecto

open Expecto
open VerifyTests
open VerifyExpecto

[<Tests>]
let tests =
  testTask "findPerson" {
    let person = ClassBeingTested.FindPerson();
    do! Verifier.Verify("findPerson", person)
  }

주의사항

Expecto 구현 특성으로 Verify의 다음 API는 지원되지 않습니다.

  • settings.UseTypeName()
  • settings.UseMethodName()
  • settings.UseParameters()
  • settings.UseTextForParameters() 대신 사용자 name 매개변수를 사용하세요.

MSTest

[TestClass]
public class Sample :
    VerifyBase
{
    [TestMethod]
    public Task Test()
    {
        var person = ClassBeingTested.FindPerson();
        return Verify(person);
    }
}

초기 검증

테스트가 처음 실행되면 다음과 같이 실패합니다.

First verification. Sample.Test.verified.txt not found.
Verification command has been copied to the clipboard.

검증 할 .verified. 파일이 없어 발생한 것으로 .received. 파일을 이용해 .verified. 파일을 생성해야 합니다.

클립보드에 자동으로 다음이 포함됩니다.

cmd /c move /Y "C:\Code\Sample\Sample.Test.received.txt" "C:\Code\Sample\Sample.Test.verified.txt"

클립보드 대신 DiffEngineTray 도구를 사용할 수 있습니다.

Diff 도구를 사용할 경우 다음과 같이 감지됩니다.

image.png

테스트 결과로 검증 상태를 만들기 위해서 다음과 같이 할 수 있습니다.

  • 클립보드의 명령을 실행
  • diff 도구를 사용해서 변경 사항을 수락
  • 텍스트를 새 파일에 수동으로 복사

후속 검증

후속 검증을 확인하기 위해 FindPerson()을 다음과 같이 변경하고 테스트를 실행하면,

public static class ClassBeingTested
{
    public static Person FindPerson()
    {
        return new()
        {
            Id = new("ebced679-45d3-4653-8791-3d969c4a986c"),
            Title = Title.Mr,
            // Middle name added
            GivenNames = "John James",
            FamilyName = "Smith",
            Spouse = "Jill",
            Children = new()
            {
                "Sam",
                "Mary"
            },
            Address = new()
            {
                // Address changed
                Street = "64 Barnett Street",
                Country = "USA"
            }
        };
    }
}

다음처럼 실패합니다.

Verification command has been copied to the clipboard.
Assert.Equal() Failure
                                   (pos 21)
Expected: ···\n  GivenNames: 'John',\n  FamilyName: 'Smith',\n  Spouse: 'Jill···
Actual:   ···\n  GivenNames: 'John James',\n  FamilyName: 'Smith',\n  Spouse:···
                                   (pos 21)

클립보드에는 다시 자동으로 다음이 포함됩니다.

cmd /c move /Y "C:\Code\Sample\Sample.Test.received.txt" "C:\Code\Sample\Sample.Test.verified.txt"

diff 도구는 변경된 부분을 다음처럼 표시합니다.

image.png

동일한 접근 방식으로 결과를 확인할 수 있으며 ClassBeingTested의 변경과 함께 Sample.Test.verified.txt가 소스 제어에 의해 커밋됩니다.

마무리

Verify를 잘 활용하면 복잡한 모델이나 문서에 대한 어설션을 단순화 할 수 있습니다. VerifyJson 기능으로 JSON도 지원합니다.

좀 더 자세한 내용은 Verify의 GitHub 페이지를 참조하세요.

10 views

More from this blog

개발, 테스트, 운영에서의 도커 활용

핵심 원칙: "한 번 빌드하고, 어디서든 실행한다 (Build once, run anywhere)" 도커의 가장 큰 장점은 환경 일관성입니다. 동일한 도커 이미지를 사용하여 개발, 테스트, 운영 환경을 구성함으로써 "제 PC에서는 됐는데..." 하는 문제를 최소화할 수 있습니다. 1. 개발 단계 (Development) 목표: 빠른 코드 변경 반영, 쉬운 디버깅, 실제 운영 환경과 유사한 환경 구성. Docker 사용 방안: Dockerf...

May 9, 20256 min read15

[EF Core] 데이터 삭제 시 소프트 삭제 적용

DB에서 데이터를 삭제하면 일반적으로 복구할 수 없습니다. 또한 관계에 따라 영구 삭제 자체가 어려울 수도 있습니다. 그래서 데이터를 영구 삭제하는 대신 IsDeleted 속성을 true로 주고 IsDeleted 속성을 필터링해서 조회하는 방법을 사용하기도 합니다. 이를 소프트 삭제라고 합니다. 그런데 EF에서 알아서 데이터 삭제 시 소프트 삭제를 하고 쿼리시 IsDeleted 속성을 체크해서 삭제한 데이터를 제외한 데이터만 쿼리하게 하는 ...

Mar 18, 20243 min read19

[EF Core] ValueConverter를 이용해서 엔터티 속성의 도메인 관리

EF Core를 사용하면서 문자열 길이 등의 특성을 일일이 지정하는 것은 번거롭습니다. ... [MaxLength(32)] public string? 제목 { get; set; } 엔터티가 한 개일 때는 상관이 없으나 제목 유형이 여러 엔터티에 사용될 경우 유형을 지정하기 번거롭습니다. 속성 유형을 도메인으로 관리하면 참 편할텐데요, ValueConverter를 이용할 수 있습니다. 그런데 이것을 인터페이스 정적 추상를 사용해서 다음처럼 ...

Mar 16, 20242 min read8

디모이 블로그

154 posts

.NET 관련 기술을 선호하고 새로운 언어를 배우는데 관심이 있습니다.