본문 바로가기
Web/Spring

[JUnit4] 테스트 라이브러리 기본 사용법

by 수짱수짱 2022. 8. 5.

작성일자 2022.08.05

사용 IDE : STS4


1. JUnit Test Case 생성

JUnit Test 라이브러리가 Class Path에 추가되어있지 않아 JUnit 4 라이브러리를 추가하겠냐는 창

테스트의 클래스명 = 프로덕션 클래스 명 + Test


2. 테스트 케이스 작성하기

package calculrator;

public class Calculator {
	
	int add(int i, int j) {
		return i+j;
	}
	
	int subtract(int i, int j) {
		return i-j;
	}
	
	int multiply(int i, int j) {
		return i*j;
	}
	
	int divide(int i, int j) {
		return i/j;
	}
}

Calculator.java

 

STS, eclipse라인 삭제(Window) = Ctrl + D

 

 

package calculrator;

import static org.junit.Assert.*;

import org.junit.Test;

public class CalculatorTest {

	@Test
	public void add() {
		Calculator cal = new Calculator();
		int result = cal.add(2, 1);
		
		// 과거에는 결과값을 확인할 때 sysout을 사용해서 확인했지만
		// JUnit을 활용할 경우에는 static org.junit.Assert.*을 import 하면 assertEquals()를 이용할 수 있다.
		assertEquals(3, result); // 첫번째 인자: 기대하는 값
	}
	
	@Test
	public void divide() {
		Calculator cal = new Calculator();
		int result = cal.divide(9, 3);
		
		assertEquals(3, result); 
	}


}

CalculatorTest.java

 

static Assert 클래스를 활용하여 JUnit을 활용할 수 있다!

 

테스트마다 반복적으로  Calculator객체 를 생성할 필요는 없지 않나요?

=> Class의 멤버필드로 변경

cal 객체를 멤버필드로 변경했다.

작성한 라인을 위로 이동시키기(Window) = Alt + ↑

 

or Refactor - Convert Local Varialbe to Field

 

단, JUnit은 이렇게 멤버필드로 초기화 하는 방법을 추천하지 않는다. 

왜? 테스트가 실행이될 때 초기화 작업이 단 한 번만 실행된다. 즉 add 메소드와 divide 메소드에서 객체를 공유한다.

이렇게 되면 만약 add 소드에서 객체의 상태를 바꾸는 경우 변경된 상태의 객체가 divide 메소드에도 영향을 끼칠 수 있다.

즉, 테스트 간의 독립성을 보장하는 데에 한계가 있고 테스트의 결과를 보장할 수 없게된다.

 

 

JUnit은 @Before 어노테이션으로 초기화하는 방법을 추천한다!

@Before 어노테이션으로 멤버필드 구현

즉 @Before 어노테이션을 통해 테스트가 실행될 때 매번 테스트가 서로 영향을 끼치지 않으며 독립적으로 실행되는 것을 보장할 수 있다. 이로 인해 테스트를 안정적으로 할 수 있다.

setup 메소드는 테스트가 실행될 때 1번 호출이 아닌 각각의 테스트 메소드가 호출될 때 마다 setup 메소드가 호출됨으로 해당 객체에 대한 초기화 작업을 매번 실행한다. 

 

@After 어노테이션은 테스트 메소드가 실행될 때 마다
초기화 작업(@Before)이후 후처리 작업을 진행하는 어노테이션이다. 
=> 각 테스트 간의 독립성을 지원하도록 보장하고 있다.
package calculrator;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class CalculatorTest {

	private Calculator cal ;
	
	@Before
	public void setup() {
		cal = new Calculator();
		System.out.println("setup!");
	}
	
	@Test
	public void add() {
		int result = cal.add(2, 1);
		
		// 과거에는 결과값을 확인할 때 sysout을 사용해서 확인했지만
		// JUnit을 활용할 경우에는 static org.junit.Assert.*을 import 하면 assertEquals()를 이용할 수 있다.
		assertEquals(3, result); // 첫번째 인자: 기대하는 값
		System.out.println("add!");
	}
	
	@Test
	public void divide() {
		int result = cal.divide(9, 3);		
		assertEquals(3, result); 
		System.out.println("divide!");
	}
	
	@After
	public void teardown() {
		System.out.println("teardown!");
	}


}

CalculatorTest.java

테스트 결과

즉, @before -> @Test -> @After 이 순서가 반복됨을 알 수 있다.


3. 테스트 케이스 실행해보기 ( 윈도우 단축키: Ctrl+F11 )


4. 실행완료 화면

성공한 화면
실패한 화면 (+ 실패한 메소드 이름)

초록색이 뜨면 성공했다는 의미

빨간색이 뜨면 성공하지 못했다는 의미


@Test 어노테이션 적용 예시

@Test 어노테이션이 붙어있기 때문에 JUnit  라이브러리가 해당 메소드를 테스트로 실행할 수 있다.

 

블럭을 아래에 그대로 복사(Window) = Ctrl + Alt + ↓

개꿀팁이당.