본문 바로가기
👩‍💻TIL/JAVA

[JUnit] JUnit을 이용한 단위 테스트하기+단정(assert)메소드 정리

by devuna 2020. 3. 27.
728x90

[JUnit] JUnit을 이용한 단위 테스트하기+단정(assert)메소드 정리

단위테스트의 중요성을 알고 있었지만, 여러가지 이유(핑계)로 사용하지 않고 있었습니다.

그러던 중 얼마전부터 jUnit을 이용한 단위테스트 방식의 개발을 시작하게 되어 

저와 같이 테스트코드를 처음 짜보는 분들을 위해 관련 내용을 정리해보고자 합니다. 

1.  JUnit이란?

💡 자바용 단위테스트(Unit Test) 도구 입니다. 

2. 단위테스트(Unit Test)란?

- 소스코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차입니다.

- 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말합니다.

(단위테스트를 사용하면 System.out으로 하는 번거로운 디버깅이 필요없습니다.)

3. jUnit 특징

- @Test 메서드가 호출할 때 마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지게 합니다.

- 단정(assert) 메서드로 테스트 케이스의 수행 결과를 판별할 수 있습다. (단정메소드는 아래에 정리)

- jUnit4부터는 어노테이션으로 간결하게 테스트를 지원합니다.(@Test @Before @After)

- 결과는 성공(녹색), 실패(붉은색) 중 하나로 표시됩니다.

테스트 결과를 확인하는 것 이외 최적화된 코드를 유추해내는 기능도 제공합니다.

4. jUnit 라이브러리 추가방법

   1) 프로젝트의 우클릭을 하여 Properties를 선택

   2) Java Build Path를 선택

   3) Libraries 탭에서 Add Library를 선택

   4) 선택하는 곳에서 JUnit 선택하여 라이브러리 추가

 

Add Library 선택화면

5. 테스트 방법 

테스트 클래스를 작성 한 뒤,  RunAs > JUnit Test를 클릭합니다.

- 단위테스트에 성공했을 때 나타나는 화면

 

- 단위테스트에 실패했을 경우 나타나는 화면

 

실패했을 경우에는 추가로 아래와 같이 어디에서 오류가 발생했는지도 출력해줍니다.

오류발생 부분을 알려주는 화면

 

6. assert메소드 정리

assertArrayEquals(a, b) :  배열 A와 B가 일치함을 확인한다.

 

assertEquals(a, b) : 객체 A와 B가 같은 값을 가지는지 확인한다.

 

assertEquals(a, b, c) :  객체 A와 B가 값이 일치함을 확인한다.( a: 예상값, b:결과값, c: 오차범위)

 

assertSame(a, b) : 객체 A와 B가 같은 객체임을 확인한다.

 

assertTrue(a): 조건 A가 참인지 확인한다.

 

assertNotNull(a) : 객채 A가 null이 아님을 확인한다.

 

(더 많은 메소드는 http://junit.sourceforge.net/javadoc/org/junit/Assert.html 참고)

 

7. 테스트에 사용되는 어노테이션 정리

(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 { 

}

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

@BeforeClass 어노테이션은 테스트 클래스 수행 시 단위 테스트 메소드 보다 먼저 딱 한 번 수행되어야 할 경우 지정합니다. 예를 들어 DB 연결 시 드라이버 로딩 부분을 @BeforeClass로 지정한 메소드에 작성합니다. 반대로 @AfterClass 어노테이션은 단위 테스트 함수들이 다 수행되고 맨 마지막에 수행되어야 할 경우 지정합니다. 예를 들어 DB 연결 후 마지막에 드라이버를 반납하는 부분을 @AfterClass로 지정한 메소드에 작성합니다.

 

8. 마무리

그동안은 버그를 확인하기 위해 System.out.println 으로 위치를 확인하느라 굉장히 번거로웠습니다.

JUnit을 사용하여 단위테스트를 진행하니, 어디에서 오류가 났는지 + 최적화된 코드를 유추해줘 훨씬 편하게 

코드를 확인할 수 있었습니다.  그리고, 테스트 결과를 Test클래스로 남겨 테스트의 근거를 명확하게 해준다는 점도 좋았습니다.

 

그동안 반복테스트를 뭔가 번거롭게 생각했지만, 실제로 사용해보니 사용법도 어렵지않고 버그확인이 너무 간편하여

앞으로 테스트코드를 적극 활용하여 TDD(Test-Driven-Development, 테스트 기반 개발) 방식의 개발을 해보고자 합니다.

 

읽어주셔서 감사합니다.

 

 

참고 

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

https://epthffh.tistory.com/entry/Junit%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%8B%A8%EC%9C%84%ED%85%8C%EC%8A%A4%ED%8A%B8

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

728x90

댓글