본문 바로가기

기타

JUnit - 1

728x90

1.  유닛 테스트의 필요성

 

-  유닛 테스트는 모듈이나 어플리케이션 안에 있는 개별적인 코드 단위(메소드 단위)가 예상대로 작동하는지 확인하는 것

 

 

  위와 같이 컨트롤러 코드를 작성하고 이 코드가 잘 동작하는지 테스트한다고 생각해보자. 우리는 Swagger나 PostMan 같은 툴을 이용해보기도 하고 중간중간 로그를 찍어보는 등 각자의 방법으로 테스트 해봤을 것이다. 하지만 이렇게 테스트 단위가 커지고 모호하게 되면, 버그가 어디에서 발생했는지 찾기 힘들뿐만 아니라 중간에 코드가 수정되기라도 하면 어느 부분을 다시 테스트 해야되는지 조차 불분명해진다. 심지어, 테스트용으로 썼던 데이터들이 DB에 무분별하게 삽입되고 수정되어 기존 배포된 것과 섞이게 된다는 단점 또한 가지고 있다.

 

2. JUnit 

다음은 자바 개발자들의 현황이다.

 

https://www.jetbrains.com/ko-kr/lp/devecosystem-2019/java/

 

 

Java 2019 - 2019년도 개발자 에코시스템의 현황 인포그래픽

약 7,000명의 개발자가 최신 기술, 프로그래밍 언어, 프레임워크 및 소프트웨어 개발 시 선택하는 도구에 관하여 자신의 견해를 공유해 주셨습니다.

www.jetbrains.com

 

- 많은 개발자들이 단위 테스트를 프로젝트에 포함하고 있고, 특히 자바에서는 Junit을 사용하고 있다는 것을 알 수 있다.

- Junit 은 자바 애플리케이션에서 단위 테스트 작성을 위한 프레임워크로 Junit 4 까지는 단일 jar 파일로만 사용되었다면  스프링부트 2.2버전에서 지원하는 Junit 5부터는 Junit Vintage, Junit Jupiter, Junit Platform 등 여러개의 모듈로 나누어져있다. 

 

- Junit Vintage : 기존 Junit 3,4 를 지원하는 TestEngine 구현체를 제공한다.

- Junit Jupiter : Junit 5 기반의 테스트 프로그래밍을 위한 TestEngine 구현체를 제공한다.

- Junit Platform : JVM 기반 테스팅 프레임워크를 실행하기 위한 기반 모듈로 TestEngine 인터페이스를 정의하고 TestEngine을 이용하여 테스트를 실행하고 결과를 보고한다.

 

Junit5을 사용하기 위해선 JAVA 8 , 스프링 부트 2.2 이상의 버전이 필요하다.

Spring-boot-starter-test 를 이용하여 포함 시켜주거나 다음과 같이 의존성을 추가해주면 된다.

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>

 

만약 Junit 4로 작성된 테스트코드를 Junit 5 환경에서 실행해주고 싶다면 

<exclusion> 으로 감싸져있는 부분을 제외하면 된다.

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

 

 

4. Junit 테스트 클래스 및 라이프 사이클

 

테스트클래스를 만드는 것은 매우 간단하다. STS 기준으로 우클릭 후 New -> New Junit Test Case를 누르면

src/test 위치에 그 클래스와 동일한 경로에 "Test"가 접미사로 붙는 클래스가 생긴다.

 

- 테스트 클래스는 적어도 하나 이상의 테스트 메소드를 가지고 있어야 하며 각 테스트 메소드는 @Test 어노테이션을 붙여야 한다. 만약에 어느 테스트 메소드를 Deprecated 시키고 싶다면 @Disabled 어노테이션을 붙이면 그 테스트 코드는 실행되지 않는다.

 

 

테스트 라이프 사이클

 

- @BeforeAll , @AfterAll

모든 테스트 코드 가 실행되기 전, 실행된 후 에 실행되는 메소드이다.(둘다 static void 로 선언해야한다.)

 

- @BeforeEach, @AfterEach

각각의 테스트 코드 가 실행되기 전, 실행된 후 에 실행되는 메소드이다.(void 로 선언해야한다 . static X)

 

- @Disabled

해당 메소드를 테스트에서 제외시킨다.

 

코드를 보면 더 이해가 될 것이다.

 

package com.example.demo.dto;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

class StudyTest {

	@Test
	void test() {
		System.out.println("----------test 1 ----------");
	}

	@Test
	void test2() {
		System.out.println("----------test 2 ----------");
	}
	
	
	@Test
	@Disabled
	void test3() {
		System.out.println("----------test 2 ----------");
	}
	
	@BeforeAll
	static void beforeAll(){
		System.out.println("----------- Before All------------");
	}
	
	@AfterAll
	static void AfterAll(){
		System.out.println("----------- After All------------");
	}
	
	@BeforeEach
	void beforeEach(){
		System.out.println("----------- Before Each------------");
	}
	
	@AfterEach
	void AfterEach(){
		System.out.println("----------- After Each------------");
	}
	
	
	
	
}

 

테스트 메소드 이름

 

@Displayname

JTest에 보여지는 메소드 이름을 지정한다. (@DisplaynameGeneration 보다 우선순위상 위에 있다.)

 

@DisplaynameGeneration

메소드 표시 정책을 지정한다. (DisplayNameGenerator.class)

 

다음에는 실전에서 사용하는 법에서 포스트해보겠다.

'기타' 카테고리의 다른 글

MSA 하는데까지 만들어보기 - (1)  (0) 2020.09.23
MySQL AUTO_INCREMENT의 문제점  (0) 2020.09.03