JUnit Cookbook을 분명히 보고왔건만 맛보기만 해주는 내용이라 cookbook인 것이 확실하다.
직접 eclipse에 JUnit을 도입해서 간단한 테스트를 수행하면
향후 응용에 도움이 될 수 있을 것으로 생각되므로 직접 깔고 테스트를 해보도록 하겠다.
eclipse 개발환경에 JUnit 추가하기
제일 먼저 eclipse를 열어 JUnit library를 추가해보자.
eclipse 조차 깔려있지 않았으므로 그것부터 깔았는데
최근에 나온 eclipse 버전이 다양한 걸 보고 신세계를 경험한 기분...☆
가장 최근에 나온 버전인 MARS의 IDE for Java EE Developers 패키지를 다운받았다.
eclipse를 열어서 새로운 Project를 하나 생성하자.
습관적으로 Dynamic Web Project를 생성하긴 했지만 뭘로 해도 관계는 없을 듯 하다.
프로젝트명은 아주 정직하게도 JUnitExample
프로젝트를 생성하고나서는 해당 프로젝트의 Build Path 설정에 들어가자.
1) 프로젝트 우클릭 -> Properties -> Java Build Path -> Libraries 탭 클릭
또는 Properties를 통해서가 아니라 Build Path로 바로 접근하는 방법도 있다.
2) 프로젝트 우클릭 -> Build Path -> Configure Build Path... -> Libraries 탭 클릭
Libraries 탭에 가서 Add Library 버튼을 클릭하면 추가할 수 있는 Library 목록이 보이는데
그 중간 언저리 즈음에 JUnit이 있다.
location 경로를 보니 eclipse plugin에 내장되어 있는 것으로 확인된다.
없다! 면... JUnit jar 파일을 별도로 다운받으면 된다.
jar 파일을 다운로드 받아서 classpath 경로에 넣어주거나
maven을 사용하는 경우에는 maven 설정에 junit dependency 값을 넣어주어도 됩니다.
원래 추가된 Library 였던것처럼 자연스럽게 추가되어있는 것을 확인할 수 있다.
이제 JUnit 설치 끝!
매우 간단한 JUnit Test Case 작성하기
그렇다면 각자 만든 Project 내에 JUnit을 테스트 할 내용을 적어보도록 하자.
먼저 테스트를 위한 기존 코드값 작성을 위해 com.junit 이라는 패키지를 만들었다.
(물론 패키지명은 본인들이 원하는 어떤 내용으로 해도 아무런 상관이 없다)
계산식 예제가 가장 간단하므로 Calculator라는 클래스를 선언하고
함수로는 곱셈 함수를 정의하였다. (절대 sum 함수 쓰려다가 찔려서 multiple로 바꾼거 아님)
테스트 할 클래스도 등록했으니 이제 JUnit으로 Unit test를 수행할 Test case를 만들 차례다.
별도로 패키지를 분리하기 위해 com.calculator.test 패키지를 새로 만들었다.
(이 역시도 맘대로 하셔도 됩니다. 아무런 관계가 낫띵이에요.)
JUnit 테스트를 위해 만든 패키지를 우클릭하면 나오는 New를 통해 신규 파일을 만들자.
JUnit은 자주 쓰던 내용이 아니므로 Other쪽에서 찾아야 할 확률이 매우 높다.
검색 기능을 사용하면 바로 툭 튀어나오므로 아래의 캡쳐처럼 JUnit을 찾아보자.
테스트를 위한 기본 단위인 Test case를 만들것이므로 JUnit Test Case를 선택한다.
Test Case를 여러개 만들면 Test Suite를 만들어 한 번에 여러 테스트 수행이 가능하다.
이제 cookbook 내용에 나왔던 내용을 얼추 머리 속으로 짜맞출 수 있다.
package명의 경우 나중에 com.calculator.test로 수정했으므로 캡쳐화면은 무시해주세여...
Name은 Test Case의 클래스명이 되겠다.
여러 블로그를 봤을 때 "기존 클래스명 + Test"의 형태로 많이들 구성하는데
다른 명칭으로 하더라도 제약은 따로 없는 듯 하지만 불안하므로 나도 CalculatorTest를 따랐다.
Class under test에는 Test 대상이 되는 클래스를 지정한다.
여기서는 com.junit에 정의한 Calculator 클래스가 해당된다.
테스트 할 함수를 선택한다.
우리는 multiple 함수만 구현했으므로 선택의 여지가 없네영..
단촐하게 선택하고 Finish 합니다.
기본적으로 생성되는 Test Case 파일 내용이다.
테스트 대상이 되는 Method는 "test + 기존 함수명" 으로 CamelCase 변환되어 생성된다.
@Test Annotation도 아주 잘 붙어있는 것을 확인할 수 있다.
Test Annotation에 파라미터를 부여해서 속성값을 줄 수 있다.
수행시간을 체크할 수 있도록 하는 timeout과 예외 발생여부를 체크할 수 있는 expected가 있다.
사용방법은 JUnit API 링크를 첨부한다.
http://junit.sourceforge.net/javadoc/org/junit/Test.html
본격적인 테스트 수행을 위해서 구현되지 않은 testMultiple 함수의 내용을 바꿔보도록 하자.
Calculator 클래스에 정의했던 multiple 함수를 호출해서 결과값과 비교하고자 하는 변수값이
같은지를 확인하려고 한다. 값 비교에 이용하는 assertEquals함수는 JUnit에서 제공하는 단정문이다.
단정문은 확실하게 판단하고 결정짓기 위한 함수로, 단정지어진 결론과 다른 경우
false를 반환하는 함수다. 여기서 사용한 assertEquals의 경우는 '같다' 라는 결론을 내려두었고
값을 비교 판단했을 때 같으면 true, 같지 않은 경우 false를 반환하게 된다.
단정문의 종류는 역시 API 링크를 첨부한다.
http://junit.sourceforge.net/javadoc/org/junit/Assert.html
위의 테스트 결과는 false가 나온다.
assertEquals 함수에 매개변수로 넘긴 값이 같지 않기 때문인데
첫 번째 매개변수로 넣은 expected value는 80이고
두 번째 매개변수의 actual value는 Calculator 클래스에 정의한 multiple 함수를 이용하여 7 * 9 = 63의 값을 가진다.
기대되는 값과 실제 값의 결과가 다르기 때문에 fail이 발생하고
Failure Trace에 fail 사유를 설명하고 있다.
해당 테스트의 경우는 예상되어지는 값이 80이라고 적었지만 실제로는 63이므로 실패했다.
assertEquals(63, cal.multiple(7, 9));
로 변경하면 아래와 같이 정상적으로 테스트가 수행되어 초록색 진행바를 만날 수 있다.
Annotation 소개
@Test Annotation이 Test를 수행해야 하는 함수임을 알려주는 것처럼
JUnit에서 사용되는 다른 Annotation이 있어 여기까지 소개하고 끝내도록 하겠다.
@Before
Test 함수보다 먼저 수행되도록 정의하는 Annotation.
테스트에 필요한 공통적인 내용들을 정의해두면 좋다.
해당 Annotation을 사용하는 함수는 public void로 정의되어야 하며, 상속받은 Superclass 들에
정의된 @Before Annotation을 사용한 함수가 가장 먼저 수행된다.
@After
위에 정의한 Before Annotation과 반대되는 개념으로 Test 함수 이후에 수행된다.
보통 Before Annotation으로 정의된 함수에서 할당한 자원들을 해제하는 용도로 사용됨.
(DB Connection 이 대표적인 예)
이 역시도 public void로 선언하여야 Test 함수 이후에 수행될 수 있음.
Before 또는 Test 함수에서 예외가 발생하더라도 After Annotation이 붙은 함수는 수행된다.
Superclass에서 정의된 After 함수는 현재 클래스에 정의된 After 함수 수행 이후에 수행됨!!
ex) Superclass에 정의한 @Before -> 현재 클래스 @Before ->
Test -> 현재 클래스 @After -> Superclass에 정의한 @After
@BeforeClass
테스트 수행에서 딱! 한 번 수행되도록 하는 공통 설정이 필요한 경우에 사용하면 좋다.
(예를 들어 Database logging과 같은 수행업무)
테스트의 독립성을 손상시킬 수도 있으나 공통의 내용을 뺄 수 있으므로 효율적인 방법이 되기도 한다.
BeforeClass로 사용될 함수는 public static void 로 선언되어야 하며 매개변수가 있어서는 안된다.
Superclass에 선언된 BeforeClass가 있는 경우에 현재 클래스의 선언내용보다 먼저 수행된다.
@AfterClass
Before와 After 같은 관계로 생각하면 쉽다. BeforeClass에서 할당한 자원 해제에 사용된다.
이 역시도 테스트 수행에서 딱! 한 번만 수행되도록 정의되며 public static void로 선언되어야 한다.
BeforeClass에서 예외를 발생시키더라도 AfterClass는 반드시 수행되며, Superclass에서 정의된 내용은
현재 클래스의 AfterClass가 수행된 이후에 수행된다.
종합해보면...
Superclass에 정의한 @BeforeClass -> 현재 클래스에 정의한 @BeforeClass ->
Superclass에 정의한 @Before ->
현재 클래스 @Before -> Test1 -> 현재 클래스 @After ->
Superclass에 정의한 @After ->
Superclass에 정의한 @Before ->
현재 클래스 @Before -> Test2 -> 현재 클래스 @After ->
Superclass에 정의한 @After ->
현재 클래스에 정의한 @AfterClass -> Superclass에 정의한 @AfterClass
@Ignore
일시적으로 테스트 또는 테스트 그룹을 사용하지 않기를 원할 수도 있다.
@Test가 붙은 함수라고 하더라도 Ignore Annotation이 붙으면 테스트 대상에 포함되지 않고,
또는 Ignore Annotation을 Class에 붙이게 되면 해당 클래스는 테스트 수행되지 않는다.
Test Case 구성이나 Test Suite 구성에 많은 시간이 소요되겠지만
하나를 잘 만들어두면 두고두고 많은 도움이 될 것으로 보인다.
Annotation이나 단정문이 크게 다양하지 않은 것에 비해 JUnit 자체를 이용하는 사용 파급력은 매우 커보인다.
이제 개발보다 테스트가 더 중요하다고 하니 잘 이용해봐야겠다 ㅇ_ㅇ
'TREND' 카테고리의 다른 글
Redmine : Project Management Web Application (3) | 2015.09.03 |
---|---|
TELNET, FTP, SSH, SFTP 용어 정리 (0) | 2015.09.02 |
Jenkins : 빌드 자동화를 통한 지속적 통합 툴 (0) | 2015.09.01 |
JUnit Cookbook (0) | 2015.08.25 |
테스트 프레임워크 xUnit (0) | 2015.08.24 |