이번주 테스트를 작성하면서 Describe-Context-It 패턴을 이용했다.
이전까지 테스트코드를 작성할 때 어떤 맥락에서 이 테스트가 동작하는지에 대한 설명을 한번에 알아보기 어려웠던 적이 있었다.
Describe - Context - It을 이용해서 코드의 행동을 설명하는 패턴을 만들 수 있어 더 이해하기 쉬운 테스트코드를 만들었다.
Describe에는 설명할 테스트 대상을 명시한다.
describe('login', () => {
Context는 테스트 대상이 놓인 상황을 설명한다.
with 또는 when으로 시작하도록 한다.
context('with correct accountNumber and password ', () => {
It은 테스트 대상의 행동을 설명한다.
행동을 심플하게 설명한다.
it('load accountNumber information', async () => {
이 패턴을 사용해 테스트코드를 계층 구조로 만들어 어떤 흐름에서 테스트코드가 실행되는지 알기 쉽게 설명할 수 있다.
JUnit5에서도 @Nested와 @DisplayName을 이용하여 이런 모양으로 테스트를 작성할 수 있다.
@Nested
@DisplayName("TransferTo")
class Describe_transferTo {
@Nested
@DisplayName("With correct amount")
class Context_with_CorrectAmount {
@Test
@DisplayName("Transfer success and amount change")
void transferTo() {
Long transferAmount = 100_000L;
account1.transferTo(account2, transferAmount);
assertThat(account1.amount()).isEqualTo(amount1 - transferAmount);
assertThat(account2.amount()).isEqualTo(amount2 + transferAmount);
}
}
}
물론 짧고 간단한 테스트의 경우 한눈에 봐도 알기 쉬운 경우가 있지만 테스트가 많아지는 경우엔 이렇게 분기를 나눠 테스트하는 것이 나중에 테스트를 다시 봤을 때 훨씬 이해하기 쉽게 만들어 줄 것이라고 생각한다.