35
JUnit(Unit Test) Team 1 200310394 남장우 200412342 이종훈

JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit(Unit Test)

Team 1200310394 남장우200412342 이종훈

Page 2: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

Contents

1. UnitTest

• Unit Test

• Unit Test

Diagram

2. JUnit

• JUnit

• JUnit Test Code

• JUnit Test

Routine

3. JUnit Example

• JUnit Example(1)

• JUnit Example(2)

• JUnit Example(3)

4. JUnit & Friends

• JUnit & Friends

• TestNG

• JUnit VS. TestNG

5. Q & A

• Reference

Page 3: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

1. UNIT TESTJUnit

Page 4: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

Unit Test

• 테스트 대상이 되는 코드 기능의 아주 작은 특정 영역, 즉

개발자가 작성한 코드조각을 Test (대개 특정 상황에서의

특정 메서드를 Test해 본다.)

Unit Test

• 개발자가 작성한 어떤 코드의 조각이 코드작성의 의도대

로 동작하는지 증명하기 위해 수행 한다.

• 개발단계부터 효율적인 테스팅을 행하여 전체 프로젝트

진행시간을 단축시키고 결함 수정이 용이하기 때문에 수

행한다.

Why

Page 5: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

Unit Test (Cont’d)

Cf. TDD(Test-driven Development, 테스트 주도 개발)자동화된 테스트로 개발을 이끌어 가는 개발 방식을 테스트 주도 개발이

라 부른다. TDD는 분석 기술이며, 설계 기술이며, 개발의 모든 활동을 구조화하는 기술이다.

테스트 주도 개발에서는 아래의 두 가지 규칙만 따른다1. 오직 자동화된 테스트가 실패했을 경우에만 새로운 코드를 작성한다.2. 중복을 제거한다.

• 모든 메서드를 테스트 하는것이 아니라 상식 수준의 확인을

통해 단위 코드가 의도한 대로 동작하는지 여부를 판단하는

단계이다. 물론 많은 양의 코드를 테스트 하는것이 좋다.

• 이상적으로는 코딩 전에 테스트 케이스를 작성하여 구현시

보조자료로 활용하는 것이 좋다. ( TDD 기법 )

Good Unit Test

Page 6: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

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) 특성이 한계 내에 있는가?

그렇다면 무엇을 테스트할것인가?

Page 7: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

Unit Test (Cont’d)

• 성능의 테스트에 중점을 두지 않고, 단지 해당 코드가

의도대로 동작하는지 테스트 하고, 해당 부분들이 의도

대로 동작한다는 확신을 쌓아 그것들을 조립하여 전체

동작 시스템을 테스트 하는 단계로 나아가는 것.

Goal

Page 8: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

Unit Test Diagram

Unit Test Diagram

테스트 프레임워크실행

코드조각Success/Fail

예측 가능한실행결과 값

Page 9: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

2. JUNITJUnit

Page 10: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit

그럼 테스트하는 모든 조각코드에 main메서드를 붙여야하나? 그것이 가능한가?

JAVA코드는 콘솔 실행을 위해선 main 메서드가 필요하다.

테스트하려면 실행을 시키고 결과값을 비교해야한다.

Unit Test는 큰 코드 내의 작은 조각을 테스트한다.

Page 11: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit

• X-Unit Project Line up중 JAVA언어로 작성된 코드를 Unit Test하기

위한 Tool이다.

• main이 아닌 메서드를 테스트 하기 위해 테스트를 도와주는

Framework이다.

• JUnit이 가지고 있는 Runner를 통해 테스트를 진행

JUnit

• Version : JUnit 4.8.1 (2009. 12. 8)

• 4.0 버전이상에서 JAVA 5의 @(어노테이션)기능을 활용하여 좀 더

쉽게 테스트 코드를 작성할 수 있게 되었다.

Current

Page 12: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Test Code

Page 13: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

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에 출력될 문자열 매개 변수이며 생략할 수 있다.

Page 14: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Test Code (Cont’d)

