Skip to content

JUnit 활용 #
Find similar titles

Structured data

Category
Programming

JUnit 활용 #

JUnit assert관련 Method 표 #

Method 내용
assertArrayEquals(a,b) 객체 a와 b의 값 같은 지 확인
assertSame(a,b) 객체 a와 b가 같은 객체임을 확인
assertTrue(a) a가 참(true) 확인
assertFalse(a) a가 거짓(false) 확인
assertNotNull(a) a 객체가 Null이 상태 확인

JUnit 기능 흐름 #

  • setUp() : 테스트 대상 클래스의 실행 전에 가장 먼저 setUP()을 실행한다.
    • ex) DB 및 서버 네트워크 환경 연결 시 활용
  • tearDown() : 가장 마지막에 수행되며 setUp()의 반대 개념으로 생각하면 된다.
    • ex) DB 및 서버 네트워크 환경 연결 종료 시 활용
  • 각 테스트 코드 실행 시 setUp , tearDown 반복 실행한다.

JUnit 지원 어노테이션(Annotation) #

어노테이션 내용
@Test @Test가 선언된 메서드는 테스트를 수행하는 메소드
@Ignore @Ignore가 선언된 메서드는 테스트를 실행 되지 않음
@Before @Test 메소드에서 공통으로 사용하는 코드를 @Before 메소드에 선언하여 사용
@After @Test 메소드 사용후 자원을 해제할 때 사용
@BeforeClass @Test 메소드 보다 먼저 한번만 수행되어야 할 경우에 사용
@AfterClass @Test 메소드 보다 나중에 한번만 수행되어야 할 경우에 사용

Image

그림1 JUnit Flow 예시 (출처: (https://nesoy.github.io/articles/2017-02/JUnit))

Junit Rules의 활용 #

  • Junit Rules은 테스트 코드 작성 시 단위테스트를 위한 사전 작업으로 Junit에서 제공하는 Rules를 통해 간단하게 활용할 수 있도록 제정 의가 용의 하다.

The Temporary Folder Rule #

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

    public class LoadDynamicPropertiesTest {

    // 임시 폴더를 생성한다. 
    @Rule
    public TemporaryFolder folder = new TemporaryFolder();

    private File properties;

    // 테스트 수행 전 test 데이터를 준비한다. 
    @Before 
    public void createTestData() throws IOException {
        properties = folder.newFile("messages.properties");
        BufferedWriter out = new BufferedWriter(new FileWriter(properties));
        // Set up the temporary file
        out.close();
    }

    // 테스트에서 해당 임시 폴더를 사용한다. 
    @Test
    public void shouldLoadFromPropertiesFile() throws IOException {
        System.out.println(properties.getAbsolutePath());
    }
}
  • 테스트 전 임시 폴더를 생성하여 테스트 동안의 파일들을 사용한다. (더미 파일 방지)
  • 테스트 후 임시 폴더를 삭제 해야 한다.

The ErrorController Rule #

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
import static org.hamcrest.core.StringContains.*;
import static org.hamcrest.CoreMatchers.not;

public class ErrorCollectorTest {
   @Rule
   public ErrorCollector collector = new ErrorCollector();

    @Test
    public void testSomething() {
       String result = doStuff();
       collector.addError(new Throwable("첫번째 코드의 타입이 다릅니다."));
       collector.addError(new Throwable("두번째 코드의 타입이 다릅니다."));
       collector.checkThat(result, not(containsString("재시작 하지 않습니다.")));

    }

    private String doStuff() {
           return "재시작 하지 않습니다.";
    } 
}
  • 테스트 중의 발생 에러를 로그로 볼 수 있도록 에러로그 결과 리스트를 만들어준다.
  • 테스트 중 에러 발생 시 실행 중단하지 않는다.

The TimeOut Rule #

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;

public class TaxCalculatorDataTest {
     @Rule
     public Timeout globalTimeout = new Timeout(1000);

     @Test
    public void testSomething() {
          System.out.println("테스트1");
    }


}
  • testSomething () 기능의 Timeout(1000)을 주어 1000ms 시간 안에 테스트 코드가 실행 완료되지 않으면 오류로 간주한다.

The Verifier Rule #

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.util.ArrayList;
import java.util.List;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Verifier;

public class VerifierTest {

    private List<String> systemErrorMessages = new ArrayList<String>();
    @Rule
    public Verifier verifier = new Verifier(){
        @Override
        protected void verify() throws Throwable {
            assertThat(systemErrorMessages.size(), is(0));
        }
    };

    @Test
    public void testSomething() {
        // ...
        systemErrorMessages.add("Test Error 규칙");
    }
}
  • 각 코드마다 정해진 조건(룰)을 주어 정해진 조건이 들어오지 않을 시 오류로 간주한다.

The ExternalResource Rule #

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExternalResource;

public static class UsesExternalResource {
  Server myServer = new Server();

  @Rule
  public ExternalResource resource = new ExternalResource() {
    @Override
    protected void before() throws Throwable {
      myServer.connect();
    };

    @Override
    protected void after() {
      myServer.disconnect();
    };
  };

  @Test
  public void testFoo() {
    new Client().run(myServer);
  }
}
  • 외부 자원(파일, 소켓, DB커넥션 등) 관리에 쓰이며 @Before, @After과 별 차이가 없으나, 특정 자원이 다른 테스트에서 재사용성이 요구될 경우 유용하다.

관련 페이지 #

spring/Spring Test,JUnit

Suggested Pages #

0.0.1_20140628_0