반응형

 

1. JUnit이란?

어느 정도 개발이 진행되면 프로그램에 대한 단위 테스트는 반드시 수행해야 하는데, JUnit은 보이지 않고 숨겨진 단위 테스트를 끌어내어 정형화시켜 단위 테스트를 쉽게 해주는 테스트용 Framework다. 

 

JDK 1.4에서 추가된 assert...를 사용하여 Test를 진행 할 수있다.

JUnit은 테스트 결과를 단순한 텍스트로 남기는 것이 아니라 Test클래스로 남긴다. 

따라서 개발자에게 테스트 방법 및 클래스의 History를 넘겨줄 수도 있다.

 

 

 

 

2. JUnit이 필요한 이유

 

우리가 흔히 개발하던 방식을 생각해보자.

 

처음에 프로젝트를 시작하게 되면 우선 코드를 계속해서 만들어 나간다.

 

다양한 클래스도 만들고, 다양한 메서드도 만들며 작업을 순조롭게 진행해나가기 마련이다.

 

첫 프로젝트가 끝나갈 무렵 테스트 케이스를 왕창 만들어 스크립트로 돌린다.

 

다행이 스크립트대로 잘 돌아가서 통과했다.

 

첫번째 릴리즈를 통해 우리는 성공적으로 프로젝트를 마무리 했다.

 

 

이제 그다음 시즌을 맞아 프로젝트에 들어온 추가 안건 및 다양한 요구사항을 기존 코드에 넣어야 한다.

 

여기서부터 이제 문제가 한두개씩 나타나기 시작한다.

 

기존의 것과 새로운 것이 충돌되는 상황이 발생하게 된다.

 

하나를 수정하면 세가지 버그가 나타나기 시작한다.

 

몰랐던 버그들도 나타나기 시작하고 점점 코드를 메워가는데 급급해진다.

 

급기야 수정할 수 없는 버그라고 판명 짓기 시작한다.

 

프로젝트는 점점 쓰레기가 되어가고 겨우 완성된 코드는 스크립트가 돌리가 없다.

 

이렇듯이 코드가 거대하고 복잡해지기 전, 유닛 단위로 지속적인 테스트를 해서 작은 단위로 빠르고 안정적인 검증을 하기 위해 유닛 테스트, JUnit을 사용한다.

 

3. 특징


- 단위 테스트 Framework 중 하나
- 문자 혹은 GUI 기반으로 실행됨
- 단정문으로 테스트 케이스의 수행 결과를 판별함(assertEquals(예상 값, 실제 값))
- 어노테이션으로 간결하게 지원함
- 결과는 성공(녹색), 실패(붉은색) 중 하나로 표시

 

 

 

 

 

4. Android Studio에서 JUnit 사용 방법(기본)

 

우선 프로젝트를 하나 생성하면 프로젝트에 자동으로 1,2번 두개의 폴더도 생성된다.

 

1번 androidTest 파일 Ui 테스트를 진행하는 파일들이 있는 곳이고 

 

2번 test 파일 Unit 테스트를 진행하는 파일들이 있는 곳이다.

 

 

ExampleUnitTest를 누르면 위와 같은 그림이 나타나고

 

assertEquals가 무엇인지 보면 아래와 같다.

 

 

즉, expected와 actual이 다르면 failNotEquals라는 에러가 나타나게 된다고 되어있다.

 

그럼 expected와 actual이 같을 때, 다를 때 결과를 보자.

 

JUnit 테스트는 아래 그림과 같이 실행하면 된다.

 

 

 

 

 

아래와 같이 Calculator 클래스를 만든 후 유닛 테스트에 테스트 코드를 만들어 결과를 테스트 해 볼수도 있다.

 

 

 

 

5. 단정문

assertArrayEquals(a,b) : 배열 a와b가 일치함을 확인 
assertEquals(a,b) : 객체 a와b의 값이 같은지 확인 
assertSame(a,b) : 객체 a와b가 같은 객체임을 확인 
assertTrue(a) : a가 참인지 확인 
assertNotNull(a) : a객체가 null이 아님을 확인 


이외에도 다양한 단정문이 존재한다. 

http://junit.sourceforge.net/javadoc/org/junit/Assert.html

 

Assert (JUnit API)

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

junit.sourceforge.net

 

 

6. 어노테이션 활용하기

 


Java 언어 자체가 좀 더 넓게 확장하고 다양하게 발전할 수 있도록 도와준 어노테이션을 JUnit에서 활용할 수 있다.

(1) 테스트 메소드 지정하기

@Test가 메소드 위에 선언되면 이 메소드는 테스트 대상 메소드임을 의미한다.

    @Test 
    public void testSum() {  

    } 


(2) 테스트 메소드 수행시간 제한하기

@Test(timeout=5000)를 메소드 위에 선언합니다. 시간단위는 밀리 초 입니다. 이 테스트 메소드가 결과를 반환하는데 5,000밀리 초를 넘긴다면 이 테스트는 실패하는 것이다.

    @Test(timeout=5000) 
    public void testSum() {  

    } 


(3) 테스트 메소드 Exception 지정하기

@Test(expected=RuntimeException.class)가 메소드 위에 선언되면 이 테스트 메소드는 RuntimeException이 발생해야 테스트가 성공, 그렇지 않으면 실패하는 것이다.

    @Test(expected=RuntimeException.class) 
    public void testSum() {  

    } 


(4) 초기화 및 해제

@BeforeClass, @AfterClass가 메소드 위에 선언되면 해당 테스트 클래스에서 딱 한 번씩만 수행되도록 지정하는 어노테이션이다.

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 

    } 

    @AfterClass 
    public static void tearDownAfterClass() throws Exception { 

    } 


@Before, @After가 메소드 위에 선언되면 해당 테스트 클래스 안에 메소드들이 테스트 되기 전과 후에 각각 실행되게 지정하는 어노테이션이다.

    @Before 
    public void setUp() throws Exception { 

    } 

    @After 
    public void tearDown() throws Exception { 

    } 


아래 그림과 같이 표현할 수 있다.

 

 

 

http://nextree.co.kr/p11104/

https://black-jin0427.tistory.com/107

반응형