Java&Web

[JUnit] JUnit이란

프로그래민 2020. 12. 18. 17:36
반응형

단위 테스트란?

단위 테스트(Unit Test)는 프로그램의 기본 단위인 모듈(Module)을 테스트하는 것이다. 구현 단계에서 각 모듈의 개발을 완료한 후 명세서의 내용대로 정확히 구현되었는지를 테스트하는 것이다. 테스트가 가능한 최소 단위로 나눠서 테스트를 수행하며 개발 수명주기(Development LifeCycle)의 정황과 시스템에 의존적이면서도 시스템의 다른 부분에서 격리하여 독립적으로 수행해야 하는 테스트이다. 단위테스트를 하기 위해서는 가짜 프로그램, 객체(Mock Object)를 만들어서 활용할 수 있으며, 정교하게 테스트 하기 위해서는 테스트 케이스(Test Case) 작성은 필수라 할 수 있다.

종류 : JUnit(Java), DBUnit(DB), CppUnit(C++), NUnit(.net), PyUnit(Python)

단위테스트의 장점

  • 개발단계 초기에 문제를 발결할 수 있게 도와줌
  • 리팩토링 또는 라이브러리 업그레이드 등에서 기능 확인을 도와줌(회귀 테스트)
  • 기능에 대한 불확실성 감소
  • 시스템에 대한 실제 문서 또는 예제로써 사용가능
  • 빠른 피드백과 기능을 안전하게 보호 가능

단위테스트 수행 기법 비교

  Black Box(통합 단위 테스트) White Box(기능 단위 테스트)
정의 사용자 관점 IO 테스트 개발자 관점 Logic 테스트
장점 테스트용이 오류에 빠른 피드백
단점 내부 연관도 파악 곤란 누락된 Logic 찾기 곤란
종류 동등분할, 경계 값, 원인결과 구조, 루프 테스트

 

JUnit이란?

Java의 단위테스트를 수행해주는 대표적인 Testing Framework로써 JUnit4와 그 다음 버전인 JUnit5를 대게 사용한다. JUnit5는 다음과 같은 구조를 가지고 있다.

JUnit5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

  • JUnit Platform : 테스트를 발견하고 테스트 계획을 생성하는 TestEngine 인터페이스를 가지고 있음. Platform은 TestEngine을 통해서 테스트를 발견하고 실행하고 결과를 보고.
  • JUnit Juptier : TestEngine의 실제 구현체는 별도 모듈인데 그중 하나. JUnit5에 새롭게 추가된 Jupiter API를 사용하여 테스트 코드를 발견하고 실행.
  • JUnit Vintage : 기존에 JUnit4 버전으로 작성한 테스트 코드를 실행할때 vintage-engine 모듈을 사용.

 

나는 IntelliJ + SpriongBoot 2.3.7기반으로 spring-boot-starter-test를 사용하여 JUnit5 환경을 구성하여 보았다.

spring-boot-starter-test는 다음 라이브러리들을 포함하고 있다.

  • JUnit5 + JUnit4의 호환성을 위한 vintage-engine
  • Spring test & SpringBoot Test
  • AssertJ : Assertion을 제공하며 체이닝 메소드를 제공하는 라이브러리. 대표적으로 assertThat과 같은 메소드를 사용하여 테스트
  • Hamcrest : Java Matcher 라이브러리. 대표적으로 assertThat과 같은 메소드를 사용하여 테스트
  • Mockito : 가짜 객체인 Mock을 사용하게 해주는 Java 프레임워크
  • JSONassert : JSON 용 Assertion Java 라이브러리
  • JsonPath : JSON 용 XPath

 

JUnit5 간단한 실습 예제

 

위와 같은 RestController의 API를 테스트 하기 위해 JUnit5를 사용하여 아래와 같은 테스트 코드를 작성해보았다.

API를 호출하여 테스트하기 위해 Mockito의 mock을 이용하여 환경을 구성 후 기능단위 테스트를 실행해보았다. 원했던 200의 상태코드와 "Hello World"를 얻은 것을 잘 확인할 수 있었다. 위의 코드상에서 사용한 어노테이션과 JUnit에서 사용하는 어노테이션은 다음과 같은 것들이 있다. (JUnit5기준)

  • @ExtendWtih(SpringExtenstion.class) : JUnit4의 @RunWith(SpringRunner.class) 와 같은 어노테이션으로 JUnit5부터 사용.
  • @SpringBootTest : SpringBoot의 테스트 환경에서 의존성을 주입해주는 중요한 어노테이션으로써 위 코드는 Mock의 의존성을 주입해 주었음. classes라는 parameter를 통해 Bean을 주입할 수 있음.
  • @Test : 해당 메소드가 Test대상임을 알려줌.
  • @BeforeAll : 해당 클래스의 모든 Test가 수행되기 전에 딱 한번 호출됨. static 메소드의 형태. 보통 설정등에 활용. 
  • @AfterAll : 해당 클래스의 모든 Test가 수행된 후에 딱 한번 호출됨. static 메소드의 형태.
  • @BeforeEach : 각 Test가 수행되기 전에 매번 호출됨. 로깅등에 활용.
  • @AfterEach : 각 Test가 수행된 후에 매번 호출됨.

위의 mock을 사용한 단위 테스트 말고도 Bean을 주입하여 service 및 respository를 assert함수들을 이용하여 테스트하는 것이 일반적이다.

 

단위테스트 관련 참고할만한 글

TDD와 BDD : marrrang.tistory.com/25
Given When Then 패턴 : brunch.co.kr/@springboot/292

 

출처
brunch.co.kr/@springboot/207
nesoy.github.io/articles/2017-02/JUnit
goddaehee.tistory.com/210
needjarvis.tistory.com/442
sabarada.tistory.com/68
반응형