• 해당 객체가 Null값인지 검사한다.

assertNull([String message], Object object)

• 해당 객체가 Null이 아닌지 검사한다.

assertNotNull([String message], Object object)

• 조건문이 true인지 검사한다.

assertTrue([String message], boolean condition)

• 조건문이 false인지 검사한다.

assertFalse([String message], boolean condition)

Page 15: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Test Code (Cont’d)

• Junit 4.x이상에서는 TestCase 클래스를 상속하지 않고 @Test라는

어노테이션을 사용하여 테스트클래스로 인식한다.

@Test

• 파라미터로 ms단위의 timeout을 지정하여 해당 테스트 메서드가

이를 초과하면 fail처리 한다.

@Test(timeout)

• try/catch문이 없는 상황에서 예외상황이 발생하였을 때 테스트를

중지하지 않고 해당 예외 발생시 계속 테스트를 진행한다.

@Test(expected)

Page 16: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Test Code (Cont’d)

• 프레임워크에 지정된 러너가 아닌 사용자가 지정된 러너를 통해 특정 클래스를 손쉽

게 실행할 수 있게 해준다.

@RunWith

• 테스트할 클래스 목록을 지정한다.

@SuiteClasses

• JUnit에서는 테스트 메소드에 직접 파라미터를 넘길 수 없으므로, 매개변수 없는 테스

트 메소드를 작성한다. @Parameter로 파라미터 제공 메소드로 정의한다.

• 제공되는 파라미터를 받아 처리하는 생성자를 작성한다.

• 클래스 수준에서 테스트가 Parameterized 클래스와 함께 실행되도록 @RunWith 주석

을 지정한다.

@Parameters

Suite? Junit의 Suite는 여러 클래스를 한번에 테스팅 할 때 사용한다.

Page 17: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Test Code (Cont’d)

• 바로 다음의 테스트를 무시한다. comment는 개발자가 해당 테스

트를 무시하는 이유를 작성하여 알아보기 쉽게 한다.(일종의 주석

처리)

@Ignore(comment)

• 각 테스트를 진행하기 전에 테스트 중에 공통으로 사용하는 객체

들을 초기화하고 릴리즈 하기 위한 방법이다.

@Before, @After

• @Before, @After와 비슷하며, 모든 테스트 동안 단 한번만 호출

하고자 할 때 사용한다.

@BeforeClass, @AfterClass

Page 18: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

3. EXAMPLEJUnit

Page 19: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Example(1)Te

st C

ode

Exam

ple

(ass

ertion)

import org.junit.Assert;import org.junit.Test;import prac01.Hello;

public class HelloTest {@Testpublic void Test() {

Hello hello = new Hello();//return value://hello.calc1() = 30//hello.calc2() = 25//hello.calc3() = 22

String[] array1 = {"a", "b", "c"};String[] array2 = {"a", "b", "c"};String[] array3 = {"a", "b", "d"};

// AssertionAssert.assertNotSame(hello.calc1(), hello.calc2()); //successAssert.assertNotNull("hello is not null.", hello); //successAssert.assertTrue(hello.calc1() == 30); //successAssert.assertEquals(array1, array2); //successAssert.assertEquals("Not Equal", array1, array3); //fail

}}

Page 20: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Example(1) (Cont’d)

Page 21: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Example(1) (Cont’d)

Page 22: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Example(2)Te

st C

ode

Exam

ple

(fix

ture

)

import org.junit.*;public class TestFixture {

private int x;

@Beforepublic void init() {

x = 20;}

@Afterpublic void release() {

x = 0;}

@Testpublic void countOne() {

for (int i = 0; i < 100; i++) {x++;

}System.out.println("countOnes's x=" + x);

}

*@Ignore@Testpublic void countTwo() {

for (int i = 0; i < 10; i++) {x++;

}System.out.println("countTwo's x=" + x);

}}

Page 23: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Example(2) (Cont’d)

Page 24: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Example(2) (Cont’d)

Page 25: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Example(3)Te

st C

ode

Exam

ple

