장정우님이 지음, [스프링부트 핵심가이드 :: 스프링 부트를 활용한 애플리케이션 개발 실무] 책을 읽고 정리한 필기입니다.📢
테스트 코드를 작성하는 방법
테스트 코드를 작성하는 방법은 다양하다. 이 책에서는 그중 많은 사람들이 사용하는 ‘Given-When-Then’ 패턴과 ‘F.I.R.S.T’ 전략을 소개한다.
Given-When-Then 패턴
Given-When-Then 패던은 테스트 코드를 표현하는 방식 중 하나이다. 단어에서 유추할 수 있듯이 다음과 같은 단계를 설정해서 각 단계의 목적에 맞게 코드를 작성한다.
Given
- 테스트를 수행하기 전에 테스트에 필요한 환경을 설정하는 단계이다. 테스트에 필요한 변수를 정의하거나 Mock 객체를 통해 특정 상황에 대한 행동을 정의한다.
When
- 테스트의 목적을 보여주는 단계이다. 실제 테스트 코드가 포함되며, 테스트를 통한 결괏값을 가져오게 된다.
Then
- 테스트의 결과를 검증하는 단계이다. 일반적으로 When 단계에서 나온 결괏값을 검증하는 작업을 수행한다. 결괏값이 아니더라도 이 테스트를 통해 나온 결과에서 검증해야 하는 부분이 있다면 이 단계에 포함한다.
Given-When-Then 패턴은 테스트 주도 개발에서 파생된 BDD(Behavior-Driven-Development; 행위 주도 개발)를 통해 탄생한 테스트 접근 방식이다. 일반적으로 단위 테스트보다는 비교적 많은 환경을 포함해서 테스트하는 인수 테스트에서 사용하는 것에 적합하다고 알려져 있지만 개인적으로는 단위 테스트에서도 유용하게 활용할 수 있다고 생각한다.
Given-When-Then 패턴은 간단한 테스트로 여겨지는 단위 테스트에서는 잘 사용하지 않는다. 그 이유 중 하나는 불필요하게 코드가 길어진다는 것이다. 하지만 이 패턴을 통해 테스트 코드를 작성한다면 앞에서 다룬 테스트 코드를 작성하는 이유 중 하나인 ‘명세’ 문서의 역할을 수행한다는 측명에서 맣은 도움이 된다.
좋은 테스트를 작성하는 5가지 속성
F.I.R.S.T는 테스트 코드를 작성하는 데 도움이 될 수 있는 5가지 규칙을 의미한다. 이 규칙은 대체로 단위 테스트에 적용할 수 있는 규칙이며, 간단하게 설명하면 다음과 같다.
빠르게(Fast)
- 테스트는 빠르게 수행돼야 한다. 테스트가 느리면 코드를 개선하는 작업이 느려져 코드 품질이 떨어질 수 있다. 테스트 속도에 절대적인 기준은 없지만 목적을 단순하게 설정해서 작성하거나 외부 환경을 사용하지 않는 단위 테스트를 작성하는 것 등을 빠른 테스트라고 할 수 있따.
고립된, 독립적(Isolated)
- 하나의 테스트 코드는 목적으로 여기는 하나의 대상에 대해서만 수행돼야 한다. 만약 하나의 테스트가 다른 테스트코드와 상호작용하거나 관리할 수 없는 외부 소스를 사용하게 되면 외부 요인으로 인해 테스트가 수행되지 않을 수 있다.
반복 가능한(Repeatable)
- 테스트는 어떤 환경에서도 반복 가능하도록 작성돼야 한다. 이 의미는 앞의 Isolated 규칙과 비슷한 의미를 갖고 있다. 테스트는 개발 환경의 변화나 네트워크의 연결 여부와 상관없이 수행돼야 한다.
자가 검증(Self-Validating)
- 테스트는 그 자체만으로도 테스트 검증이 완료돼야 한다. 테스트가 성공했는지 실패했는지 확인할 수 있는 코드를 함께 작성해야 한다. 만약 결괏값과 기댓값을 비교하는 작업을 코드가 아니라 개발자가 직접 확인하고 있다면 좋지 못한 테스트 코드이다.
적시에(Timely)
- 테스트 코드는 테스트하려는 애플리케이션 코드를 구현하기 전에 완성돼야 한다. 너무 늦게 작성된 테스트 코드는 정상적인 역할을 수행하기 어려울 수 있따. 또한 테스트 코드로 인해 발견된 문제를 해결하기 위해 소모되는 개발 비용도 커지기 쉽다. 다만 이 개념은 테스트 주도 개발의 원칙을 따르는 테스트 작성 규칙으로, 테스트 주도 개발을 기반으로 애플리케이션을 개발하는 것이 아니라면 이 규칙은 제외하고 진행하기도 한다.
댓글남기기