본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Effective Unit Testing] Appendix A. JUnit 기초

by 돼지왕 왕돼지 2019. 3. 20.
반응형

[Effective Unit Testing] Appendix A. JUnit 기초


@After, @after 갯수, @AfterClass, @Before, @before 갯수, @Beforeclass, @Test annotation expected, assert api, assertArrayEquals, assertEquals, assertFalse, assertNotNull, assertNotSame, assertNull, assertSame, assertThat, asserttrue, custom matcher, describeto, effective junit, effective unit test, exception assert, fail, hamcrest match, junit lifecycle, junit non public method, junit static method, junit 기초, junit 생명주기, Matches, setup, setup ingeritance, setup method, Tear Down, tear down method, teardown inheritance, test annotation, try-catch, try-catch fail, [Effective Unit Testing] Appendix A. JUnit 기초, 테스트 셋업과 티어다운



-

JUnit 을 이해하려면 두 가지를 꼭 알고 있어야 한다.

첫째는 JUnit 테스트의 구조와 생명주기다.

두번째는 단언 API 다.





A-1. 기본적인 JUnit 테스트 케이스


A.1.1. 테스트 메서드 선언하기


-

JUnit 은 public 이 아닌 메서드는 다 무시한다.

입력 인자를 받는 메서드도 모두 무시한다.

반환형이 void 가 아니어도 역시 무시한다.

static method 도 무시 대상이다.

@Test annotation 이 없으면 당연히 무시한다.

즉, 테스트 메서드는 public void 이면서 입력 인자를 받지 않는 @Test annotate 된 것이다.




A.1.2. JUnit 테스트의 생명주기


-

JUnit 은 다음의 순서대로 일을 진행한다.

1. 테스트 클래스의 인스턴스를 새로 생성한다.

2. 생성한 클래스 인스턴스가 가지고 있는 셋업 메서드를 찾아 모두 호출한다.

3. 테스트 메서드를 호출한다.

4. 클래스 인스턴스가 가지고 있는 티어다운 메서드를 찾아 모두 호출한다.


위 과정은 테스트 메서드 각각에 대해 수행한다.

상위 클래스로부터 상속받은 테스트 메서드도 예외는 아니다.

셋업이나 티어다운 메서드 역시 상위 클래스로부터 상속받은 것이 있다면 전부 실행한다.




A.1.3. 테스트 셋업과 티어다운


-

테스트 클래스에 @Before 메서드와 @After 메서드는 몇 개 있어도 상관 없다.

JUnit 은 이들 모두를 빠짐없이 호출한다.

다만, 호출 순서는 보장하지 않는다.


-

@BeforeClass 와 @AfterClass 라는 annotation 도 있다.

이는 메서드 단위가 아닌 클래스당 한 번씩 실행된다.

클래스 내의 첫 테스트 메서드가 호출되기 전 혹은 모두 테스트가 완료된 후에 딱 한 번씩만 처리할 일이 있을 때 이용한다.




A.2. JUnit 단언문


-

Junit 테스트에서 많이 쓰이는 단언문은 org.unit.Assert 클래스에 public static 메서드로 정의되어 있다.



-

다음과 같은 단언문들이 있다.

assertEquals

assertArrayEquals

assertTrue

assertFalse

assertNull

assertNotNull

assertSame

assertNotSame

assertThat




A.2.1. 예외 발생 단언하기


-

try-catch 를 통해 단언하는 방법과

@Test annotation 의 expected 속성을 주는 방법이 있다.



-

try-catch 방법을 사용할 때에는 fail() 호출을 잊지 않도록 해야 한다.




A.2.2. assertThat() 과 햄크레스트 매치


-

assertThat() 은 서드파티 라이브러리나 프로그래머가 직접 만든 Match 를 써서 기본 단언문을 확장하는 길을 열어준다.

오픈 소스 라이브러리인 팸크레스트는 테스트에 유용한 다양한 매치를 제공한다.



-

custom Matcher 를 만드는 것은 아래와 같다.

class MyPhoneNumberMatcher extends BaseMacher<String>(){
    @Override
    public boolean matches(Object candidate){
        if(!(candatate instanceof String){
            return false;
        }
        return ((String)candidate).matches(“^\\+(?:[0-9]?){*6,14}[0-9]$”);
    }

    @Override
    public void desscribeTo(Description desc){
        desc.appendText(“ITU-T E.123 compliant international phone number”);
    }
}


-

matches() 메서드는 주어진 대상 객체가 단언 내용과 같은지 확인하는 일을 한다.


describeTo() 는 이 매치가 확인하려는 내용을 알기 쉽게 설명해주는 역할이다.

JUnit assert 가 실패하면 이 메서드를 이용해 메시지를 출력한다.




반응형

댓글