JUNIT 실습및발표
JUNIT 접속 www.junit.org DownLoad JUnit JavaDoc
API Document 를참조
JUNIT 4.8.1 다운로드
설치파일 (jar 파일 ) 을다운로드 CLASSPATH 를설정 환경변수에서설정 실행할클래스에서 import JUnit 설치하기
테스트실행주석 @Test Test 를실행할 method 앞에붙임 expected 발생할것으로예상되는예외를지정. 예외가생기지않으면실패. timeout 테스트가끝나는시간을예측. 시간보다길게끝나면실 패. @Ignore 테스트를하지않을 method 앞에붙임.
예제 public class MyTest{ @Test(expected=NullPointerException.class) public void extest(){ Object obj = null; obj.tostring();//exception 발생 : 성공 } @Test(timeout=1000) public void timetest(){while(true){}};// 실패 @Ignore public void igtest(){system.out.println("this isn't ignored");}// 실행되지않음
결과 TimeOut exception 이발생 Test 가 2 개실행. Ignore 는무시됨
테스트전, 후에실행 @After 각 TestMethod 를실행한후마다실행한다. @AfterClass Test 를마친후에한번만실행한다. @Before 각 TestMethod 를실행하기전마다실행한다. @BeforeClass Test 를시작하기전에한번만실행한다.
예제 public class MyTest{ @BeforeClass public void static setupclass(){system.out.println("beforeclass");} @Before public void setup(){system.out.println("before");} @Test public void test1(){system.out.println("test1");} @Test public void test2(){system.out.println("test2");} @After public void teardown(){system.out.println("after");} @AfterClass public static void teardownclass(){system.out.println("afterclass");}} >java org.junit.runner.junitcore MyTest
실행순서 BeforeClass-> Before->test1->After-> Before->test2->After-> AfterClass
결과값검증하기 assert...() 예상되는결과값을검사한다. assertarrayequals, assertequals, assertfalse, assertnotnull, assertnull 등이있다. fail() 실패했다고보고한다. Assume...() 예상되는결과와상관없이만족한다고가정한다. Static 으로 import 한다.
예제 public class MyTest{ @Test public void Test1(){ assertequals(0, (0*5)+12-8-4);// 결과값은 True} @Test public void Test2(){ Object obj = null; assertnull(obj);//obj 가 null 이므로결과값은 True} @Test public void Test3(){ Object obj = null; assumenotnull(obj);//obj 가 Null 이아니라고가정했기때문에 obj.tostring(); //exception 을발생시키지않는다. }}
성공 결과
테스트자동화 클래스를정밀하게테스트하는것은시간이걸린다. 대규모개발시에는테스트할단위들이많아진다. 테스트를간단하게하기위해서는자동화를해야한다.
여러가지파라미터테스트 @RunWith Test 시클래스를참조한다. 값은 Runner 를상속받은클래스이다. RunWith 의값들중에는 Categories, Suite, Enclosed, Parameterized 등의클래스들이있다. @Parameters Parameterized 를참조하는클래스의파라미터를리턴하는메소드앞에붙는주석 메소드의리턴형식은 public static Collection 이다.
예제 @RunWith(Parameterized.class) public class MyTest{ int num; boolean match; public MyTest(int num, boolean match){ this.num = num; this.match = match; } @Parameters public static Collection values(){ return Arrays.asList(new Object[][]{ {1, false},// 실패 {2, false},// 성공 {3, true},// 성공 {4, true}// 실패 });} @Test public void Test1(){ boolean isodd; 파라미터를사용한다는것을선언해준다. 테스트시생성자에서 member 값으로파라미터를넣는다. Static 키워드와리턴값은지켜준다. if(num%2 == 1) isodd = true; else isodd = false; // 홀수면 true를리턴한다. assertequals(match, isodd); }}
결과 Failure 가 2 개생겼음을알려준다. [0] 번 Parameter 가 Test1 에서실패했다.
RunWith 와함께쓰이는 Class Suite.class 여러개의 Test 클래스들을모아실행할때쓰인다. @SuiteClasses 와함께쓰인다. Category.class Suite 의한종류이다. 클래스군을지정해서실행한다. @IncludeCategory,@ExcludeCategory, @Category 와함께쓰인다. Enclosed.class InnerClass 를사용할때쓰인다.
Suite 예제 public class ATest{ @Test public void test1(){fail();} } public class BTest{ @Test public void test1(){fail();} } @RunWith(Suite.class) @SuiteClasses({ATest.class, BTest.class}) public class ABTest{} > java org.junit.runner.junitcore ABTest
결과 2 개의실패가발생.
카테고리을이용하는방법 public interface CTests{} public interface DTests{} public class ATest{ @Category(CTests.class)@Test public void test1(){} @Category(DTests.class)@Test public void test2(){fail();}}} public class BTest{ @Test @Category({CTests.class, DTests.class}) public void test1(){fail();}} @RunWith(Suite.class) @IncludeCategory(CTests.class) @ExcludeCategory(DTests.class) @SuiteClasses({ATest.class, BTest.class}) public class MyTest{} Ctests 에속한다. Dtests 에속한다. Ctests,DTests 에속한다 CTests 는넣고 Dtests 는뺀다
결과 테스트 1 개성공
직접실행하는방법 public class ATest{ @Test public void test1(){ } } public class BTest{ @Test public void test1(){ } } public class ABTest{ static public void main(string...args){ Class[] classes = {ATest.class, BTest.class}; Result result = JUnitCore.runClasses(classes); // 이하 result 출력은직접한다. } } >java ABTest