1. 테스트 (1/2) 1. 테스트도구 테스트 (Test) 테스트대상에입력값을넣었을때그결과가성공혹은실패의결과를내는것이다. 성공 입력 대상 결과 실패 수동테스트 vs. 자동테스트 Here! Here! Page l 3 3
1. 테스트 (2/2) 1. 테스트도구 장점 쉽다. 간편하다. 수동테스트 테스트불가능한상황이별로없다. 자동테스트 언제든지같은테스트를여러번수행가능 기존테스트는새테스트를작성하는발판이된다. ( 지식축적 ) 빠르므로자주돌려볼수있다. 개발자가코드개선활동을수행할때에도회귀테스트 (Regression Test) 를자주할수있다. 단점 휘발성 테스트항목이늘어난다면? 다른사람에게테스트내용을설명하기어려움 재현하기어려움 코드로작성해야한다. 기술, 노하우가필요하다 코드로테스트를작성할수없는상황이있다. ( 수동테스트와공조 ) 테스트도관리대상이다. 모듈화가잘되어있어야한다. 디자인의개선필요 Legacy Code의어려움 Page l 4 4
2. 개요 (1/2) 1. 테스트도구 테스트도구는 Unit Test, Mock, DB Test Framework 을통해 TestCase 작성을지원하고, Test Automation, Test Coverage, Test Reporting 등의기능을제공함 구현도구 TestCase 작성 테스트도구 Test 수행 작성 테스트클래스 실행 OOServiceTest Unit Test Framework 테스트대상모듈 MockDao 분석 Test Coverage OOService OODao 작성 <<Dataset>> DaoTest Mock Framework DB Test Framework 자동화 Test Automation 리포팅 DB DB Test Reporting 결과리포트 Page l 5 5
2. 개요 (2/2) 1. 테스트도구 테스트도구사용프로세스 write TestCases run TestCases analyze Test Coverage run automatically TestCases report Test results Page l 6 6
5. Unit Test (1/3) 1. 테스트도구 Unit Test 란대상코드에대해테스트하고자개발자가작성한코드로서, 주로특정메소드를실행해서 그결과가기대값과일치하는지확인하는형태이며, Unit Test 는서로독립적으로수행되어야함. 효과 작성한코드의설계개선작업시, 코드품질에대한확신 코드수정시버그를쉽게찾을수있게해줌 자동화된회귀테스트 (Regression Test) 를가능하게해주는 Source가됨 작성범위 주요흐름에대한테스트 (the happy path) 또다른주요흐름에대한테스트 (the main alternative path) 경계조건에대한테스트 (null 인자체크등 ) Exception 테스트 (Exception 발생하는조건에대한테스트 ) Page l 7 7
5. Unit Test (2/3) 구성 테스트프레임웍을사용하는 Class 공용으로사용하는테스트데이터 (test fixture) 테스트데이터준비 (Setup of test data) 테스트메소드 (testxxx) ( 테스트별준비 ) 테스트대상메소드실행 assert 문을이용한결과확인 (asserttrue, assertequals etc.) ( 내부메소드 ) 성공입력대상결과실패 1. 테스트도구 1: public class UserAdminTest { 2: 3: 4: /* Class under test */ private UserAdmin useradmin; 5: 6: 7: /* A simple test user */ private User user; // Test Data (Fixture) 8: /* An administrator role */ // 9: private Role adminrole; // 10: 11: 12: 13: 14: /** * Initializes the test fixture. */ @Before 15: 16: 17: public void setup() throws Exception { useradmin = new UserAdmin(); user = new User("John", "Doe"); // Test Data Setup 18: adminrole = new Role("Administrator"); // 19: } 20: 21: 22: 23: 24: 25: 26: /** * Test for method with... */ @Test public void testadduser() { user.setage(18); // Extra Test Setup 27: useradmin.adduser("jdoe", user, adminrole); // Use 28: Test Data 29: 30: 31: 32: User result = useradmin.getuser("jdoe"); assertequals("john", result.getfirstname()); assertequals("doe", result.getlastname()); 33: } 34: } Page l 8 8
5. Unit Test (3/3) JUnit 1. 테스트도구 JUnit 은자바프로그래밍언어를위한 Unit Test Framework 로, Unit Test 코드를작성하고자동화된 테스트를수행할수있는기능을제공함 Page l 9 9
6. Mock (1/3) 1. 테스트도구 Mock 객체는 Unit Test 의독립성 (isolation) 을높여주기위해사용하며, 테스트하고자코드와관련이 있는객체 (collaborator) 를흉내내어 Unit Test 를수행할수있도록도와주는객체임 Mock 객체를사용하는경우 진짜객체를준비, 설정하기어렵다 진짜객체가느리다. 진짜객체가사용자인터페이스를갖거나그자체이다. 진짜객체가아직없다. Mock 사용종류 이미구현된 Mock 객체사용 : Spring test (web, jndi), mockrunner EasyMock, JMock, Mockito 등의 Mock 라이브러리사용 Mock으로사용할가짜클래스직접구현 10 Page l 10
6. Mock (3/3) 1. 테스트도구 Easymock + Unitils 샘플 1: @RunWith(UnitilsJUnit4TestClassRunner.class) 2: public class EgovControllerTest { 3: 4: @Mock 5: @InjectIntoByType 6: private EgovService mockservice; 7: 8: @TestedObject 9: private EgovController egovcontroller = new EgovController(); 10: 11: @Test 12: public void testselectlist() throws Exception { 13: assertnotnull(egovcontroller); 14: expect(mockservice.selectlist()).andreturn( 15: Arrays.asList(new Message(101), new Message(102))); 16: EasyMockUnitils.replay(); 17: 18: List<Message> resultlist = egovcontroller.selectlist(); 19: assertnotnull(resultlist); 20: assertequals(2, resultlist.size()); 21: } 22: 23: @Test 24: public void testinsert() throws Exception { 25: mockservice.insert(makevo()); 26: EasyMockUnitils.replay(); 27: 28: SessionStatus status = new SimpleSessionStatus(); 29: String view = egovcontroller.add(makevo(), status); 30: } 31: } Mock 으로생성할인터페이스에대한정의한뒤, 테스트대상클래스에 Mock 으로정의한클래스를세팅한다. 리턴값을갖는메소드를 Mock 클래스에정의하고리턴값을설정한뒤, 진짜객체처럼사용한다. 리턴하지않는메소드를 Mock 객체에정의후진짜객체처럼사용한다. 11 Page l 11
7. Batch Job Test 1. 테스트도구 배치테스트도구를통해기개발된일괄처리모듈에대한 Junit 테스트파일생성및테스트수행과 함께, 기존에생성한 Junit 테스트파일을재실행할수있는기능을제공 배치테스트절차 1 Job 정보선택 2 Job Launcher 정보선택 3 Job Parameter 정보선택 ( 선택사항 ) 1 배치 Job 정보를선택한다. 2 Job Launcher 정보를선택한다. 3 필요시 Job Parameter 정보를선택한다. 4 Generate Batch Test File 버튼을클릭하여배치테스트파일을생성한다. 4 배치테스트파일생성 5 Test 버튼을눌러배치테스트를수행한다. 5 배치테스트수행 12 Page l 12
8. DB Test 1. 테스트도구 DB Test는 DAO와 DB 모두를통틀어 Persistence layer를테스트하는것을말하며, 테스트DB와테스트데이터를준비하여실제로 DB를이용한단위테스트를수행함 DB Test Framework DbUnit DbUnit 기능 DB 데이터를 XML 파일형태로 import/export DB 연결, DB 초기화 DB의데이터가기대값과같은지확인 빌드도구를통한테스트자동화기능제공 효율적인 DB Test를위해 DB 구조만갖고있는단위테스트용 DB 준비 각개발자마다별도의단위테스트용 DB 공간 Unitils, Spring Test 활용 13 Page l 13
9. Test Automation (1/2) 1. 테스트도구 작성된다수의 TestCase 를자동으로수행하여소스단위의품질을높이고자함. CI 서버와연계될때, 주기적인테스트수행으로인해목표시스템의품질을향상할수있음 Test Suite TestCase 모음 1. Test Suite Class 작성 Test Suite 설정방법 Test Suite Class 작성 빌드도구의 batchtest 묶음 @RunWith(Suite.class) @SuiteClasses( { HttpRequestMockTest.class, SessionMockTest.class, FileUploadMockTest.class, EmailMockTest.class, JDBCMockTest.class }) public class MockTestSuite { } 2. batchtest 로묶음 <junit...> <batchtest fork="yes" todir="${testreports.dir}"> <fileset dir="${testbuild.dir}"> <include name="**/*test.class" /> <exclude name="**/abstract*test.class" /> </fileset> </batchtest> </junit> 14 Page l 14
10. Test Reporting - HTML (1/4) 1. 테스트도구 Ant (build.xml) Maven (pom.xml) <!-- Junit Test Result Report --> <target name="junitreport" depends="tests"> <junitreport todir="${testhtml.dir}"> <fileset dir="${testreports.dir}"> <include name="test-*.xml" /> </fileset> <report format="frames" todir="${testhtml.dir}" /> </junitreport> </target> <reporting> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-surefire-report-plugin</artifactid> <version>2.4.2</version> </plugin> </plugins> </reporting> 15 Page l 15
10. Test Reporting - Excel (2/4) 1. 테스트도구 Ant Default 로사용한예 <path id="egov.lib"> <path refid="master-classpath" /> <path location="${antlib.dir}/egovtest/egovframework-dev-tst-ant.jar" /> </path> Excel Reporting Ant Task 설정 <taskdef resource="egovtest.properties classpathref="egov.lib /> <!-- JUnit Excel Report --> <target name="egovtest" depends="tests"> <egov-junitreport todir="${testxls.dir}"> <fileset dir="${testreports.dir}" includes="**/test-*.xml" /> </egov-junitreport> </target> Default 사용예 Ant 템플릿엑셀파일을별도로사용한예 <target name="egovtest-full" depends="tests"> <egov-junitreport todir="${testxls.dir}" outputname="egovtest-junit-full.xls" templatepath="${basedir}/build/template-kr.xls" summary="0,b,6" packages="0,b,11" lists="1,a,5"> <fileset dir="${testreports.dir}" includes="**/test-*.xml" /> </egov-junitreport> </target> 16 Page l 16
10. Test Reporting - Excel (4/4) 1. 테스트도구 Maven (goal : egovtest:junit-xls) <build> <plugins> <!-- Egovframework JUnit Excel Reporting --> <plugin> <groupid>egovframework.dev</groupid> <artifactid>egovtest-maven-plugin</artifactid> <version>1.0.0-snapshot</version> </plugin> </plugins> </build> 17 Page l 17
1. 개요 2. 형상관리 소스버전관리도구는시스템형상요소 ( 소스및데이터 ) 를문서화하고변경을소스버전관리절차에따라관리하고, 효율적으로처리하기위한통제환경을의미 소스버전관리도구의특징및기능 형상요소 ( 소스및데이터 ) 에대한변경사항을관리 버전관리를수행하고, 배포도구를통해변경사항을배포 일정주기에백업도구를통해백업을수행 소스버전관리도구의구성요소및관계도 프로젝트팀소스관리도구배포도구 개발자 PL Check in/out Configuration Management 배포 백업 저장소 CMO 19 Page l 19
2. Subversion 개요 (1/4) 2. 형상관리 Subversion(SVN) 의배경 CVS 의단점을개선하고 CVS 를대체할목적으로개발되었음 오픈소스기반의소스버전관리도구 (http://subversion.tigris.org) CVS 대비 Subversion의특장점 CVS와거의동일한사용법. CVS 사용자는누구나쉽게사용할수있음 Commit 단위 : CVS는개별파일별로리비전관리, SVN은변경이발생하는체인지셋 (Change Set) 별로리비전관리 Atomic Commit: 여러파일커밋시, 어느하나의파일에서커밋이실패할경우, CVS는해당파일앞의경우는커밋되고, 뒷파일은그대로남아있지만, SVN은모두이전상태로롤백 트리별, 파일별접근제어리스트지원 파일에대한이름변경 / 이동, 디렉터리버전관리도지원 CVS에비해빠른동작속도 (Update/Branching/Tagging Time) 20 Page l 20
2. Subversion 개요 (2/4) 2. 형상관리 SVN 클라이언트 - Eclipse 플러그인 Subversive Polarion 커뮤니티그룹에서개발 Eclipse Ganymede 버전부터 SVN 클라이언트로공식채택 빠른 update, 안정적인동작 공식웹페이지 : http://www.eclipse.org/subversive/ Subclipse Tigris 커뮤니티그룹 (Subversion 개발커뮤니티 ) 에서개발 Subversion 초창기폭넓은사용자확보 Subversive 대비느린 update, 다수의버그로불안정 공식웹페이지 : http://subclipse.tigris.org/ 21 Page l 21
2. Subversion 개요 (3/4) 2. 형상관리 저장소 (Repository) 모든프로젝트의프로그램소스들과소스에대한변경사항이저장됨 네트워크를통해서여러사람이접근 SVN에서는 Berkeley DB(Default) 또는파일시스템 (Optional) 을저장소로사용 저장소접근 1 Eclipse 메뉴, Window > Open Perspective > Other... > SVN Repository Exploring 2 Eclipse 메뉴, File > New > Repository Location 3 마법사에서, URL 과 Authentication 항목을입력 22 Page l 22
2. Subversion 개요 (4/4) 2. 형상관리 Revisions 소스파일등을수정하여커밋하게되면일정한규칙에의해숫자가증가 저장소에저장된각각의파일버전이라할수있음 SVN의경우파일별로리비전이매겨지지않고변경발생단위로전체리비전이매겨짐 리비전을보고프로젝트진행상황을알수있음 저장소를통해본리비전이해 커밋의단위 전체리비전번호증가 저장소의파일시스템 2 1 1 1 1 2 2 3 1 1 1 1 3 2 3 3 개별소스들의리비전 23 Page l 23
3. 소스공유 (1/2) 2. 형상관리 프로젝트공유 새로운프로젝트를저장소에추가 1 Eclipse 패키지 / 네비게이션뷰, 프로젝트오른쪽클릭 > Team > Share Project... 2 Share Project 마법사, SVN 선택 3 Share Project 마법사, 저장소위치선택 > Finish 24 Page l 24
3. 소스공유 (2/2) 2. 형상관리 소스단위공유 공유중인프로젝트내에서해당소스를저장소에추가 2 팝업창에서내용확인 > OK 1 Eclipse 패키지 / 네비게이션뷰, 대상소스오른쪽클릭 > Team > Add to Version Control... 25 Page l 25
4. Checkout 초기 checkout 2. 형상관리 저장소에서전체소스의최종리비전을받아오는것 저장소인증정책에따라 ID, Password 입력여부가결정 3 패키지 / 네비게이션뷰에서체크아웃한프로젝트소스확인 2 SVN Repositories 뷰, 저장소를확장하여 trunk 아래의프로젝트선택 > Check Out 1 Eclipse 메뉴, Window > Open Perspective > Other... > SVN Repository Exploring 26 Page l 26
5. Update 2. 형상관리 저장소에소스업데이트 체크아웃을한이후의타인에의한소스변경사항을확인 저장소에있는소스중로컬과비교하여변경된항목의최신버전의소스를가져옴 변경된항목의최신버전은로컬본에통합됨 Eclipse 패키지 / 네비게이션뷰, 업데이트대상소스들 / 패키지 / 프로젝트에서오른쪽클릭 > Team > Update 27 Page l 27
6. Commit 2. 형상관리 Commit 로컬에체크아웃한소스를수정, 파일추가, 삭제등을한뒤저장소에저장하여갱신하는것 커밋을하면전체리비전이 1 증가 (CVS 의경우수정한각각파일의리비전이증가 ) 2 팝업창에서반영내용확인및 Comment 입력 1 Eclipse 패키지 / 네비게이션뷰, 커밋대상소스들 / 패키지 / 프로젝트에서오른쪽클릭 > Team > Commit... 28 Page l 28
7. History 조회 2. 형상관리 History SVN에의해관리되는특정소스와관련된과거모든리비전의내역 History 조회 Eclipse의기본카테고리인 Team 의 History 뷰를통해조회할수있음 리비전로그목록 1 Eclipse 패키지 / 네비게이션뷰, 대상소스오른쪽클릭 > Team > Show History 선택된리비전의 Comment 선택된리비전의구조와변경파일들 2 History 뷰에서대상소스의 History 목록과리비전상세내역조회 29 Page l 29
8. 충돌해결 (1/2) 2. 형상관리 충돌 (Conflict) 로컬에체크아웃이후수정한소스를저장소에커밋할때, 저장소의리비전이더높을경우충돌발생 ( 타인에 의해수정되고커밋된상태 ) 충돌발생상황예 : 로컬리비전 = 597 < 저장소리비전 = 634 충돌해결방안 postpone: 즉시반영없이, 소스코드를계속수정. 수정이완료된시점에다시시도 ( 충돌해결안함 ) diff: 충돌된상황을비교. 로컬과저장소의소스의차이를비교 edit: 로컬의파일을다시열어수정 mine-full: 저장소의리비전내용을무시하고, 로컬의내용으로커밋. theirs-full: 로컬의수정내역을무시하고, 저장소의리비전으로대체하여업데이트 30 Page l 30
8. 충돌해결 (2/2) 2. 형상관리 충돌해결방안예 diff/edit: 로컬과저장소의소스를모두열어비교 / 편집 mine-full: 충돌이발생한파일에서오른쪽클릭 > Override and Commit... 선택 theirs-full: 충돌이발생한파일에서오른쪽클릭 > Override and Update... 선택 31 Page l 31
1. CI(Continuous Integration) 정의 3.CI 서버 여러명으로구성된팀이작업한것을자주 - 각팀원이하루에한번이상, 매일여러번 - 통합하는것을가 리키는소프트웨어개발 Practice 로, 개발자, 버전관리저장소, 통합빌드머신등으로구성됨 Notice Feedback Mechanism Build Failed Code Commit Source Code Build Developer Watch & Polling Unit Tests Code Commit Version Control Server (SVN) Deploy CI Server Code Inspection Developer Build Success Test Coverage Analysis Development Server 33 Page l 33
2. CI(Continuous Integration) 효과와특징 3.CI 서버 효과 흔히발생하는일반적인위험을줄여준다. 에러를초기에발견할수있다. 자주통합할수록에러가발생하는범위가좁아에러를잡는것이수월해진다. 잘동작하고에러가거의없는 S/W를유지할수있다. 언제어느때라도배포할수있는 S/W를생성해낸다. 반복적인수작업을줄여준다. 프로젝트가시성을좋게해준다. 개발팀이 S/W 제품에대해보다큰자신감을갖게해준다. 특징 -소스코드일관성유지 : 소스관리시스템이필요하다. -자동빌드 : 빌드는 CI 툴에의해자동으로이루어져야한다. -자동테스트 : 소스검증과함께기능 / 비기능테스팅을매번검증함으로써코드의품질을높일수있다. -일일체크아웃과빌드 : 빌드주기가길어질수록개발자소스의오류발생확률이높아지고그만큼시간을낭비하게된다. 34 Page l 34
3. Hudson 개요 3.CI 서버 Hudson 은오픈소스 CI 서버로소스빌드스크립트를사용한자동빌드및빌드결과를개발자에게피 드백하는메커니즘을제공함 초기화면 : 프로젝트리스트와빌드상태및빌드성공여부를보여줌 35 Page l 35
4. Hudson 특징및주요기능 3.CI 서버 Hudson 특징 쉬운 Installation : hudson.war형태로 servlet container에배포 웹기반 UI를통한쉬운설정및즉각적인피드백 플러그인기반의확장성제공 깔끔하고잘정의된문서및 API Hudson 주요기능 소프트웨어자동빌드 빌드주기에따른일일빌드또는주간빌드기능제공 지속적이고자동화된빌드검증 SCM 폴링 (polling) 기능을통한최신코드기반의빌드수행 지속적이고자동화된빌드테스트 태스트슈트실행을통한코드품질검증 빌드후속절차자동화 컴파일된코드의패키징및테스트리포팅기능제공 36 Page l 36
5. Hudson 대시보드 (dashboard) 3.CI 서버 Hudson 은빌드결과및테스트결과등을보여주는대시보드기능을제공함 37 Page l 37
6. Hudson 프로젝트메뉴 3.CI 서버 Hudson 은등록된프로젝트의소스코드변경내용추적을위한메뉴와수동빌드메뉴그리고프로젝 트빌드상태를보여주는메뉴등을제공함 기본메뉴 Changes : 빌드버전별로 SCM 에서지난버전에비해서변경된내용에대해변경자와커밋시에개발자가추가한 comment 를확인할수있음 Workspace : 프로젝트의빌드디렉터리로브라우저를통해빌드에사용된파일등을확인할수있음 Build Now : 스케줄에상관없이지금강제적으로빌드 Build History : 빌드수행시기와빌드상태및성공여부를보여줌 38 Page l 38
7. Hudson JUnit 테스트연동 3.CI 서버 Hudson 은 JUnit 테스트리포트를출력해주는기능을제공하며테스트의 Progress 누적그래프를프 로젝트초기화면에출력함 JUnit 테스트리포트 테스트 Progress 누적그래프 프로젝트의단위테스트결과및테스트소요시간등에관한리포트를보여줌 프로젝트빌드에따른 JUnit 테스트누적그래프로빌드번호화테스트 method 개수로빌드결과를보여줌 39 Page l 39