 |  |
|
JUnit 테스트 생성, 관리
이전 절에서는 배치한 후 웹 애플리케이션을 테스트하는 도구를 살펴봤다. 만약 성능 문제를 발견한다면, 작성된 코드를 프로파일링하고, 병목 현상을 제거하기 위해 다른 이클립스 TPTP 도구를 사용할 수 있다. 그뿐만 아니라 애플리케이션의 오퍼레이션을 지속적으로 모니터링하길 원한다면, 이클립스 TPTP에서 제공하는 로그 분석 도구를 사용할 수 있다.
그렇지만 개발자들은 대부분, 특히 자바 개발자들은 일반적으로 실 서버(production server)에 코드를 넣기 전에 버그를 없애기를 좋아한다. 게다가 많은 자바 개발 프로젝트에서는 코드의 생명주기 전체에 걸친 버그 예방을 위한 개발 환경 구축에 힘을 쏟고 있다. 소스 제어(source control)는 소프트웨어 변경을 추적하고, 일일 빌드를 통해 성능 저하와 부정확성을 포함한 문제를 더 일찍 발견할 수 있다. 추가적으로 단위 테스트를 하면 각 "단위(unit)", 즉 개별 클래스보다 더 작은 단위의 정확한 실행을 검증할 수 있다. 정말로 "코드보다 테스트 먼저 작성하기"는 널리 받아 들여져 실행되고 있으며, 코드가 테스트를 통과하면, 단위 테스트는 완료된 것이다.
이클립스 코어(설치된 이클립스 TPTP를 제외하고)는 각 클래스로부터 JUnit 테스트(의 골격)를 생성하는 도구를 제공한다. 이클립스 TPTP는 더 나아가 자세한 로그 정보와 흥미롭지 않은 결과(예를 들어 통과된 모든 테스트를 무시할 수 있다)를 제외할 수 있는 특별한 로그 뷰어를 제공한다. 또한 이클립스 TPTP를 사용해 특정 이벤트로 쉽게 이동할 수도 있다. 의문이 나는 코드로 바로 이동할 수 있는 기능을 제공한다. 이번 섹션을 진행해나가면서 여러분은 그 외의 추가적인 기능과 혜택을 알게 될 것이다.
이클립스 TPTP JUnit 도구 시작하기
예제를 통해 이클립스 TPTP Junit 도구를 살펴보자. Listing 3에 있는 코드는 Account라는 간단한 자바 클래스로 은행 계좌를 모델로 한 것이다. 이 클래스는 잔고에 영향을 미치는 balanced, deposit(amount), withdrawal(amount)로 명명된 "getter" 메서드를 갖고 있다. 추가적으로 compoundAnnually(rate) 메서드를 호출할 때마다, Account의 원금에 1년 동안의 특정 이자율에 의해 벌어들인 이자가 더해진다.
Listing 3. 간단한 은행 계좌 관리를 위한 자바 클래스
package demo;
import java.lang.Math;
public class Account {
private double balance = 0;
public Account() {
this.balance = 0;
}
public Account(double deposit) {
this.balance = 0;
if (deposit > 0) {
this.balance = deposit;
}
}
public double deposit (double deposit) {
if (deposit < 0) {
return this.withdrawal(deposit);
}
this.balance += deposit;
return(this.balance);
}
public double withdrawal (double withdrawal) {
if (withdrawal < 0) {
return(this.deposit(-withdrawal));
}
if (this.balance >= withdrawal) {
this.balance -= withdrawal;
}
return(this.balance);
}
public double balance() {
return this.balance;
}
public double compoundAnnually(double rate) {
int n = 356 * 24;
if (rate > 0) {
this.balance *= Math.pow((1 + (rate/n)), n);
}
return(this.balance);
}
}
|
- 이클립스를 사용해, File > New > Other를 클릭한 다음 Java project를 선택해서 Demo란 이름으로 새 자바 프로젝트를 생성하자.
- 자바 프로젝트 폴더 내에,
Account란 이름으로 새 클래스를 생성하고, demo 패키지를 만들고, 이 패키지에 추가하자.
-
Account 클래스의 멤버와 메서드 교체가 필요하기 때문에, Listing 3에 있는 소스 코드를 복사, 붙여 넣는다.
-
Account 클래스에 대한 이클립스 TPTP JUnit 테스트를 만들자. 이클립스 TPTP JUnit 테스트는 일반 JUnit 테스트의 형식과는 조금 다른 특별한 테스트이며, File > New > Other(그림 17)를 선택함으로써 언제든지 Test 폴더에 추가할 수 있다.
그림 17. 이클립스 TPTP JUnit 테스트
- Java perspective에서 Account.java 클래스에서 마우스 오른쪽 버튼을 클릭한 후, New > Other를 클릭하자.
- 화면에 나타나는 창에서 TPTP JUnit Test를 선택한다. 만약 그림 18과 같은 창이 나타나면, Yes를 클릭하고 필요한 JAR 파일 세 개를 현재 자바
CLASSPATH 변수에 추가하라.
그림 18. 필수 클래스를 설정에 추가하기
- 새로운 테스트 이름은
AccountTest로 하고, 테스트 편집기에서 테스트 수정하기를 선택한다(그림 19). 작업을 종료하려면 Finish를 클릭하자.
그림 19. 이클립스 TPTP JUnit 테스트 케이스 이름 짓기
이클립스 TPTP JUnit 테스트 케이스가 생성됐을 때, Java perspective는 그림 20과 같을 것이다.
그림 20. 새로운 JUnit 테스트 스위트를 위한 프레임워크
- Test Methods 탭을 클릭하자. 이 탭에서는 개별 테스트를 추가할 수 있다. 세 개의 테스트, test 1, test 2, test 3를 생성하기 위해 Add를 세 번 클릭한다. Test1은
testCreateEmpty로, test 2는 createBalance로, test 3은 testVerifyDeposit로 이름을 바꾸라.
-
Ctrl+S로 작업을 저장하자. AccountTest.java 이클립스 TPTP JUnit 테스트 케이스를 클릭하고 화살표를 클릭해 확장하면, 테스트 이름을 딴 새 메서드 세 개가 클래스에 생성된 것을 볼 수 있다. 이클립스 TPTP JUnit 테스트 도구는 테스트 편집기에서 자바 클래스와 테스트 메서드의 동기화를 부지런히 시도한다. 예를 들어, 테스트 편집기에서 테스트 메서드의 이름을 변경하면, 자바 클래스의 이름 또한 자동으로 변경해준다(그러나 조심해야 할 점은, 오퍼레이션이 많은 동기화가 되지 않을 수도 있다는 점이다).
- AccountTest.java 클래스를 열고, 새로 생성한 메서드를 Listing 4에 코드로 다시 수정하자. 다 끝낸 다음에는, Ctrl+S를 눌러 작업을 저장하자.
Listing 4. 새로운 Account 클래스를 위한 테스트 케이스
public void testCreateEmpty()
throws Exception
{
Account zeroAccount= new Account();
assertEquals("balance not zero", zeroAccount.balance(), (double) 0, 0.01);
}
public void testCreateBalance()
throws Exception
{
double startingBalance = 510.96;
Account newAccount= new Account(startingBalance);
assertEquals("starting balance incorrect", \
newAccount.balance(), startingBalance, 0.01);
}
public void testVerifyDeposit()
throws Exception
{
double startingBalance = 987.91;
double deposit = 1560.98;
Account newAccount = new Account(startingBalance);
assertEquals("deposit not credited",
newAccount.deposit(deposit), deposit+startingBalance, .01);
}
|
이제 자바 클래스와 몇 가지 경우에 대한 JUnit 테스트를 갖게 되었으니, 어떻게 테스트를 실행하는지에 대해 자세히 알아보자. AccountTest.testsuite을 클릭하고, Behavior 탭을 클릭하면, 테스트 스위트를 어떻게 실행하는지에 대한 자세한 정보가 나온다. URL 도구를 사용할 때 했던 것처럼, 다음 단계는 개별 테스트 케이스 실행을 위해 루프를 만들고, 메서드를 호출하는 단계다.
루프와 메서드 호출 실행 방법을 설정하기 위해 다음 단계를 거쳐야 한다.
- Behavior 탭에서 Add를 클릭하자.
- 그림 21과 같이 화면에 나타난 창에서, 가장 위 패널에 있는 자바 메서드 세 개를 선택한 다음, OK를 클릭하자.
가장 왼쪽 패널에 테스트 메서드 세 개가 나와야 한다.
그림 21. 현재 JUnit 테스트에서 실행하고자 하는 케이스 선택하기
- AccountTest.testsuite에서 마우스 오른쪽 버튼을 클릭한 다음, Run As > Test를 클릭한다.
URL 도구처럼 실행 중인 테스트 스위트를 추적하기 위해 진행 상태 막대(progress bar)가 나타난다. 테스트가 완료되면, AccountTest_#.execution이란 이름으로 새로운 이클립스 리소스로 결과에 대한 로그가 남는다. #은 유일한 식별자다.
- AccountTest_#.execution을 더블클릭하고, Events 탭을 클릭하자. 그림 22와 같은 창을 볼 수 있다.
그림 22. Account 테스트 클래스의 결과
이벤트를 클릭해 확인해 보자. 테스트 결과(verdict), 소요 시간과 그 이상에 대한 요약을 보려면 Overview를 다시 클릭한다.
언제, 어떤 테스트 케이스가 실패했는가? testVerifyDeposit() 메서드에 assertEquals() 메서드를 추가해 에러를 확인하자. 그 다음 저장을 하고 AccountTest.testsuite을 다시 시작하자. 다시 실행된 스위트는 새 AccountTest_#.execution 파일을 생성한다. 그 파일을 더블 클릭하라.
Events로 이동해, 실패를 찾을 때까지 화살표를 확장하자. 실패한 메서드를 클릭하면 아래와 같은 스택 트레이스(stack trace)를 비롯해 무엇이 잘못되었는지 자세히 볼 수 있다.
그림 23. 테스트 스위트가 실패할 때 무슨 일이 발생했는가?
위에서 보는 것처럼 이클립스 TPTP JUnit 도구는 JUnit 테스트를 실행하고, 분석하며, 더 정교하게 만들어주는 유용한 환경을 제공한다. 이 외에도 이미 JUnit 테스트를 갖고 있다면, 테스트를 이클립스 TPTP에 임포트(import)해 사용할 수 있다. Import 창에서 File > Import를 클릭하고, 아래 그림에서 보는 것처럼 JUnit tests to TPTP를 클릭하자.
그림 24. 기존 JUnit 테스트를 이클립스 TPTP에 임포트하기
이클립스 TPTP의 도움을 받으면 테스트를 먼저 작성하는 것을 피할 이유가 전혀 없다.
|  |