[실용주의 단위 테스트] 4장_테스트 조직

이번 장은 다음 주제를 다룬다.

  1. 준비-실행-단언을 사용해 테스트를 가시적이고 일관성 있게 만드는 방법
  2. 메서드를 테스트하는 것이 아니라, 동작을 테스트
  3. 테스트 이름의 중요성
  4. @Before, @After

1. AAA 로 테스트 일관성 유지

AAA 는 다음과 같다.

  • Arrange : 준비. 테스트 코드를 실행하기 전에 시스템에 적절한 상태에 있는지 확인
  • Act: 실행. 테스트 코드 실행
  • Assert : 단언. 실행한 코드가 기대한 대로 동작하는지 확인

예를 들면,

1
2
3
4
5
6
7
8
9
10
@Test
public void answerArithmeticMeanOfTwoNumbers() {
ScoreCollection collection = new ScoreCollection();
collection.add(() -> 5);
collection.add(() -> 7);

int actualResult = collection.arithmeticMean();

assertThat(actualResult, equalTo(6));
}

2. 동작 테스트 vs 메서드 테스트

단위 테스트를 작성할 때는, 개별 메서드를 테스트 하는 것이 아니라 클래스의 종합적인 동작을 테스트해야한다.

3. 테스트와 프로덕션 코드의 관계

테스트 코드는 프로덕션 시스템 코드에 의존하지만, 프로덕션 코드는 테스트 코드의 존재를 모른다.

4. 집중적인 단일 목적 테스트의 가치

다수의 케이스를 별도의 테스트 메서드로 분리하면 다음과 같은 장점이 있다.

  1. 단언이 실패했을 때 실패한 테스트의 이름이 표시되기 때문에, 어느 동작에서 문제가 있는지 빠르게 파악 가능
  2. JUnit 은 각 테스트를 별도의 인스턴스로 실행하기 때문에, 실패한 테스트에 대해 다른 테스트의 영향을 제거
  3. 모든 케이스가 실행되었을 보장할 수 있음. 단언이 실패하면 현재 테스트 메서드는 중단

5. 문서로서의 테스트

단위 테스트는 우리가 만드는 클래스에 대한 지속적이고 믿을 수 있는 문서 역할을 한다.
어느 형식이든 일관성 있는 이름으로 테스트를 문서화하는 것이 중요하다.
목표는, 테스트 코드를 다른 사람이 봤을 때 의미있게 만드는 것이다.
형식은 다음과 같은 것들이 있다.

doingSomeOperationGeneratesSomeResult

someResultOccursUnderSomeCondition

givenSomeContextWhenDoingSomeBehaviorThenSomeReulstOccurs (BDD)

whenDoingSomeBehaviorThenSomeReulstOccurs

6. @Before 와 @After

@Before 메서드를 사용해서 여러 테스트 메서드에 있는 중복된 초기화 코드를 제거할 수 있다.
@Before 메서드는 매번 테스트 메서드 실행에 앞서 실행된다. 예를 들어 다음 세 메서드가 있을 때,

  • @Before 메서드
  • A 테스트 메서드
  • B 테스트 메서드

다음 순으로 실행된다. (B 테스트 메서드가 먼저 실행될 수 있음)

@Before 메서드 -> A 테스트 메서드 -> @Before 메서드 -> B 테스트 메서드

@After 메서드는 클래스에 있는 각 테스트를 실행한 후에 실행된다. 테스트가 실패해도 실행된다.
@BeforeClass 는 클래스에 있는 어떤 테스트를 실행하기 전에 최초 한 번만 실행된다.


자바와 JUnit 을 활용한 실용주의 단위 테스트 <제프 랭어, 앤디 헌트, 데이브 토마스>

Comments