본문 바로가기

테스트

[테스트] Unit Test - 테스트의 검증 방법

개요

이번 포스팅은 Unit Test 과정에서의 검증 방법과 각종 용어에 대해 정리한다.

 

 

상태 검증과 행위 검증

테스트의 검증은 주로 상태 검증과 행위 검증으로 나뉜다. 상태 검증은 특정 메서드가 수행된 후 객체들의 상태를 검증하는 것이고, 행위 검증은 특정 메서드가 호출되었는지와 같은 행위를 검사한다.

 

상태 검증의 예

val abc = Abc()
abc.increase()
assertThat(abc.value).isEqualTo(10)

위에서는 abc 인스턴스의 value가 10과 같은지 상태를 검증한다.

 

행위 검증의 예

val abc = Abc()
abc.increase()
verify(abc, atLeastOnce()).increase()

위에서는 abc 인스턴스의 increase() 메서드가 최소 한 번은 수행되었는지 행위를 검증한다.

 


Test Double(테스트 더블)

테스트 더블은 테스트 코드를 작성할 때 필요한(의존하는) 컴포넌트를 활용할 수 없을 때 사용하는 객체를 의미한다. 대표적으로 Mock과 Stub, Dummy 등 이 있다. 테스트 더블은 실제 의존 컴포넌트와 똑같이 행동하지 않아도 되며 같은 API만 제공하면 된다.

 

테스트 더블의 역할

  • 테스트 코드를 격리한다.
  • 테스트 속도를 개선한다.
  • 예측 불가능한 요소를 제거한다.
  • 특수한 상황을 시뮬레이션할 수 있다.
  • 감춰진 정보를 얻어낸다.

Dummy

존재는 하지만 실제 사용되지 않는 객체이다. 예를 들면, 함수 파라미터에 전달되는 데에 사용된다.

 

Stub

테스트에서 호출된 요청에 대한 특정한 결과를 반환하는데 사용된다. Dummy에 비해 실제 어느 정도 구체화 된 객체로 특정 상태를 가정하여 특정 값을 리턴하거나 특정 메시지를 출력하도록 동작한다. 상태의 검증을 위해 사용한다.

 

Mock

호출에 대한 기대값을 명세하고, 해당 내용에 따라 동작하도록 프로그래밍 된 객체이다. 호출 시 동작이 잘 되었는지 확인하는데 사용하는 행위를 검증하기 위한 객체이다.

 

Spy

테스트에 사용되는 객체, 메소드의 사용 여부 및 정상 호출 여부를 기록하고 확인하느넫 사용한다.

 

Fake

실제 동작하는 구현체가 존재하지만 프로덕션에 적합하지 않은 객체이다. 대표적인 예시로는 InMemoryDB가 있다.

 


Given-When-Then Pattern

테스트 코드를 작성할 때 사용하는 패턴이다. "주어진(Given) 상황에서 어떤 일이 발생 했을 때(When) 결과(Then)는 무엇인가?"를 의미한다. 이는 곧 준비-실행-겸증의 순서를 의미한다.

@Test
void findAll() {
    // given    
    doReturn(studentList()).when(studentRepository).findAll();  
    
    // when
    final List<Student> studentList = studentService.findAll();
    
    // then
    assertThat(studentList.size()).isEqualTo(5); 
    
}