Test/vitest

[vitest] 테스트 코드 작성 시 검증(Assertion) 전략 비교 - 엄격한 비교 vs 유연한 비교

머지?는 병합입니다 2025. 2. 22. 12:46

1. 들어가며


테스트 코드 작성 시 검증(Assertion)은 코드의 예상대로 작동하는지 확인하는 핵심 과정입니다. 

효과적인 테스트는 꼼꼼한 검증에서 비롯되며, 다양한 상황에 맞춰 적절한 검증 방식을 선택하는 것이 중요합니다. 

때로는 엄격한 비교가 필요하고, 때로는 유연한 비교가 더 적합할 수 있습니다. 

이 글에서는 Vitest를 사용하여 테스트 코드를 작성할 때, 엄격한 비교와 유연한 비교라는 두 가지 주요 검증 전략을 비교 분석하고, 각각의 장단점과 사용 시점을 제시하여 상황에 맞는 최적의 검증 전략을 선택하는 방법에 대해 알아보겠습니다.



2. 두 가지 검증 전략 비교


2.1 엄격한 비교 (Strict Comparison)

엄격한 비교는 예상 결과와 실제 결과가 정확히 일치하는지 확인하는 방법입니다. Vitest에서는 toEqual 메서드를 사용하여 객체의 모든 속성과 값이 동일한지 비교합니다.

 

expect(result).toEqual(expectedObject)


장점:

  • 정확한 데이터 구조 보장: 데이터 구조의 정확성이 중요한 경우, 엄격한 비교는 예상치 못한 데이터 변경을 방지하고 코드의 안정성을 높입니다.

  • 예상치 못한 오류 방지: 예기치 않은 속성이나 값의 차이를 감지하여 잠재적인 버그를 사전에 발견할 수 있습니다.


단점:

 

  • 유지보수 비용 증가: 객체의 구조가 조금만 변경되어도 테스트가 실패할 수 있으므로, 유지보수 비용이 증가할 수 있습니다.

  • 불필요한 검증: 때로는 특정 속성만 검증하면 충분한 경우에도 객체 전체를 비교하므로 불필요한 검증이 발생할 수 있습니다.

 


사용해야 할 때:

  • 정확한 데이터 구조가 중요한 경우: API 응답, 설정 파일 등 데이터 구조가 엄격하게 정의되어야 하는 경우에 유용합니다.

  • 보안이 중요한 로직: 권한 검사, 암호화 등 보안과 관련된 로직을 테스트할 때, 데이터의 정확성을 보장하기 위해 사용합니다.


2.2 유연한 비교 (Flexible Comparison)


유연한 비교는 예상 결과의 특정 속성만 일치하는지 확인하는 방법입니다.

Vitest에서는 expect.objectContaining 메서드를 사용하여 객체의 특정 속성만 비교할 수 있습니다.

expect(result).toEqual(expect.objectContaining({
  id: expectedId
}))



장점:

  • 유연성: 객체의 구조가 변경되더라도 검증 대상 속성만 일치하면 테스트가 통과하므로, 코드 변경에 유연하게 대처할 수 있습니다.

  • 유지보수 용이: 객체 전체를 비교하는 것보다 유지보수 비용이 적게 듭니다.

  • 관련성 높은 속성 위주 검증: 테스트 대상 객체의 특정 속성에만 집중하여 검증할 수 있으므로, 테스트 코드의 가독성을 높일 수 있습니다.


 단점:

  • 세부적인 검증 누락 가능성: 검증 대상이 아닌 속성의 오류를 놓칠 수 있습니다.

  • 정확도: 객체의 모든 속성을 검사하지 않기 때문에, 데이터의 정확성을 완벽하게 보장하기 어렵습니다.


사용해야 할 때:

  • 특정 속성만 중요한 경우: API 응답의 ID 값, UI 컴포넌트의 특정 텍스트 등 특정 속성만 검증해도 충분한 경우에 적합합니다.

  • API호출 검증: API 호출 시 특정 파라미터가 제대로 전달되는지 확인할 때 유용합니다.


3. 실제 사례 분석


엄격한 비교 사례

test('API 응답의 데이터 구조 검증', () => {
  const response = {
    id: 1,
    name: 'Test User',
    email: 'test@example.com'
  };
  const expected = {
    id: 1,
    name: 'Test User',
    email: 'test@example.com'
  };
  expect(response).toEqual(expected);
});



이 테스트는 API 응답의 데이터 구조를 엄격하게 검증합니다. 

response 객체의 모든 속성과 값이 expected 객체와 정확히 일치해야 테스트가 통과합니다. 

이는 API 응답의 데이터 구조가 변경되면 테스트가 실패하므로, API 스펙 변경에 대한 빠른 감지가 가능합니다.

 


유연한 비교 사례

test('API 응답의 ID 값 검증', () => {
  const response = {
    id: 123,
    name: 'Test User',
    email: 'test@example.com'
  };
  const expectedId = 123;
  expect(response).toEqual(expect.objectContaining({
    id: expectedId
  }));
});



이 테스트는 API 응답의 ID 값만을 유연하게 검증합니다.

response 객체의 id 속성이 expectedId와 일치하는지 확인하는 것이 중요하며, 다른 속성들은 검증 대상이 아닙니다.

API 응답에 다른 속성이 추가되거나 변경되더라도 이 테스트는 통과합니다.

 


4. 검증 전략 선택 가이드


검증 전략을 선택할 때는 다음 사항들을 고려해야 합니다.

  1. 비즈니스 요구사항에 따른 선택: 데이터의 정확성이 중요한 비즈니스 로직에서는 엄격한 비교를 사용하고, API 응답의 특정 속성 값과 같이 특정 값만 확인하면 되는 경우에는 유연한 비교를 사용하는 것이 좋습니다.

  2. 테스트 유지보수 비용 고려: 테스트 코드의 유지보수 비용을 고려하여 적절한 검증 전략을 선택해야 합니다. 객체의 구조가 자주 변경되는 경우에는 유연한 비교를 사용하는 것이 유지보수 비용을 줄일 수 있습니다.

  3. 팀 컨벤션과의 조화: 팀 내 코딩 컨벤션과 테스트 전략을 준수하여 일관성 있는 테스트 코드를 작성해야 합니다.

 


5. 결론


Vitest를 사용한 테스트 코드 작성 시, 엄격한 비교와 유연한 비교는 각각 장단점을 가지고 있으며, 상황에 맞는 적절한 검증 전략을 선택하는 것이 중요합니다. 데이터의 정확성이 중요한 경우에는 엄격한 비교를 사용하고, 코드 변경에 유연하게 대처해야 하는 경우에는 유연한 비교를 사용하는 것이 좋습니다. 테스트 코드 작성 시 이러한 점들을 고려하여 효율적이고 유지보수가 용이한 테스트 코드를 작성함으로써, 소프트웨어의 품질을 향상시킬 수 있습니다.