JUnit(Unit Test) Team 1 200310394 남장우 200412342 이종훈
Contents 1. UnitTest 2. JUnit 3. JUnit Example 4. JUnit & Friends 5. Q & A Unit Test JUnit JUnit Example(1) JUnit & Friends Reference Unit Test JUnit Test Code JUnit Example(2) TestNG Diagram JUnit Test JUnit Example(3) JUnit VS. TestNG Routine
JUnit 1. UNIT TEST
Unit Test Unit Test 테스트대상이되는코드기능의아주작은특정영역, 즉개발자가작성한코드조각을 Test ( 대개특정상황에서의특정메서드를 Test해본다.) Why 개발자가작성한어떤코드의조각이코드작성의의도대로동작하는지증명하기위해수행한다. 개발단계부터효율적인테스팅을행하여전체프로젝트진행시간을단축시키고결함수정이용이하기때문에수행한다.
Unit Test (Cont d) Good Unit Test 모든메서드를테스트하는것이아니라상식수준의확인을통해단위코드가의도한대로동작하는지여부를판단하는단계이다. 물론많은양의코드를테스트하는것이좋다. 이상적으로는코딩전에테스트케이스를작성하여구현시보조자료로활용하는것이좋다. ( TDD 기법 ) Cf. TDD(Test-driven Development, 테스트주도개발 ) 자동화된테스트로개발을이끌어가는개발방식을테스트주도개발이라부른다. TDD 는분석기술이며, 설계기술이며, 개발의모든활동을구조화하는기술이다. 테스트주도개발에서는아래의두가지규칙만따른다 1. 오직자동화된테스트가실패했을경우에만새로운코드를작성한다. 2. 중복을제거한다.
Unit Test (Cont d) 그렇다면무엇을테스트할것인가? Right-BICEP Right - 결과가옳은가? B - 모든경계 ('B'oundary) 조건이 correct 한가? < 경계조건에서확인해봐야할사항들 - 'CORRECT'> 형식일치 ('C'onformance) 값이기대한형식과일치하는가? 예 ) 최상위도메인이름이없는이메일주소 fred@foobar 이넘어온다면?) 순서 ('O'rdering) 적절히순서대로되어있거나그렇지않은값인가? 범위 ('R'ange) 적당한최소값과최대값사이에있는값인가? 참조 ('R'eference) 코드가자기가직접제어하지않는외부코드를참조하는가? 존재성 ('E'xistance) 값이존재하는가? 개체수 ('C'ardinality) 확실히충분한값이존재하는가? 개수를정확히필요한만큼갖고있다던가, 정확히필요한만큼만들었다는것을확인해야한다. 시간 ('T'ime) ( 절대적으로그리고상대적으로 ) 모든것이순서대로일어나는가? 제시간에? 때맞추어? I - 역 ('I'nverse) 관계를확인할수있는가? C - 다른수단을사용해서결과를교차확인 ('c'ross-check) 할수있는가? E - 에러조건 ('e'rror condition) 을강제로만들어낼수있는가? P - 성능 ('P'erformance) 특성이한계내에있는가?
Unit Test (Cont d) Goal 성능의테스트에중점을두지않고, 단지해당코드가의도대로동작하는지테스트하고, 해당부분들이의도대로동작한다는확신을쌓아그것들을조립하여전체동작시스템을테스트하는단계로나아가는것.
Unit Test Diagram Unit Test Diagram 실행 예측가능한실행결과값 테스트프레임워크 코드조각 Success/Fail
JUnit 2. JUNIT
JUnit Unit Test 는큰코드내의작은조각을테스트한다. 테스트하려면실행을시키고결과값을비교해야한다. JAVA 코드는콘솔실행을위해선 main 메서드가필요하다. 그럼테스트하는모든조각코드에 main 메서드를붙여야하나? 그것이가능한가?
JUnit JUnit X-Unit Project Line up중 JAVA 언어로작성된코드를 Unit Test하기위한 Tool이다. main이아닌메서드를테스트하기위해테스트를도와주는 Framework이다. JUnit이가지고있는 Runner를통해테스트를진행 Current Version : JUnit 4.8.1 (2009. 12. 8) 4.0 버전이상에서 JAVA 5의 @( 어노테이션 ) 기능을활용하여좀더쉽게테스트코드를작성할수있게되었다.
JUnit Test Code
JUnit Test Code (Cont d) assertequals([string message], expected, actual) 변수혹은객체두개의값이같은지검사한다. 어떤형의객체이던동일성테스트를할수있다. assertsame([string message], Object expected, Object actual) 두객체가같은인스턴스인지검사한다. assertnotsame([string message], Object expected, Object actual) 두객체가다른인스턴스인지검사한다. Cf. Expected 는기대값이고 actual 은테스트대상이된코드에서실제로나오는값이다. 또, message 는테스트가실패할경우 failure trace 에출력될문자열매개변수이며생략할수있다.
JUnit Test Code (Cont d) assertnull([string message], Object object) 해당객체가 Null 값인지검사한다. assertnotnull([string message], Object object) 해당객체가 Null 이아닌지검사한다. asserttrue([string message], boolean condition) 조건문이 true 인지검사한다. assertfalse([string message], boolean condition) 조건문이 false 인지검사한다.
JUnit Test Code (Cont d) @Test Junit 4.x 이상에서는 TestCase 클래스를상속하지않고 @Test 라는 어노테이션을사용하여테스트클래스로인식한다. @Test(timeout) 파라미터로 ms 단위의 timeout 을지정하여해당테스트메서드가 이를초과하면 fail 처리한다. @Test(expected) try/catch 문이없는상황에서예외상황이발생하였을때테스트를 중지하지않고해당예외발생시계속테스트를진행한다.
JUnit Test Code (Cont d) @RunWith 프레임워크에지정된러너가아닌사용자가지정된러너를통해특정클래스를손쉽 게실행할수있게해준다. @SuiteClasses 테스트할클래스목록을지정한다. @Parameters JUnit에서는테스트메소드에직접파라미터를넘길수없으므로, 매개변수없는테스트메소드를작성한다. @Parameter로파라미터제공메소드로정의한다. 제공되는파라미터를받아처리하는생성자를작성한다. 클래스수준에서테스트가 Parameterized 클래스와함께실행되도록 @RunWith 주석을지정한다. Suite? Junit 의 Suite 는여러클래스를한번에테스팅할때사용한다.
JUnit Test Code (Cont d) @Ignore(comment) 바로다음의테스트를무시한다. comment는개발자가해당테스트를무시하는이유를작성하여알아보기쉽게한다.( 일종의주석처리 ) @Before, @After 각테스트를진행하기전에테스트중에공통으로사용하는객체 들을초기화하고릴리즈하기위한방법이다. @BeforeClass, @AfterClass @Before, @After 와비슷하며, 모든테스트동안단한번만호출 하고자할때사용한다.
JUnit 3. EXAMPLE
JUnit Example(1) import org.junit.assert; import org.junit.test; import prac01.hello; public class HelloTest { @Test public void Test() { Hello hello = new Hello(); //return value: //hello.calc1() = 30 //hello.calc2() = 25 //hello.calc3() = 22 Test Code Example(assertion) } } String[] array1 = {"a", "b", "c"}; String[] array2 = {"a", "b", "c"}; String[] array3 = {"a", "b", "d"}; // Assertion Assert.assertNotSame(hello.calc1(), hello.calc2()); Assert.assertNotNull("hello is not null.", hello); Assert.assertTrue(hello.calc1() == 30); Assert.assertEquals(array1, array2); Assert.assertEquals("Not Equal", array1, array3); //success //success //success //success //fail
JUnit Example(1) (Cont d)
JUnit Example(1) (Cont d)
JUnit Example(2) Test Code Example(fixture) import org.junit.*; public class TestFixture { private int x; @Before public void init() { x = 20; } @After public void release() { x = 0; } @Test public void countone() { for (int i = 0; i < 100; i++) { x++; } System.out.println("countOnes's x=" + x); } } *@Ignore @Test public void counttwo() { for (int i = 0; i < 10; i++) { x++; } System.out.println("countTwo's x=" + x); }
JUnit Example(2) (Cont d)
JUnit Example(2) (Cont d)
JUnit Example(3) import java.util.arrays; import java.util.collection; private int finput; private int fexpected; Test Code Example(parameters) import org.junit.*; import org.junit.runner.runwith; import org.junit.runners.parameterized; import org.junit.runners.parameterized.parameters; public class TestParam { @RunWith(Parameterized.class) public static class FibonacciTest { @Parameters public static Collection data() { return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } }); } } } public FibonacciTest(int input, int expected) { finput = input; fexpected = expected; } @Test public void test() { Assert.assertEquals(fExpected, Fibonacci.compute(fInput)); }
JUnit Example(3) (Cont d)
JUnit 4. JUNIT & FRIENDS
JUnit & Friends Unit Test JAVA C Objective- C.NET DB ETC JUnit TestNG JTiger Gunit CUT Check ObjcUnit OCUnit Nunit DBUnit.
TestNG TestNG JUnit 3.x버전시개발된 Test Tool로 Junit 3.x 버전이안고있는문제점들을파악하고좀더개발자에게단순하고확장성있고, 실용적인테스팅도구를제공하기위해개발된 Unit Test Tool이다. Unit Test만이아닌통합 / 기능테스트기능도포함하고있다. TestNG가파악한 JUnit의문제점 JAVA 언어는단일상속이기때문에 TestCase클래스를확장할필요성이매우제한적이다.(3.x버전) 매개변수들을 JUnit의테스트메소드에전달하는것과 setup() 과 teardown() 메소드에전달하는것은불가능하다. 실행모델이익숙하지않다 : 테스트클래스는테스트메소드가실행될때마다다시인스턴스화된다. 복잡한프로젝트에서다른테스트 suite의관리는트릭을많이써야한다. 위의문제점들은 Junit도 4.x버전이릴리즈되면서모두상쇄시킨문제점들이다.
TestNG (Cont d) TestNG의장점 XML을이용하기때문에확장및변경이용이하다. Test후자동으로 HTML로리포트를생성해준다. Test그룹화하여그룹화되어있는메소드들만 Testing할수있다. TestNG의단점 많은기능을제공하긴하지만그마만큼초심자가사용하기엔어려울수있다. 많은유형의 Annotation을지원하기때문에자칫테스팅코드가복잡해질수있다.
TestNG (Cont d) @Configuration aftertestclass : true일때, test Class실행완료후에실행 aftertestmethod : true일때, test Method실행완료후에실행 beforetestclass : true일때, test Class실행전에실행 beforetestmethod : true일때, test Method실행전에실행 @ExpectedExceptions Test Method 실행시발생할 Exception List 지정 @Test enable : false일때, test진행시제외된다. groups : Class, Method를특정 Group에포함시킨다. Suite에서 Group별설정이가능하다.
TestNG (Cont d) TestNG Test Class Life Cycle
JUnit VS. TestNG JUnit TestNG 4.X 버전에와서사용자의 편의성을더욱높여줌 JUnit 에비해좀더유연하 다. IDE & 타테스팅도구와의 강력한호환성을보임 JAVA 의 Annotation 기능을 먼저사용편의성높임 가장널리쓰이고쉽게쓸 수있다. Junit 3.x 버전의기능중 불필요하고어려운것들 을쉽게바꿔릴리즈
JUnit 5. Q & A
Reference WebSite http://www.junit.org http://www.javajigi.net http://younghoe.info/255 http://www.ibm.com/developerworks/kr/library/tutorial/j-junit4 http://decoder.tistory.com/21 http://www.devpia.com/maeul/contents/detail.aspx?boardid=4244& MAEULNO=4&no=31527&page=1 http://www.java2go.net/blog/66?tssession=26df0dd05f49a9ec27177 f7e386c80aa http://blog.naver.com/inter999?redirect=log&logno=140047093842 Text 실용주의프로그래머를위한단위테스트 with JUnit 이클립스프로젝트필수유틸리티 Subversion, Ant, JUnit, Trac