JUnit을 이용한 단위 테스트(Unit Test)

권하준·2024년 5월 1일
1

Spring Boot

목록 보기
8/14
post-thumbnail

이미지 출처


단위 테스트(Unit Test)란?

  • 단위 테스트: 작고 격리된 애플리케이션 코드 블록(일반적으로 함수 또는 메서드)의 정확성을 확인하는 코드 블록 [출처]

  • 즉, 코드의 최소 기능 단위(보통은 메소드 단위)로 테스트를 진행하는 코드

  • 최근에 TDD(Test-Driven Development, 테스트 주도 개발) 을 많이 사용함에 따라, 테스트의 중요성이 증가함

  • 단위 테스트 이외의 테스트 방식에는 통합 테스트(Integration Test), 기능 테스트(Functional Test) 등이 있다.


단위 테스트 장점

  • 새로운 기능 추가시 빠르게 테스트 할 수 있다.

  • 수시로, 반복적으로, 빠르게 테스트 할 수 있다.

  • 프로그램에 문제 발생시, 문제가 발생한 부분을 빠르게 알 수 있다.

  • 테스트 코드가 문서가 될 수 있다.

    • 테스트 코드만으로, 해당 메소드의 기능을 파악할 수 있다.
  • 코드 리펙토링이 용이해진다.

    • 코드를 수정해도, 단위 테스트를 통해 수정된 코드를 신뢰할 수 있다.

단위 테스트 작성법

  • 하나의 Test Method에 최소한의 기능만 검증하기

  • 외부 라이브러리 등의 사용을 최소화 하기

  • FIRST 규칙 따르기

    • Fast: 테스트는 빠르게 돌릴 수 있으며, 자주 실행될 수 있어야 한다.
    • Independent: 각각의 테스트는 독립적 이어야하고, 서로 의존해서는 안된다.
    • Repeatable: 테스트는 어떤 환경에서도 반복 가능해야 한다.
    • Self-Validating: 테스트는 true/false 등의 형태로, 테스트 자체적으로 검증 할 수 있어야 한다.
    • Timely: 테스트는 실제 코드 구현 전에 구현되어야 한다.

JUnit 이란?

  • 자바의 단위 테스트를 지원해주는 Framework
  • 현재는 JUnit5를 가장 많이 사용한다.
  • Spring Boot사용시, 자동으로 라이브러리에 포함되어있다.

JUnit 사용법

  • Assertions

    • JUnit에서는 Assert구문을 사용하여 코드 수행 결과를 판단한다. 아래는 자주 사용하는 메소드 구문이다.

    • Assertions.assertEquals(expect, actual)
      actual의 이 expect와 같은지 판별

    • Assertions.assertSame(expect, actual)
      actual의 객체가 expect와 동일한 객체인지 판별

    • Assertions.assertNotNull(Object obj)
      obj의 값이 null이 아닌지 판별

    • Assertions.assertTrue(boolean)
      bool의 값이 true인지 판별

    • 이 외의 다양한 구문은 공식문서를 참고

  • Anotation

    • JUnit에서는 다양한 Anotation을 지원하여, 간단하게 사용 가능하다. 아래는 자주 쓰는 Anotation이다.
    • @Test
      작성하려는 테스트 코드에 붙이면, JUnit Unit Test로 인식한다.
    • @BeforeEach, @AfterEach
      해당 아노테이션을 붙인 테스트 메소드는, 모든 각각의 메소드들의 실행 전 또는 실행 후매번 실행된다. 주로 각 단위 테스트 후, 상태를 초기화 하는데 사용한다.
    • @BeforeAll, @AfterAll
      해당 아노테이션을 붙인 테스트 메소드는, 모든 메소드들이 실행 되거나 실행 되기 전에 한번만 실행된다
    • 그 외에 다양한 아노테이션은 공식문서를 참고

JUnit 사용 예제

package com.watch_collector.hajun.repository;

import com.watch_collector.hajun.domain.User;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.List;

public class UserRepositoryTest {

    // MemoryUserRepository
    UserRepository repository = new MemoryUserRepository();

    @AfterEach
    public void 레포초기화(){
        repository.removeAllUser();
    }

    @Test
    public void 회원추가(){
        // Given
        User user = new User("new_id", "1234");

        // When
        repository.addUser(user);

        // Then
        Assertions.assertEquals(user, repository.findById("new_id").get());

    }

    @Test
    public void 회원삭제_id(){
        // Given
        String id = "new_id";
        User user = new User(id, "1234");
        repository.addUser(user);

        // When
        User deleted = repository.deleteById(id).get();

        // Then
        Assertions.assertEquals(user, deleted);
        Assertions.assertS
    }

    @Test
    public void 회원검색_id(){
        // Given
        String id = "new_id";
        User user = new User(id, "1234");
        repository.addUser(user);

        // When
        User searched = repository.findById(id).get();

        // Then
        Assertions.assertEquals(user, searched);
    }

    @Test
    public void 회원목록조회(){
        // Given
        User user1 = new User("user1", "123");
        User user2 = new User("user2", "456");
        User user3 = new User("user3", "789");
        repository.addUser(user1);
        repository.addUser(user2);
        repository.addUser(user3);

        // When
        List<User> list = repository.findAll();

        // Then
        Assertions.assertEquals(3, list.size());
    }
}
profile
자바 BE 개발자 지망생입니다.

0개의 댓글