JUnit이란?

jihan kong·2022년 8월 18일
1

JUnit5

목록 보기
1/25
post-thumbnail

본 시리즈는 메타 코딩님의 Junit 강의를 학습한 내용을 바탕으로 정리하였습니다.

인프런의 스프링 부트 개념정리 강의를 통해 알게 된 메타코딩...
평소에도 메타코딩님의 유튜브를 보며 학습하다 JUnit에 관한 좋은 강의가 올라와서 강의를 학습하게 되었다.
강사님과 함께 JUnit의 기본적인 내용에 대해서 프로젝트를 만들면서 배우고 더불어 JUnit과 Security 테스트를 통해 학습하면서 유닛 테스트에 대해 전반적으로 익힐 수 있게 되어 개인적으로는 아주 만족스러운 강의였다.👍👍 (역시 갓타코딩)

따라서 이번 시리즈는 JUnit에 관해 학습한 내용을 다룰 예정이다.

단위 테스트(Unit Test)?

📌 단위 테스트는 프로그램의 기본 단위인 모듈(Module) 을 테스트 하는 것이다. 구현 단계에서 각 모듈의 개발을 완료하고 명세서의 내용대로 정확히 구현되었는지를 테스트 한다.
(출처: 프로그래민님의 블로그)

예전과 달리 단위 테스트의 필요성이 부각되고 있다. 특히 고객들에게 어떠한 서비스를 제공하는 기업들이 많아진 만큼 코드의 안정성을 중시하는 것이 요즘의 추세이다. 최근 개발자들이 선망하는 서비스 기업 회사들은 거의 다 테스트 코드를 작성하는 것이 선택이 아닌 필수항목이 되었다. 즉, 테스트 코드를 잘 짜는 것이 개발자의 기본 소양으로 자리잡게 된 것이다.

😊 단위 테스트의 장점

  • 개발단계 초기에 문제를 발견할 수 있게 해준다.
  • 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있다. (ex.회귀테스트)
  • 기능에 대한 불확실성을 감소시킬 수 있다.
  • 시스템에 대한 실제 문서를 제공한다. (단위 테스트 자체가 문서로 사용될 수 있음)
    (출처 : 위키피디아)

이렇게 중요한 단위 테스트... 만약 사용하지 않고 개발을 진행한다면 어떤 문제점을 야기할까?

😥 단위 테스트를 사용하지 않는다면?

1. 번거로움

다음과 같은 방식으로 개발한다고 생각해보자.

  1. 코드를 작성
  2. 프로그램(Tomcat) 실행
  3. Postman과 같은 API 테스트 도구로 HTTP 요청
  4. 요청결과를 System.out.println() 을 통해 눈으로 확인
  5. 결과가 다르면 프로그램(Tomcat)을 중지하고 코드를 수정

이렇게 개발을 한다면 매 코드를 수정할 때마다 2번에서 5번을 반복해야한다. 테스트 코드가 없다보니 톰캣을 내렸다가 실행해서 직접 확인해야하는 것이다. 비효율적이다. 테스트 코드는 자동으로 코드를 검증함으로써 이러한 번거로움을 해결해준다.


2. 개발자가 만든 기능을 보호할 수 없다.

단위 테스트를 사용하지 않는다면 개발자가 만든 기능의 안전을 보장받을 수 없다. 무슨 이야기인가하면...

어떤 프로그램에 B 라는 기능을 추가해달라는 요청이 들어와 B 기능을 개발 후, 테스트해보았더니 잘 동작하였다. 그래서 프로그램을 재 가동했으나 기존의 잘 작동되던 A 기능에 갑자기 문제가 발생하기 시작했다.

위의 경우는 규모가 큰 서비스에서는 빈번하게 발생되는 일이다. 어디서 문제가 발생했는지 알아내기가 쉽지않고 그렇다고 모든 기능을 테스트하자니 너무 많은 리소스를 필요로 하기 때문에 모든 기능을 테스트할 수는 없는 노릇이다.

이렇게 새로운 기능이 추가될 때, 기존 기능이 잘 작동되는 것을 보장해주는 것이 테스트 코드이다. A 라는 기존 기능에 여러 경우를 모두 테스트로 구현해 놓았다면 코드를 수행만 해도 문제를 조기에 발견할 수 있다.


JUnit

Java의 단위테스트를 수행해주는 대표적인 Testing Framework로써 보통 JUnit4와 그 다음 버전인 JUnit5를 사용한다.

JUnit은 Spring 기반에서 다음과 같은 어노테이션과 메서드를 제공함으로써 테스트를 좀 더 편리하게 실행시킬 수 있도록 도와준다.

🔎 단정 메서드

  • assertArrayEquals(a, b)
    : 배열 A와 B가 일치함을 확인
  • assertEquals(a, b)
    : 객체 A와 B가 같은 값을 가지는지 확인
  • assertEquals(a, b, c)
    : 객체 A와 B가 값이 일치함을 확인( a: 예상값, b:결과값, c: 오차범위)
  • assertSame(a, b)
    : 객체 A와 B가 같은 객체임을 확인
  • assertTrue(a)
    : 조건 A가 참인지 확인
  • assertNotNull(a)
    : 객체 A가 null이 아님을 확인

🔎 기본 어노테이션

  • @Test
    : 테스트를 만드는 모듈 역할
  • @SpringBootTest
    : SpringBoot의 테스트 환경에서 의존성을 주입
  • @DisplayName
    : 테스트 클래스 또는 테스트 메서드의 사용자 정의 표시 이름을 정의
  • @ExtendWith
    : 사용자 정의 확장명을 등록하는데 사용
  • @BeforeEach
    : 각 테스트 메서드 전에 실행됨을 나타냄
  • @AfterEach
    : 각 테스트 메서드 후에 실행됨을 나타냄
  • @BeforeAll
    : 현재 클래스의 모든 테스트 메서드 전에 실행됨을 나타냄
  • @AfterAll
    : 현재 클래스의 모든 테스트 메서드 후에 실행됨을 나타냄
  • @Disable
    : 테스트 클래스 또는 메서드를 비활성화

(출처 : LDH님의 벨로그)


각 어노테이션들의 기능들은 차차 강의를 통해 더 자세히 알아보자.

profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글