소프트웨어공학개론 Tutorial #2: Junit Eun Man Choi

Similar documents
JUNIT 실습및발표

PowerPoint 프레젠테이션

PowerPoint Presentation

Junit

PowerPoint 프레젠테이션

슬라이드 1

JAVA PROGRAMMING 실습 08.다형성

Cluster management software

PowerPoint Presentation

JUnit & Eclipse

Microsoft PowerPoint - CSharp-10-예외처리

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

예외 예외정의예외발생예외처리예외전파 단정 단정의선언 단정조건검사옵션 2

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

문서의 제목 나눔명조R, 40pt

02 C h a p t e r Java

PowerPoint 프레젠테이션

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - 2강

C++ Programming

2 JUnit 이필요한이유 기졲의테스트방식 클래스에서테스트최소단위는메소드이며어떤것이유효한지를찾으려면하나씩테스트해야함테스트구현하는과정에서한번의단일테스트가실패할경우, 후속테스트가전혀수행되지않아전체적인테스트가불가능테스트를자동으로시작해주는프레임워크가없어각테스트를시작하기위해서는

PowerPoint Presentation

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

JAVA PROGRAMMING 실습 05. 객체의 활용

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

9장.예외와 단정

ppt.glzy8.com提供海量PPT模板免费下载!

PowerPoint Presentation

17장 클래스와 메소드

JAVA PROGRAMMING 실습 09. 예외처리

슬라이드 1

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

UnitTesting(ÇѱÛÆÇ).hwp

슬라이드 1

PowerPoint Presentation

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

gnu-lee-oop-kor-lec06-3-chap7

JVM 메모리구조

ThisJava ..

유니티 변수-함수.key

Design Issues

PowerPoint Template

어댑터뷰

쉽게 풀어쓴 C 프로그래밍

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밊

슬라이드 1

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

PowerPoint Presentation

비긴쿡-자바 00앞부속

Microsoft PowerPoint - lec2.ppt

PowerPoint Presentation

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

설계란 무엇인가?

Microsoft PowerPoint - Lect04.pptx

12-file.key

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

PowerPoint Presentation

Secure Programming Lecture1 : Introduction

PowerPoint Presentation

PowerPoint Template

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

파워포인트

제8장 자바 GUI 프로그래밍 II

교육자료

제11장 프로세스와 쓰레드

쉽게 풀어쓴 C 프로그래밍

4장.문장

Microsoft Word - java19-1-midterm-answer.doc

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

No Slide Title

Semantic Consistency in Information Exchange

윤성우의 열혈 TCP/IP 소켓 프로그래밍

