반응형
모든 단위 테스트는 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 |