[단위 테스트] 원칙과 패턴 (3장) - 단위 테스트 작성 원칙

2025. 4. 15. 12:45·기타

단위 테스트 작성 원칙 정리


1. AAA 패턴을 따르자 (Arrange → Act → Assert)

  • 테스트는 다음 3가지 구절로 구성되어야 합니다:
  • cpp 복사편집 // arrange - 준비 // act - 실행 // assert - 검증
  • 각 구절은 하나씩만 존재하도록 한다.
  • 여러 개의 실행/검증이 있다면 → 테스트를 분리한다.

2. 실행 구절이 2줄 이상이라면?

  • 테스트 대상 API(SUT)의 캡슐화가 부족할 가능성이 있다.
  • 항상 함께 호출해야 하는 API 조합은 불변성 위반 가능성이 높다.
  • 캡슐화를 통해 불변성을 내부에서 보장하도록 리팩토링하자.

3. 테스트 대상 객체는 sut로 명명하자

  • 테스트에서 검증 대상 객체는 항상 sut로 명명해서 가독성과 의도를 명확히 한다
InfoBoardService sut = new InfoBoardService(...);

  


4. 테스트 픽스처는 팩토리 메서드로 분리하자

  • 테스트 클래스의 생성자에 픽스처 코드를 넣지 말고,
  • 아래처럼 정적 팩토리 메서드로 분리해 재사용성과 가독성을 높인다.
  • private static Customer createSampleCustomer() { return new Customer("홍길동", "hong@example.com"); }
private static Customer createSampleCustomer() { return new Customer("홍길동", "hong@example.com"); }

5. 테스트 이름은 시나리오처럼 자연스럽게 작성

  • 테스트 명명에 엄격한 규칙 적용은 ❌
  • 비개발자도 이해할 수 있는 문장 형태로 테스트 이름을 작성
  • 테스트 대상 메서드명을 굳이 포함할 필요 없음
  • 단어는 언더스코어(_)로 구분
    로그인되지_않은_사용자가_접근하면_403_오류를_반환한다()
    
    
  •  

6. 매개변수화된 테스트로 유사 테스트를 압축하자

  • 반복되는 유사 테스트는 @ParameterizedTest로 압축할 수 있음
  • 단점: 테스트 이름 표현이 어려움 → @DisplayName 또는 @CsvSource(name=...) 사용
@ParameterizedTest(name = "{0}은 짝수인가? {1}")
@CsvSource({"2,true", "3,false", "4,true"})
void 숫자의_짝수_여부를_검사한다(int number, boolean isEven) {
    assertThat(number % 2 == 0)
    .isEqualTo(isEven);
}

7. 검증문은 쉽게 읽히도록 구성하자

  • AssertJ 등의 라이브러리를 활용하면, 자연어처럼 읽히는 문장으로 검증 가능
  • 테스트 가독성을 비약적으로 향상시킴
    assertThat(actual).isEqualTo(expected);
    assertThat(user.isAuthenticated()).isFalse();
    
    

보완 팁: 테스트의 3대 속성

  • 신뢰성: 테스트는 항상 같은 결과를 내야 한다 (플레이크 테스트 X)
  • 독립성: 테스트 간 상태가 서로 영향을 미치면 안 됨
  • 빠름: 단위 테스트는 수 밀리초 내에 실행 완료되어야 함

최종 요약표

원칙 요약 설명

AAA 패턴 Arrange → Act → Assert 구분, 구절당 1번만
실행이 2줄 이상 API 캡슐화 부족 → 리팩토링 필요
SUT 명명 테스트 대상은 항상 sut 로 명시
픽스처 초기화 팩토리 메서드로 분리해 재사용
테스트 명명 시나리오 기반 자연어 스타일, 언더스코어 사용
파라미터화된 테스트 반복 테스트 압축, 이름은 명확히
검증문 구성 AssertJ 등으로 자연스럽게 표현
테스트 속성 빠르고, 독립적이며, 신뢰성 확보

 

'기타' 카테고리의 다른 글

[단위 테스트] 원칙과 패턴 (7장) - 단위테스트를 위한 리팩터링  (0) 2025.04.18
[단위 테스트] 원칙과 패턴 (6장) - 단위 테스트 스타일  (0) 2025.04.17
[단위 테스트] 원칙과 패턴 (5장) - 목과 테스트 취약성  (0) 2025.04.16
[단위 테스트] 원칙과 패턴 (4장) - 좋은 단위 테스트의 4대 요소  (0) 2025.04.15
[단위 테스트] 원칙과 패턴 (1장 , 2장) - 목표 및 정의  (0) 2025.04.14
'기타' 카테고리의 다른 글
  • [단위 테스트] 원칙과 패턴 (6장) - 단위 테스트 스타일
  • [단위 테스트] 원칙과 패턴 (5장) - 목과 테스트 취약성
  • [단위 테스트] 원칙과 패턴 (4장) - 좋은 단위 테스트의 4대 요소
  • [단위 테스트] 원칙과 패턴 (1장 , 2장) - 목표 및 정의
ksngh
ksngh
웹 백엔드 개발 블로그입니다. https://github.com/ksngh
  • ksngh
    featherdale
    ksngh
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • 데이터베이스 (10)
      • spring (11)
      • redis (7)
      • ELK (11)
      • 회고 (6)
      • 기타 (13)
        • java (2)
        • 디자인패턴 (2)
        • 영어 (1)
        • 자바스크립트 (1)
        • graphQL (2)
        • 블록체인 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디자인패턴
    대용량데이터베이스
    회고
    조인의 종류
    대용량 데이터 베이스
    NORI
    Text to SQL
    단위 테스트
    PostgreSQL
    데이터베이스
    레디스
    연말 회고
    Spy
    Spring Core
    spring
    Elastic Search
    엘라스틱 서치 인 액션
    Redis
    Elasticsearch
    단위테스트
    Mock
    자료구조
    엘라스틱 서치
    NoriTokenizer
    엘라스틱서치
    gof
    core
    graphql
    nori tokenizer
    elastic search in action
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ksngh
[단위 테스트] 원칙과 패턴 (3장) - 단위 테스트 작성 원칙
상단으로

티스토리툴바