이전 시간에는 테스팅이 무엇인지 알아보았습니다. 이번 시간에는 Java 애플리케이션을 테스트할 때 자주 사용하는 JUnit 에 대해서 알아보도록 하겠습니다.
- JUnit 의 개념에 대해 이해합니다. - JUnit 을 이용해 간단한 테스트를 수행할 수 있습니다.
JUnit 이란?
프로그래밍 언어마다 테스트를 위한 프레임워크가 존재합니다. 이러한 도구들을 보통 xUnit 이라고 말합니다. 자바 언어의 경우는 JUnit 이라고 말합니다. 자바언어의 경우에는 JUnit 이라고 말합니다.
JUnit 과 같은 테스트 프레임워크를 사용하는 이유는 무엇일까요? 그 이유는 '단위 테스트'와 관련이 있습니다. 프로그램을 완성시킨 다음에 실행을 시켜서 테스트를 진행하면 오류가 발생했을 때 어느 지점에서 에러가 발생했는지 파악하기 어려울 뿐만 아니라 사전에 미리 에러를 방지하기에도 어려움이 따릅니다. 이에 반해 JUnit 과 같은 테스트 프레임워크를 사용하여 테스트를 진행하면 단위 테스트를 진행할 수 있으므로 에러를 중간 중간 확인하면서 훨씬 효율적으로 프로그램의 신뢰도를 향상시켜나갈 수 있습니다.
JUnit 사용하기
JUnit 을 사용하려면 JUnit 라이브러리가 Classpath 에 존재해야 합니다. 라이브러리를 다운로드 받을 때 직접 받기 귀찮아서 사용하는 도구가 Gradle 과 Maven 이었죠. Maven 을 이용할 경우 pom.xml 에 다음 코드를 추가합니다.
package org.edwith.webbe.calculatorcli;
public class CalculatorService {
public int plus(int value1, int value2) {
return value1 + value2;
}
public int minus(int value1, int value2) {
return value1 - value2;
}
public int multiple(int value1, int value2) {
return value1 * value2;
}
public int divide(int value1, int value2) throws ArithmeticException {
return value1 / value2;
}
}
package org.edwith.webbe.calculatorcli;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class CalculatorServiceTest {
CalculatorService calculatorService;
@Before
public void init(){
this.calculatorService = new CalculatorService();
}
@Test
public void plus() throws Exception{
// given
int value1 = 10;
int value2 = 5;
// when
int result = calculatorService.plus(value1, value2);
// then
Assert.assertEquals(15, result); // 결과와 15가 같을 경우에만 성공
}
@Test
public void divide() throws Exception{
// given
int value1 = 10;
int value2 = 5;
// when
int result = calculatorService. divide (value1, value2);
// then
Assert.assertEquals(2,result); // 결과와 2가 같을 경우에만 성공
}
@Test
public void divideExceptionTest() throws Exception{
// given
int value1 = 10;
int value2 = 0;
try {
calculatorService.divide(value1, value2);
}catch (ArithmeticException ae){
Assert.assertTrue(true); // 이부분이 실행되었다면 성공
return; // 메소드를 더이상 실행하지 않는다.
}
Assert.assertFail(); // 이부분이 실행되면 무조건 실패다.
}
}
테스트를 진행할 대상 클래스와 테스트 클래스를 구현합니다. 코드를 살펴보면 @Before, @Test 와 같은 어노테이션들이 있는 것을 확인할 수 있는데요.
JUnit 을 이용하는 테스트 클래스는 위과 같은 어노테이션들이 사용됩니다. @BeforClass 어노테이션은 테스트 클래스가 실행되기 전에 딱 한번 실행됩니다. @AfterClass 어노테이션은 테스트 클래스의 모든 테스트 메소드가 실행이 끝나고 딱 한번 실행됩니다. @Before 어노테이션은 테스트 메소드가 실행되기 전에 실행됩니다. 이 어노테이션은 테스트 메서드가 5개 있는 테스트 클래스가 실행된다면 5번 실행됩니다. @After 어노테이션은 테스트 메소드가 실행된 후에 실행됩니다. 이 어노테이션은 테스트 메서드가 5개 있는 테스트 클래스가 실행된다면 5번 실행됩니다. @Test 이 어노테이션이 붙은 메소드가 테스트 메소드입니다.
JUnit 테스트 어노테이션이 실행되는 구조를 그림으로 나타내면 위와 같습니다. JUnit 테스트 클래스 실행은 이클립스를 사용할 경우 내장된 JUnit 에 의해 실행됩니다. 쉽게 생각하면 JUnit 에 @Test 가 붙은 메서드를 실행하는 main(String[] args) 메서드가 있다고 생각하면 좋을 것 같습니다.
JUnit 실습 : 실행 단계
테스트 메소드를 실행하는 방법은 Maven 을 이용하거나 IDE 가 제공하는 기능을 이용하면 되는데요. 마우스 우클릭 후 Run As -> Junit Test 를 실행하면 됩니다.
JUnit 탭을 보면 테스트의 진행상황을 확인할 수 있습니다. @Test 어노테이션이 붙어 있는 3가지 메서드가 실행된 것을 확인할 수 있습니다. Runs 부분에 3/3 이 의미하는 것은 3개의 @Test 메서드를 실행하여 모두 성공적으로 실행했다는 것을 의미합니다. 이때 성공했다는 의미는 첫째, Exception 이 발생하지 않고 테스트 메서드가 잘 실행되었다는 것을 의미합니다. 둘째, Assert.assert000( ) 메서드가 문제 없이 실행되었다는 것을 의미합니다.
assert method (단정 메서드) 란?
테스트 메서드를 실제로 동작시키는 것은 데이터베이스의 변화를 실제로 가져오게 되는데요. Assert 메서드를 사용하면 실제 데이터에 영향을 배제한 채 테스트를 진행할 수 있는 장점이 있습니다. 테스트 메소드를 만들 때는 이런 장점을 취하기 위해 assert 메소드(단정 메서드)를 이용해 값을 체크하는 방법을 주로 사용합니다.
Assert 메소드의 종류는 위와 같은 것들이 있습니다. Assert 메서드들은 실행 결과로 boolean 결과값을 반환합니다. assert 메서드를 사용할 때는 출력 결과를 예상해서 인자를 넣어줘야하기 때문에 기존의 테스트 방식보다는 조금 더 까다로운데요. 앞서 말했다 싶이 데이터를 보호할 수 있다는 장점 때문에 그럼에도 불구하고 사용합니다.