본문 바로가기

Java&JSP&Spring/Java

[Java/JUnit4]#2 이클립스에서 JUnit 4 활용하기

[Java/JUnit4]#2 이클립스에서 JUnit 4 활용하기

안녕하세요 미나라이입니다.

 

이번 포스팅에서는 JUnit4의 다양한 기능에 대해 활용해 보려고 합니다.

프로젝트 환경

OS : Windows 10

IDE : Eclipse 2021-12 (4.22.0)

JDK : 16.0.2

JRE : JavaSE-14

JUnit : 4.13.2

@Test

테스트 대상 메소드를 지정합니다.

해당 어노테이션이 붙어있는 메소드는 JUnit테스트 대상이 됩니다.

import static org.junit.Assert.assertEquals;
import org.junit.Test;

@Test
public void sumTest() {
    System.out.println("> Sum Test");
    assertEquals(9, obj1.sum(4,5));
}

@Before , @After

테스트 시작 전에 한번씩 실행되는 어노테이션으로

클래스 내부에 @Test어노테이션이 존재하면 그 개수만큼 반복합니다.

public static Calculator obj1 = new Calculator();

@Before
public void setup() {
    System.out.println("Instance Setup");
    obj1 = new Calculator();
}

@Test
public void sumTest() {
    System.out.println("> Sum Test");
    assertEquals(9, obj1.sum(4,5));
}

@Test
public void subTest() {
    System.out.println("> Sub Test");
    assertEquals(1, obj1.sub(5,4));
}

@After
public void dispose() {
    obj1 = null;
    System.out.println("Instance Dispose");
}

콘솔 출력 결과

Instance Setup
> Sum Test
Instance Dispose
Instance Setup
> Sub Test
Instance Dispose

@BeforeClass, @AfterClass

테스트 클래스 내부에서 딱 한 번씩만 도는 어노테이션입니다.

public static Calculator obj1 = new Calculator();

@BeforeClass
    public static void start() {
    System.out.println("=== Calc Test Start ===");
}

@Before
public void setup() {
    System.out.println("Instance Setup");
    obj1 = new Calculator();
}

@Test
public void sumTest() {
    System.out.println("> Sum Test");
    assertEquals(9, obj1.sum(4,5));
}

@Test
public void subTest() {
    System.out.println("> Sub Test");
    assertEquals(1, obj1.sub(5,4));
}

@After
public void dispose() {
    obj1 = null;
    System.out.println("Instance Dispose");
}

@AfterClass
public static void end() {
    System.out.println("=== Calc Test End ===");
}

콘솔 출력 결과

=== Calc Test Start ===
Instance Setup
> Sum Test
Instance Dispose
Instance Setup
> Sub Test
Instance Dispose
=== Calc Test End ===

Exception결과 예상 테스트(expected)

테스트를 하다보면 에러 결과를 예상해야 하는 경우가 있습니다.

이럴 때 예상되는 에러를 리턴 해 주는 로직을 짤 수 있습니다.

샘플 소스는 나눗셈 로직에서 인자를 0으로 주었을 때 에러가 나는 것을 예상 한 테스트입니다.

@Test(expected = ArithmeticException.class)
    public void divExceptionTest() throws ArithmeticException {
    System.out.println("> Div Exception  Test");
    
    assertEquals(5.0, obj1.div(5,0), 0);
    // 에러가 나면 테스트 결과가 정상
}

처리 시간 테스트(timeout)

최적화 작업을 하면서 처리 시간이나 이런 부분에 대한 테스틀 진행하는 경우가 있습니다.

이럴 때는 타임아웃 기능을 추가해서 해당 타임(밀리초)이 지나면 테스트 실패를 반환시킬 수 있는 기능이 있습니다.

	@Test(timeout = 100)
	public void subTest() {
		System.out.println("> Sub Test");
		assertEquals(1, obj1.sub(5,4));
        // 100밀리초가 지나도록 처리가 안 끝나면 테스트 실패
	}

여러 클래스를 한꺼번에 테스트 하기(@SuiteClasses)

