JUnit 을 이용한 테스트코드 작성

POII·2022년 11월 4일
0
post-thumbnail

우아한 테크코스 프리코스 2주차 미션이 도착했다.
안내사항을 읽어보던 중 이런 구문들을 발견했다.

기능 목록이 정상 동작함을 확인해야 한다는데, 이를 위해서는 기능 전체를 묶어서 테스트하는 것보단 작은 기능별로 단위테스트를 하는 것이 낫겠다고 생각했다.

그래서 이번 기회에 JUnit 을 이용한 단위 테스트에 대한 것을 공부하고 간단히 정리해보았다.

단위테스트시 고려사항

1. FAST: 테스트는 빠르게 동작하여야 한다.

진정한 단위 테스트는 실행시점에 구성되어야할 기반요소가 없기 때문에 대체로 굉장히 빠르게 실행된다. (True unit tests typically run extremely quickly, as there is no runtime infrastructure to set up.)
출처: https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#unit-testing

이 원칙을 지키기 위해 할 수 있는 것은 여러가지가 있다.

가장 먼저 생각해볼 수 있는 것은 테스트할 모듈을 더 잘게 쪼개는 것 이다.

또, 서버나 DB에 대한 접근을 줄이는 것도 테스트 코드의 속도 향상에 도움이 될 것이다.
예를 들면 DB에서 가져온 데이터에 대한 연산이 잘 이루어지는지 검증하는 기능을 테스트 할 때 DB에 데이터를 전부 입력하지말고 소수의 데이터만 남겨 쿼리시간을 줄이는 방법이 있다.

2. Independent: 테스트는 독립적이어야 한다. 즉, 각 테스트끼리는 의존해서는 안된다.

만약 테스트끼리 서로 의존하고 있다면, 하나가 실패하면 다른 테스트들도 같이 실패하게 될 것이고 이는 오류를 찾기 어렵게 한다.

3. Repeatable: 테스트는 반복가능해야한다.

테스트는 어떤 환경에서도 반복 가능해야한다는 의미이다. 만약 테스트가 돌아가지 않는 환경이라는 것이 존재하면, 테스트의 실패를 모듈에서 찾는 것이 아니라 환경에서 찾게 될 수 있다. 이는 오류를 찾기 어렵게 할 것 이다.

4. Self-validaing: 테스트는 테스트 그 자체만으로 성공, 실패를 검증 가능해야한다.

테스트의 결과가 boolean(true/false)의 형태여야 한다는 뜻이다. 만약 그렇지 않아 결과를 또 다른 로그들과 비교해야한다면, 주관적인 판단이 개입할 수도 있고, 시간 또한 많이 소요된다.

5. Timely: 테스트 코드는 적시에 작성되어야 한다.

테스트 코드는 테스트하려는 기능이 구현되기 전에 작성하는 것이 좋다. 그렇지 않으면 기능 자체를 테스트가 어렵게 구현할 수도 있고, 작성자가 테스트 코드를 기능에 맞추어가며 작성해 결국 타당하지 않은 테스트 코드가 될 가능성도 있다.

이 다섯 가지 원칙을 각 원칙의 앞글자를 따 FIRST 원칙이라고 부른다.

JUnit 사용법

1. 테스트 폴더 지정

테스트할 폴더 생성 후, 우클릭 -> Open Module Settings 클릭 -> 좌측 사이드바에서 Module 클릭 -> Mark as 에서 Tests 클릭 -> 원하는 폴더 클릭 -> ok 버튼 클릭

2. 클래스 별 테스트 코드 작성

테스트 할 클래스 우클릭 -> Go To / Test 클릭 -> 테스트 코드 작성

3. 테스트 실행

테스트 코드 왼쪽 화살표에서 실행

테스트코드 옆에 실패하면 빨간색 배경에 느낌표, 성공하면 초록색 배경에 체크표시가 출력된다.

테스트코드 작성법

일반적으로 테스트코드를 작성할 때에는 give-when-then 패턴을 이용한다.

given -> 테스트를 위한 환경, 객체, 변수들 준비
when -> 테스트하고자 하는 메소드실행
then -> 검증

프리코스 1주차의 중복을 없애는 Problem2.solution 메소드를 예로 들겠다. given-when-then의 패턴을 사용한 테스트 코드는 다음과 같다.

	@Nested //테스트 클래스간의 그룹관계를 만들기 위해 사용하는 태그
    class Problem2Test {
    
        @Test //실행할 테스트 코드가 작성된 메소드를 명시하는 태그
        void case1() {
            //given
            String cryptogram = "apple";
            String expectedResult = "ale";

            //when
            String realResult = Problem2.solution(cryptogram);

            //then
            assertThat(expectedResult).isEqualTo(realResult);
        } 

사실 예시코드의 assertThat은 JUnit이 아니라 assertj에서 지원하는 기능이다.
메소드 체이닝형태로 사용하기도 간편하고 가독성도 높기 때문에 보통 이를 Junit 의 assert 대신 사용한다고 한다.

마무리

정말 간단하게 고려사항, 사용법 등에 대해 알아보았다.
JUnit의 기능이 정말 사용하기 간편하여 작성 자체는 어렵지 않았다.

다만 올바른 테스트 코드에 대해서는 확실히 더 공부가 필요할 것 같다.

profile
https://github.com/poi1649/learning

0개의 댓글