Junit 이 리플렉션 덩어리라는 것이 느껴진다. (매력쟁이 리플렉션!)
5.0에 추가된 @annotation이 Junit4 에 적용이 됐다. @annotation을 잘몰라서 조금 헷갈린다.
책은 3.8 기준이라서 장단을 맞추기가 쉽지 않다.
책은 실용주의 프로그래머를 위한 단위테스트.
책은 군더더기가 적었다 (가끔 너무 하다 싶을 정도로 ㅋㅋ)
Junit 3.8 과 4 모두 하려니, 더욱 헷갈려서 지인의 충고대로 천천히 걸어가려고 한다.
(ide에 Junit4를 add 하고 우선은 3.8기준으로 공부한다)
* 절대 경로 3.8 과 4 를 섞어서 쓰지 말것 테스트 수행결과가 달라진다.
ex) TestCase를 상속받고, @annotation같이 써보삼. -_-;; 어떤 코드가 들어가느냐에 따라
예측 블가능 exception발생에, 원하지 않는 테스트 까지 수행한다.
ex) @Test를 사용하고, suite()를 선언하면, @Test우선순위로 실행된다.(suite의 의미가 없어진다)
절대로 섞어서 쓰지 말것.
1.
a) IntelliJ에서 Junit 을 추가 하는 방법
- file - setting - project structure - project libraries에 junit4.0.jar를 추가 한다.
* Junit.jar는 3.8 버전, junit4.0.jar는 4.0 버전
b) Eclipse에서 Junit 을 Libraries에 추가 하는 방법.
- 해당 프로젝트 - properties - Java Build Path - Libraries 탭 - Add Library 를 이용한다.
* add library까지 진행하다보면 버전을 선택하는 화면이 나온다.
2. Test Class가 가져야하는 Junit의 약속(룰)
- public method
- void
- no parameter
- method명은 test로 시작
- extends TestCase
ex )
import junit.framework.*;
public class CaseTester extends TestCase {
public CaseTester(String method) { super(method); } //-> suite()를 사용시 쓰인다.
public void testAdd() { ..... }
}
3. Junit의 helper method(== assert method)
a) assertEquals([String message],expected, actual) // message는 생략 가능으로 실패시 메세지가 출력된다.
assertEquals([String message],expected, actual,tolerance) //실수형 비교를 위해서 오차의 범위를 지정해준다.
b) assertNull([String message],Object)
assertNotNull([String message],Object)
c) assertSame([String message],expected, actual) // 같은 객체를 참조하는지 판정
assertNotSame([],expected,actual) // 그 반대
d) asserTrue([String message], boolean)
assertTrue(true); 이딴 코드 넣으면 -_- 안됨. "너 왜 거기 있니~"
e)fail 무조건 실패처리
4. suite() 활용
- 테스트 메소드가 많은 경우, 원하는 테스트 메소드만 지정해서 테스트를 수행한다.
- suite()가 오버라이딩 되면, suite()만 실행한다.
[rule]
- static method
- Test로 리턴
1) TestSuite suite = new TestSuite();
suite.addTest(new 테스트클래스("실행할테스트메소드"));
suite.addTest(테스트클래스.suite()); // static 이니까~ 회사에서 통합 테스트 실행시 유용할 듯.
2) TestSuite suite = new TestSuite();
// 모든 테스트를 suite에 추가 하시겠삼. ( 테스트클래스의 suite()는 무시~)
suite.addTestSuite(테스트클래스.class);
5. 각 testMethod 전후로 실행된다.
protected void setUp() // 테스트 메소드 실행전
protected void tearDown() //테스트 메소드 실행후
테스트 메소드 개수 만큼 실행된다.
protected 로 선언된 이유는, 굳이 그 클래스만의 고유한 기능을 다른 곳에서 쓸필요는 없기 때문이
아닌가 생각한다.
6. 각 suite() 전후로 실행된다. 만약 위의 setUp()과 tearDwon()이 오버라이드 되어 있으면,
같이 실행된다.
public static junit.framework.Test suite()
{
TestSuite suite = new TestSuite();
//suite.addTest(new TestClassOne("test"));
suite.addTest(new TestClassOne("testAdd"));
suite.addTest(new TestClassOne("testSub"));
//suite.addTest();
TestSetup wrapper = new TestSetup(suite) {
protected void setUp() throws Exception {
System.out.println("suite SetUP");
}
protected void tearDown() throws Exception {
System.out.println("suite tearDown");
}
};
return wrapper;
}
7. 사용자 정의 assert Method
- 나왔다 -_-;; 어딜가나 사용자 정의 들이 있다.
public class Tester extends TestCase {
public void assertEvenDollars(String msg, Object) { .... }
}
public class TestSomeThing extends Tester { ... }