단위 테스트를 클래스 단위로 할 때 한꺼번에 진행하는 방법입니다.

일괄 테스트를 위해 AllTests.java를 새로 작성합니다.

※ 이클립스에서 새로 만들기 JUnit Test Suite로 작성해도 됩니다.

ClacTest , TextTest , ArrayTest 테스트를 한 번에 진행하기 위해서 SuiteClasses로 묶었습니다.

package com.test;

import org.junit.experimental.categories.Categories;
import org.junit.runner.RunWith;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({ CalcTest.class, 
                TextTest.class, 
                ArrayTest.class })
public class AllTests {
}

콘솔 출력 결과

=== Calc Test Start ===
Instance Setup
> Sub Test
Instance Dispose
Instance Setup
> Sum Test
Instance Dispose
Instance Setup
> Mul Test
Instance Dispose
Instance Setup
> Div Exception  Test
Instance Dispose
Instance Setup
> Div Test
Instance Dispose
=== Calc Test End ===
=== Text Test Start ===
Instance Setup
> String StartsWith
Instance Dispose
Instance Setup
> String EndsWith
Instance Dispose
Instance Setup
> Object Compare
Instance Dispose
Instance Setup
> String EndsWith Throws
Instance Dispose
Instance Setup
> String Compare
Instance Dispose
=== Text Test End ===
=== Array Test Start ===
Instance Setup
> IntArr Compare
Instance Dispose
Instance Setup
> StrArr Compare
Instance Dispose
=== Array Test End ===

 

테스트 결과

원하는 부분만 테스트 하기(@IncludeCategory, @Category)

테스트를 하다 보면 필요한 부분만 빼서 하고 싶을 때가 있습니다.

이럴 때는 @Category 기능을 이용해서 테스트를 진행할 수 있습니다.

 

먼저 개별 처리용 인터페이스 파일을 하나 작성합니다.

IncludeTests.java

package com.test;
public interface IncludeTests {}

CalcTest.java

이제 테스트하고 싶은 항목만 카테고리로 선택을 합니다.

// 개별처리용 인터페이스를 구현 처리
@Category(IncludeTests.class)
@Test
public void sumTest() {
    System.out.println("> Sum Test");
    assertEquals(9, obj1.sum(4,5));
}

AllTests.java

IncludeTests항목 카테고리로 지정 한 부분만 테스트를 진행하도록 어노테이션을 설정합니다.

package com.test;

import org.junit.experimental.categories.Categories;
import org.junit.experimental.categories.Categories.*;
import org.junit.runner.RunWith;
import org.junit.runners.Suite.SuiteClasses;

// 카테고리로 선택 한 부분만 출력 한다고 정의
@RunWith(Categories.class)
@SuiteClasses({ CalcTest.class, 
				TextTest.class, 
				ArrayTest.class })
// 아래 인터페이스에 구현 한 테스트 항목만 실행
@IncludeCategory(IncludeTests.class)
public class AllTests {
}

콘솔 출력 결과

=== Calc Test Start ===
Instance Setup
> Sum Test
Instance Dispose
=== Calc Test End ===

 

테스트 결과

Category에서 지정한 항목만 출력되는 것을 확인할 수 있습니다.

 

원하는 부분만 테스트 안 하기(@ExcludeCategory, @Category)

 IncludeCategory와는 반대로 해당 카테고리로 지정한 항목만 테스트를 스킵하는 기능입니다.

사용법은 IncludeCategory랑 동일하니 스킵하도록 하겠습니다.

 

그 외 기본적인 assertEquals의 사용법이 있는데 이 부분은 샘플 소스에 올려놓도록 하겠습니다.

 

샘플 소스 첨부합니다.

Junit4_Test.zip
0.01MB

 

자세한 내용은 API페이지를 참고 해 주세요

참고 링크

 

Overview (JUnit API)

org.junit.runner Provides classes used to describe, collect, run and analyze multiple tests.

junit.org

 

이상으로 간단한 JUnit 4 활용법에 대해서 포스팅해 보았습니다.

다음엔 JUnit 5에 대해서 간단하게 살펴보도록 하겠습니다.

728x90
반응형