본문 바로가기

Develop

[Test] 단위 테스트 구조

반응형

모든 단위 테스트는 AAA패턴을 따라야 한다.

AAA패턴이란 준비(Arrange), 실행(Act), 검증(Assert)을 의미합니다. 만약 비개발자들을 고려한다면 각각을 given, when, then으로 구분할 수도 있습니다.

실행 구절이 한 줄 이상이면 SUT의 API에 문제가 있다.

SUT(System Under Test)의 이름을 sut로 지정해 테스트에서 구별하는게 좋습니다. 구절 사이에 빈 줄을 추가하거나 준비, 실행, 검증 구절 주석을 각각 앞에 둬서 구분하는게 좋습니다.

 

만약 실행 구절이 한 줄 이상이라면, 클라이언트가 항상 이 작업을 같이 수행해야 한다는 의미로, 이로 인해 잠재적 모순에 이어질 수 있습니다.

 

일반적으로 준비 구절이 세 구절 중가장 큽니다. 같은 테스트 클래스 내 비공개 메서드 또는 별도의 팩토리 클래스로 도출하는 것이 좋습니다. 준비 구절에서 코드 재사용에 도움이 되는 두 가지 패턴은 오브젝트 마더(Object Mother)와 테스트 데이터 빌더(Test Data Builder) 패턴이 있습니다.

오브젝트 마더 패턴

오브젝트 마더 패턴은 팩토리 매소드들의 하나의 방법입니다. 이 패턴은 테스트에서 비슷한 객체들을 생성하는데 사용됩니다.

public class TestUsers{
	public static User aRegularUser(){
    	return new User("name", 42);
    }
    public static User aRegularUserWithAge(int age){
    	return new User("name", age); 
    }
    // 다른 오브젝트 마더 패턴
}

public class UserServiceTest{
	void 예시_테스트(){
    	// given
        User user = TestUsers.aRegularUserWithAge(42);
        
        // when
        
        // then
    }
}

테스트 데이터 빌더 패턴

테스트 픽스처 초기화 코드는 팩토리 매서드를 도입하여 재사용하자.

생성자에 두지 않음으로써 재사용 가능하게 하고, 테스트 간 결합도를 줄이고, 가독성을 향상시키는게 좋습니다.

엄격한 테스트 명명 정책을 시행하지 마세요.

문제 도메인에 익숙한 비개발자들에게 시나리오를 설명하는 것처럼 각 테스트 이름을 지정하세요. 테스트 대상 메서드 이름을 넣지 마세요.

매개변수화된 테스트로 유사한 테스트에 필요한 코드의 양을 줄일 수 있습니다.

    @DisplayName("본문이 파싱하면, 해시태그 이름들을 중복 없이 반환한다.")
    @MethodSource
    @ParameterizedTest(name = "[{index}] \"{0}\" => {1}")
    void givenContent_whenParsing_thenReturnsUniqueHashtagNames(String input, Set<String> expected) {
        // Given

        // When
        Set<String> actual = sut.parseHashtagNames(input);

        // Then
        assertThat(actual).containsExactlyInAnyOrderElementsOf(expected);
        then(hashtagRepository).shouldHaveNoInteractions();
    }
    
     static Stream<Arguments> givenContent_whenParsing_thenReturnsUniqueHashtagNames() {
        return Stream.of(
                arguments(null, Set.of()),
                arguments("", Set.of()),
                arguments("   ", Set.of()),
        );
    }

검증문 라이브러리를 사용하면, 쉬운 영어처럼 읽도록 검증문에서 단어 순서를 재구성해 테스트 가독성을 향상시킬 수 있습니다.

 

 

반응형

'Develop' 카테고리의 다른 글

[Test] 런던파 vs 고전파  (0) 2023.10.16
[Develop] Redis 캐시로 사용하기  (0) 2023.10.07