[ 정보 ] 과학고 R&E 결과보고서 Monte Carlo Method 를이용한 고교배정시뮬레이션 연구기간 : ~ 연구책임자 : 강대욱 ( 전남대전자컴퓨터공학부 ) 지도교사 : 최미경 ( 전남과학고정보 컴퓨터과 ) 참여학생 : 박진명 ( 전

untitled

Microsoft PowerPoint - RMI.ppt

PowerPoint Presentation

09-interface.key

chap 5: Trees

쉽게 풀어쓴 C 프로그래밍

C# Programming Guide - Types

쉽게

PowerPoint Presentation

PowerPoint Presentation

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

PowerPoint 프레젠테이션

Microsoft PowerPoint - C++ 5 .pptx

슬라이드 1

<4D F736F F F696E74202D20C1A63234C0E520C0D4C3E2B7C228B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

자바 프로그래밍

1. Eclipse 2. JUnit 3. STATIC ANALYSIS 4. PMD 5. Eclipse TPTP 6. FIND BUGS INDEX 2

Transcription:

소프트웨어공학개론 Tutorial #2: Junit Eun Man Choi emchoi@dgu.ac.kr

강의목표 l JUnit 소개 l 테스트케이스 l Assertion l JUnit 테스트실행 2

JUnit l Java 언어를위한단위테스팅프레임워크 l 저자 : Erich Gamma, Kent Beck l 목적 : l 테스트를생성하고실행하기쉽다면프로그래머가테스트를생성하고실행하도록마음을움직일것이다. 3

소개 l 테스트를자동화하기위하여무엇이필요한가? l 테스트스크립트 l 테스트대상시스템 (SUT) 에보내는액션 l SUT 에예상되는반응 l 테스트가성공이냐실패냐를결정하는방법 l 테스트실행시스템 l 스크립트를읽어테스트케이스를 SUT 에연결시키는메카니즘 l 테스트결과를추적 4

테스트케이스판결 l 판결 (verdict) 은단일테스팅을실행한결과의선언 l 성공 (Pass): 테스트케이스가의도한목적을이루고테스트대상이예상되는결과를수행함 l 실패 (Fail): 테스트케이스가의도한목적을성취하였으나테스트대상이예상된대로수행하지못함 l 오류 (Error): 테스트케이스가의도한목적을성취하지못함 l 이유 : 테스트케이스수행도중예상하지못한이벤트발생 테스트케이스가적절히셋업되지않음 5

JUnit 버전 l 2007 년 3 월부터현재의버전 4.3.1 l JUnit 4.x 를사용하려면 Java version 5 나 6 을사용하여야 l 2006 년 4 월에소개된 JUnit 4 는이전버전에서상당한변화 ( 호환성없음 ) l JUnit 4 를소개 l 대부분의 JUnit 문서와사례는현재 JUnit 3 를사용하여상당히다름 l JUnit 3 은 Java (1.4.2) 낮은버전에서사용가능. l junit.org 웹사이트는오래된버전의요구가없는한 JUnit version 4 을사용 l Eclipse (3.2) 는플러그인으로두가지버전 JUnit 3.8 나 JUnit 4.1 중고를수있게함 6

JUnit 테스트란? l 테스트스크립트는 Java 메소드의모임 l 일반적인아이디어는 Java 객체를생성하고이것으로뭔가관심있는일을하고객체가올바른특성을가지고있는지결정하는것 l 추가할것은? Assertions. l 여러가지특성을체크하기위한메소드의패키지 : 객체의동질성 equality 동일한객체참조 null / non-null 객체참조 l assertions 은테스트케이스판결을결정하기위하여사용됨 7

Junit 은언제사용하여야하나? l 이름에있는것처럼 l 적은분량의단위테스팅을위하여 l 즉복잡한테스팅이나시스템테스팅은거리가멈 l 테스트중심개발방법에서 JUnit 테스트는코드개발전에테스트가먼저작성되어실행됨 l 구현코드는테스트를통과하기위한최소의코드로작성되어야함 즉추가되는기능이없어야 l 코드가일단작성되면계속테스트를실행하여통과되어야 l 새로코드가추가될때마다모든테스트를재실행하여이상을일으키지않음을증명하여야 8

JUnit 4 테스트케이스 /** Test of setname() method, of class Value */ @Test public void createandsetname() { Value v1 = new Value( ); v1.setname( "Y" ); String expected = "Y"; String actual = v1.getname( ); Assert.assertEquals( expected, actual ); 9

JUnit 4 테스트케이스 /** Test of setname() method, of class Value */ @Test public void createandsetname() { Value v1 = new Value( ); v1.setname( "Y" ); 이 Java 메소드는테스트케이스임을테스트실행자에게표시 String expected = "Y"; String actual = v1.getname( ); Assert.assertEquals( expected, actual ); 10

JUnit 4 테스트케이스 /** Test of setname() method, of class Value */ @Test public void createandsetname() { Value v1 = new Value( ); v1.setname( "Y" ); String expected = "Y"; String actual = v1.getname( ); 목적 : setname 이 Value 객체에특정이름을저장하였는지확인 Assert.assertEquals( expected, actual ); 11

JUnit 4 테스트케이스 /** Test of setname() method, of class Value */ @Test public void createandsetname() { Value v1 = new Value( ); v1.setname( "Y" ); String expected = "Y" String actual = v1.getname( ); Value 객체가정말이름을저장하였는지확인하기위하여호출 Assert.assertEquals( expected, actual ); 12

JUnit 4 테스트케이스 /** Test of setname() method, of class Value */ @Test public void createandsetname() { Value v1 = new Value( ); v1.setname( "Y" ); expected 와 actual 는같기를희망 같지않다면테스트케이스는 fail String expected = "Y"; String actual = v1.getname( ); Assert.assertEquals( expected, actual ); 13

Assertions l 가설 (assertion) 은 Junit 에서 Assert 라는클래스로정의 l assertion 가참이면메소드의실행은계속됨 l 어떤 assertion 이거짓이면메소드의실행은그자리에서중지되고테스트케이스의결과는실패 (fail). l 메소드수행중예외가발생하면테스트케이스의결과는 error. l 모든메소드에서가설 (assertion) 이위배되지않았다면테스트케이스는통과 (pass) l 모든 assertion 메소드는정적 (static) 14

Assertion 메소드 (1) l 진위조건이 true 나 false asserttrue(condition) assertfalse(condition) l 객체가 null 이냐 null 이아닌가? assertnull(object) assertnotnull(object) l 객체가동일한가 ( 즉같은객체를참조하고있나 ) 아닌가? assertsame(expected, actual) true if: expected == actual assertnotsame(expected, actual) 15

Assertion 메소드 (2) l 객체의동일성 ( Equality ): assertequals(expected, actual) expected.equals( actual ) 이면참 l 배열의동일성 ( Equality ): assertarrayequals(expected, actual) 배열은같은길이를가져야함 모든 i의정상적인값에대하여다음을체크 : assertequals(expected[i],actual[i]) 또는 assertarrayequals(expected[i],actual[i]) l 항상 fail 로판결되는무조건적실패 assertion fail() 이있음 16

Assertion 메소드매개변수 l 모든 assertion 메소드는 2 개의매개변수를가짐. 첫매개변수는예상되는값 (expected value) 두번째매개변수는실제값 (actual value) 이됨 l 순서가비교에는영향이없으나사용자에게실패메시지를생성할때이런순서로간주 l 모든 assertion 메소드는첫매개변수로추가 String 파라미터를가질수있음. 스트링은 assertion 이실패로끝나면 failure 메시지에포함됨 l 예 : fail( message ) assertequals( message, expected, actual) 17

동일성 (Equality) assertions l assertequals(a,b) 는테스트대상클래스의 equals() 메소드에영향을받음. l a.equals( b ) 의결과에좌우됨 l 동일성관계를결정하는것은테스트대상클래스에달려있음 JUnit 은적용가능한것을사용 l 테스트대상클래스가 equals() 메소드를재정의하지않으면 Object 클래스로부터받은 default equals() 메소드를적용하여객체동일성을체크. l a 와 b 가 int, boolean, 등기본타입이라면 assertequals(a,b) 이다음과같이동작 : l a 와 b 가동일객체 (Integer, Boolean, 등 ) 로변환된후 a.equals( b ) 가계산됨 18

변동소수점 assertions l 변동소수점타입 (double 이나 float) 가비교될때는매개변수 delta 가추가로필요. l assertion 은다음을계산 Math.abs( expected actual ) <= delta 변동소수점비교에서 round-off 오류를피하기위하여 l 예 : assertequals( adouble, anotherdouble, 0.0001 ) 19

JUnit 테스트의구성 l 각메소드는독립적으로판결 (pass, error, fail) 될수있는테스트케이스를나타냄. l 일반적으로하나의 Java 클래스를위한모든테스트는분리된클래스안에모여그루핑됨. l 코딩스타일 ( 예 ): l 테스트대상클래스 : Counter l 테스트를포함한클래스 : CounterTest 20

Junit 테스트사례 public class Counter { int count = 0; public int increment() { return count += 1; public int decrement() { return count -= 1; l 메소드내부가구현되지않았더라도 Junit 테스트코딩가능함 l 명세만정해져있어도테스트코딩가능 l 메소드스텁이용 public int getcount() { return count; 21

Counter 를위한 JUnit 테스트 public class CounterTest { Counter counter1; // declare a Counter here @Before void setup() { counter1 = new Counter(); // initialize the Counter here @Test public void testincrement() { asserttrue(counter1.increment() == 1); asserttrue(counter1.increment() == 2); @Test public void testdecrement() { asserttrue(counter1.decrement() == -1); l 각테스트케이스는새로운 cointer 로시작 l 테스트케이스실행순서의미없음 22

테스트기반 (fixture) l 테스트기반은테스트케이스가실행되는배경 l 테스트기반은다음을포함 : l 테스트케이스에의하여사용될수있는객체나자원. l 객체를사용할수있게만들고자원을할당또는해지하는데필요한작업 : setup 과 teardown. 23

Setup 과 Teardown l 특정클래스를위한테스트셋에대하여각테스트케이스수행에앞서이루어져야하는반복적인작업이있음. l 예 : 작업하려는 관심대상 객체의생성, 예를들면네트워크연결. l 테스트케이스끝에는수행후청소하기 ( 객체삭제등 ) 위한반복되는작업이있음. l 자원할당이해지되고다음테스트케이스를위한상태로바뀌었는지확인 l 테스트케이스가실패하면테스트메소드의수행이거기서끝나게되어청소하는코드는실행될수없음. 24

Setup 과 Teardown l Setup: l 각테스트케이스전에수행될메소드에는 @Before 라는주석을사용 l Teardown ( 판결에상관없이 ): l 각테스트케이스뒤에수행될코드를가진메소드에는 @After 주석을사용 l 이런메소드는테스트케이스에서예외가발생하거나 assertion 이실패되더라도실행될것임 l 주석의수는제한없음 l @Before 주석을가진모든메소드는각테스트케이스실행전에수행되나순서는임의로. 25

예 : 파일을테스트기반으로사용 public class OutputTest { private File output; @Before public void createoutputfile() { output = new File(...); @After public void deleteoutputfile() { output.delete(); @Test public void test1withfile() { // code for test case objective 26 @Test public void test2withfile() { // code for test case objective

메소드수행순서 1. createoutputfile() 2. test1withfile() 3. deleteoutputfile() 4. createoutputfile() 5. test2withfile() 6. deleteoutputfile() l assertion: test1withfile 이 test2withfile 보다먼저실행된다는보장은없음 27

단한번의 setup l 전체테스트클래스를위하여다른테스트전에, 다른어떤 @Before 메소드보다앞서메소드를한번만수행시킬수있는방법이있음 l 서버를기동시키거나통신을개시하는데유용함. 테스트할때마다닫고다시여는것은시간이많이걸리기때문 l @BeforeClass 주석으로표시 ( 메소드하나에서만사용가능이며 static 이되어야함 ): { @BeforeClass public static void anynamehere() // class setup code here 28

단하나의 tear down l 단하나의청소메소드도가능. 클래스안에있는모든테스트케이스가수행된후, 어떤 @After 메소드후에수행됨 l 서버를종료시키거나통신연결을끊을때사용. l @AfterClass 주석으로표시 ( 하나의메소드에만사용가능하며 static 이되어야 ): { @AfterClass public static void anynamehere() // class cleanup code here 29

예외테스팅 (1) l @Test 주석에파라미터를추가하면특정예외가테스트중에발생할수있음을예측. @Test(expected=ExceptedTypeOfException.class) public void testexception() { exceptioncausingmethod(); l 예외가발생하지않거나예측하지못한예외가발생한다면테스트는실패. l 즉메소드의종료시점에예외가발생하지않으면테스트케이스는실패임. l 예외메시지내용을테스트하거나예외가발생되는범위를제한하는것은다음슬라이드에있는방법을사용 30

예외테스팅 (2) l 예외 Catch, 예외발생이없으면 fail( ) 사용 public void testexception() { try { exceptioncausingmethod(); // If this point is reached, the expected // exception was not thrown. fail("exception should have occurred"); catch ( ExceptedTypeOfException exc ) { String expected = "A suitable error message"; String actual = exc.getmessage(); Assert.assertEquals( expected, actual ); 31

JUnit 3 l 현재 JUnit 3 에서 JUnit 4 로이전이이루어지고있음 l Eclipse 3.2 는 Eclipse 테스트및성능도구플랫폼은 JUnit 4 와동작하지않음. l Netbeans 5.5 는 JUnit 3 에만동작. l JUnit archive 에는다음두페키지가공존 l JUnit 3: junit.framework.* l JUnit 4: org.junit.* 32

JUnit in Eclipse l 테스트케이스생성하려면 File New Other... Java, JUnit, TestCase l 테스트할클래스의이름입력 테스트할클래스입력 자동으로채워짐

JUnit 실행 2. pulldown 메뉴선택 1. 테스트케이스선택 3. Run As JUnit Test 34

JUnit 실행결과 테스트결과 35

참고사이트 l http://www.junit.org l Junit 다운 l Junit 이용을위한많은정보 l http://sourceforge.net/projects/cppunit l Junit 의 C++ 버전 l http://www.thecoadletter.com l 테스트중심개발 (Test-Driven Development) 정보 36