(par

amet

ers)

import java.util.Arrays;import java.util.Collection;

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 {

@Parameterspublic static Collection data() {

return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }

});}

private int fInput;private int fExpected;

public FibonacciTest(int input, intexpected) {

fInput = input;fExpected = expected;

}@Testpublic void test() {

Assert.assertEquals(fExpected, Fibonacci.compute(fInput));

}}

}

Page 26: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit Example(3) (Cont’d)

Page 27: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

4. JUNIT & FRIENDSJUnit

Page 28: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit & Friends

Unit Test

JAVA

JUnit TestNG JTiger

C

Gunit CUT Check

Objective-

C

ObjcUnit OCUnit

.NET

Nunit

DB

DBUnit

ETC

…….

Page 29: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

TestNG

• JUnit 3.x버전시 개발된 Test Tool로 Junit 3.x 버전이 안고있는 문제점들을 파악하고 좀

더 개발자에게 단순하고 확장성있고, 실용적인 테스팅 도구를 제공하기 위해 개발된

Unit Test Tool이다.

• Unit Test만이 아닌 통합/기능테스트 기능도 포함하고 있다.

TestNG

• JAVA언어는 단일상속이기 때문에 TestCase클래스를 확장할 필요성이 매우 제한적이

다.(3.x버전)

• 매개변수들을 JUnit의 테스트 메소드에 전달하는 것과 setUp() 과 tearDown() 메소드

에 전달하는 것은 불가능하다.

• 실행 모델이 익숙하지 않다: 테스트클래스는 테스트 메소드가 실행될 때 마다 다시 인

스턴스화된다.

• 복잡한 프로젝트에서 다른 테스트 suite의 관리는 트릭을 많이 써야 한다.

• 위의 문제점들은 Junit도 4.x버전이 릴리즈되면서 모두 상쇄시킨 문제점들이다.

TestNG가 파악한 JUnit의 문제점

Page 30: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

TestNG (Cont’d)

• XML을 이용하기 때문에 확장 및 변경이 용이하다.

• Test후 자동으로 HTML로 리포트를 생성해준다.

• Test그룹화하여 그룹화 되어있는 메소드들만 Testing할 수 있다.

TestNG의 장점

• 많은 기능을 제공하긴 하지만 그마만큼 초심자가 사용하기엔

어려울 수 있다.

• 많은 유형의 Annotation을 지원하기 때문에 자칫 테스팅 코드

가 복잡해 질 수 있다.

TestNG의 단점

Page 31: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

TestNG (Cont’d)

• afterTestClass : true일 때, test Class실행 완료 후에 실행

• afterTestMethod : true일 때, test Method실행 완료 후에 실행

• beforeTestClass : true일 때, test Class실행 전에 실행

• beforeTestMethod : true일 때, test Method실행 전에 실행

@Configuration

• Test Method 실행 시 발생할 Exception List 지정

@ExpectedExceptions

• enable : false일 때, test진행 시 제외된다.

• groups : Class, Method를 특정 Group에 포함시킨다. Suite에서 Group별 설정이

가능하다.

@Test

Page 32: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

TestNG (Cont’d)

TestNG Test Class Life Cycle

Page 33: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

JUnit VS. TestNG

JUnit TestNG

Junit 3.x버전의 기능 중

불필요하고 어려운 것들

을 쉽게 바꿔 릴리즈

JAVA의 Annotation기능을

먼저 사용 편의성 높임

JUnit에 비해 좀 더 유연하

다.

가장 널리 쓰이고 쉽게 쓸

수 있다.

IDE & 타테스팅 도구와의

강력한 호환성을 보임

4.X버전에 와서 사용자의

편의성을 더욱 높여줌

Page 34: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

5. Q & AJUnit

Page 35: JUnit(Unit Test)dslab.konkuk.ac.kr/Class/2010/10SV/Practice/1/Junit...JUnit •X-Unit Project Line up중JAVA언어로작성된코드를Unit Test하기 위한Tool이다. •main이아닌메서드를

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