Microsoft PowerPoint - 테스트주도개발.pptx

Similar documents
PowerPoint 프레젠테이션

PowerPoint Presentation

신림프로그래머_클린코드.key

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

OOP 소개

교육자료

Microsoft PowerPoint - 04-UDP Programming.ppt

Spring Boot/JDBC JdbcTemplate/CRUD 예제

PowerPoint Presentation

05-class.key

자바 프로그래밍

PowerPoint Presentation

PowerPoint 프레젠테이션

비긴쿡-자바 00앞부속

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

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Presentation

JUNIT 실습및발표

PowerPoint Presentation

PowerPoint 프레젠테이션

02 C h a p t e r Java

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft Word - EEL2 Lab5 예외처리와 스레드.docx

Design Issues

09-interface.key

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

5장.key

Microsoft PowerPoint - 2강

Spring Boot

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

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

Microsoft PowerPoint - Lect04.pptx

untitled

Cluster management software

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

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

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

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

PowerPoint Presentation

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Java ...

mytalk

예제 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

Interstage5 SOAP서비스 설정 가이드

12-file.key

JAVA PROGRAMMING 실습 09. 예외처리

제11장 프로세스와 쓰레드

쉽게 풀어쓴 C 프로그래밍

ch09

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - 03-TCP Programming.ppt

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

rmi_박준용_final.PDF

Secure Programming Lecture1 : Introduction

PowerPoint Presentation

Spring Data JPA Many To Many 양방향 관계 예제

Web Application을 구성하는 패턴과 Spring ROO의 사례

PowerPoint Presentation

PowerPoint Presentation

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

PowerPoint Presentation

슬라이드 1

4장.문장

내장서버로사용. spring-boot-starter-data-jpa : Spring Data JPA 사용을위한설정 spring-boot-devtools : 개발자도구를제공, 이도구는응용프로그램개발모드에서유 용한데코드가변경된경우서버를자동으로다시시작하는일들을한다. spri

( )부록

07 자바의 다양한 클래스.key

PowerPoint 프레젠테이션

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

JAVA PROGRAMMING 실습 02. 표준 입출력

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

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

PowerPoint Presentation

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 05. 객체의 활용

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밊

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

ilist.add(new Integer(1))과 같이 사용하지 않고 ilist.add(1)과 같이 사용한 것은 자바 5.0에 추가된 기본 자료형과 해당 객체 자료 형과의 오토박싱/언박싱 기능을 사용한 것으로 오토박싱이란 자바 컴파일러가 객체를 요구하는 곳에 기본 자료형

Java

PowerPoint Presentation

1

목차 JEUS EJB Session Bean가이드 stateful session bean stateful sample 가이드 sample source 결과확인 http session에

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

No Slide Title

Microsoft Word - java18-1-final-answer.doc

JUnit & Eclipse

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

어댑터뷰

PowerPoint Presentation

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for

03-JAVA Syntax(2).PDF

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

A Tour of Java IV

쉽게 풀어쓴 C 프로그래밍

Transcription:

테스트가능한 소프트웨어설계와 TDD 작성패턴 Testable software design & TDD patterns 한국스프링사용자모임 (KSUG ) 채수원

발표자소개 LG CNS 경영기술교육원기술교육팀전임강사 강의과목디자인패턴 & 리팩터링 분석설계실무 Agile 적용실무 블로그여름으로가는문 blog.doortts.com Comments 내용이나후기에대해서는 Outsider님의후기 (http://blog.outsider.ne.kr/494) t /494) 를참조하시면좀더도움이될겁니다.

흠 Comments 2010 년 7 월 10 일화창한토요일오후이대 ECC

Why are we here?

보다더나은소프트웨어와 보다더나은삶을만들기위해

객체지향기본원칙

OCP SRP ISP Demeter s Law (=hollywood law) IOC Comments 언어도열심히배우고원칙도학습했으니까개발을더잘할수있겠죠?

다음두코드중더나은디자인은? Case.1 class Rental { Movie movie; Rental(Service service) { this.movie = service.getmovie(); Case.2 class Rental tl{ Movie movie; Rental(Movie movie) { this.movie = movie;

(based on my five years of educational experience) Strongly recommended d approach #1 테스트주도개발 Test-Driven Di Development

TDD 관점에서바라봤을때드러나는 안좋은디자인의징후 - 단위테스트케이스작성이어렵다 - 단위테스트케이스가자주깨진다. - 단위테스트케이스실행을위한준비해야할것이많다. - 다른사람의테스트케이스를읽기가어렵다.

강형마이크로디자인

기초점검코스

프로그램을작성하기전에테스트먼저하라! Test the program before you write it. 잘동작하는깔끔한코드 Clean code that works 질문 응답 정제 반복 질응답정반복 Ask Respond Refine Repeat

public class Calculator { public int sum(int a, int b) { return 0; public static void main(string[] args) { Calculator calc = new Calculator(); System.out.println( calc.sum(10, 20) == 30 ); System.out.println( calc.sum(1, 2) == 3 ); System.out.println( calc.sum(-10, 20) == 10 ); System.out.println( calc.sum(0, 0) == 0 ); 모두 true면작성완료! ----- 실행결과----- false false false Comments true 굳이프레임워크를쓰지않아도무방합니다. 업무로직작성전에완성상태를검증해줄수있는코드가존재하기만하면충분합니다.

기본코스

생성자메소드테스트 (constructor method test) public class EmployeeDaoTest { @Test public EmployeeDaoTest { EmployeeDao dao = new EmployeeDao(); asserttrue(dao.isconnected());

동치비교 (equivalence test) @Test public void testequals_case2() { Music musica = new Music("BAD", "Michael"); Music musicb = new Music("BAD", "Michael"); assertequals ( musica, musicb);

동치비교 (equivalence test) 해결책.1 해결책.2 내부상태 ( 보통은필드값 ) 를직접꺼내와서각각비교한다. tostring 을중첩구현해 (override) 놓고, tostring 값으로비교한다. 해결책.3 equals 메소드를중첩구현한다. 해결책.3 Unitils 의 assertreflectionequals 를이용한다.

배열비교 (array test) 해결책.1 JUnit 4 의 assertarrayequals 를이용한다. 해결책.2 Unitils 의 assertreflectionequals 나 assertlenientequals 를이용한다 해결책.3 List 로변환해서비교한다.

배열비교 (array test) @Test public void testarrayequal_notsorted() { String[] arraya = new String[] {"A", "B", "C"; String[] arrayb = new String[] {"B", "A", "C"; Arrays.sort sort (arraya); Arrays.sort (arrayb); assertarrayequals (arraya, arrayb);

몇가지오해

boolean isright(){ return TDD == UnitTest

(Do) All or Noting

단위테스트케이스작성

Skeleton vs Incremental package main; public class Account { public Account(int i) { public int getbalance() { return 0; public void withdraw(){ public void deposit(){

One method one assert? @Test public void testgetbalance() throws Exception { assertequals (10000, account.getbalance()); account = new Account(1000); assertequals (1000, account.getbalance()); account = new Account(0); assertequals (0, account.getbalance());

Anti-pattern private Account account; @Before public void setup(){ account = new Account(10000); @Test public void testwithdraw() throws Exception { account.withdraw(1000); assertequals(9000, account.getbalance());

Anti-pattern public class AccountTest { @Before public void setup(){ @Test public void testdeposit() throws Exception { Account account = new Account(10000); account.deposit(1000); assertequals(11000, account.getbalance()); @Test public void testwithdraw() throws Exception { Account account = new Account(10000); account.withdraw(1000); assertequals(9000, account.getbalance());

단위테스트접근방식

상태기반테스트 입력 methoda dosomething? = 예상결과실제결과

상태기반테스트 @Test public void testfileremove() tfil { FileUtile fileutil = new FileUtil(); fileutil.cleancontents( targetfile ); assertequals( 0, fileutil.size( targetfile )); );

행위기반테스트 Case.1 입력 A methoda methodb dosomething rampon Case.2 입력 B methoda methodb call dosomething rampon

행위기반테스트 @Test public void testgetorderprice () throws Exception { PriceCalculator calculator = new PriceCalculator(); Item item = new Item("LightSavor","Kitchen knife",100000); ICoupon coupon = new Coupon(); assertequals(93000, calculator.getorderprice(item, coupon)); int methodcallcount = ((Coupon)coupon).getIsAppliableCallCount(); assertequals (1, methodcallcount);

행위기반테스트 public class Coupon implements ICoupon { private int isappliablecallcount; @Override public boolean isappliable(item item) { isappliablecallcount++; // 호출되면증가.. public int getisappliablecallcount(){ return this.isappliablecallcount;

행위기반테스트 @Test public void testgetorderprice () throws Exception { PriceCalculator calculator = new PriceCalculator(); Item item = new Item("LightSavor","Kitchen knife",100000); ICoupon mockcoupon = mock(icoupon.class); // mocking 작업 assertequals(93000, calculator.getorderprice(item, mockcoupon)); verify (mockcoupon, times(1)).isappliable(box); i (b );

TDD with Spring 스프링프레임워크의 Unit Test 지원 - 의존관계주입을통한객체생성 - 웹컨테이너없는웹애플리케이션테스트 - 단위테스트지원유틸리티 => Injection 과 Mock

XmlBeanFacotry 로컨텍스트가져오는버전 <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www http://www.w3.org/2001/xmlschemaw3 org/2001/xmlschema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> beans.xsd <bean id="music" class="main.mp3"> <constructor-arg value="belong to me.mp3"/> </bean> <bean id="musicplayer" class="main.musicplayer"> <property name="music" ref="music"/> </bean> </beans> XmlBeanFactory beanfactory = new XmlBeanFactory( new ClassPathResource("/context-musicplayer /contextmusicplayer.xml xml") );

Unitils 를사용 @RunWith(UnitilsJUnit4TestClassRunner.class) public class UnitilsMusicPlayerTest { @SpringApplicationContext("/context-musicplayer /context-musicplayer.xml xml") private ApplicationContext context;

annotation 및 autowire 를사용해서 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"/context-musicplayer.xml") public class AutowiredMusicPlayerTest { @Autowired MusicPlayer player;

Injection기능만사용할경우 Google Guice( 쥬스 ) 로처리해보면 static Injector injector = Guice.createInjector(new MusicModule()); @Test public void testgetfilename() throws Exception { MusicPlayer player = injector.getinstance(musicplayer.class); assertequals("belong To Me.mp3", player.getfilename());

TDD with Spring servlet test 이름 박성철 사번 5874 아이디 직위 fupfin 회장

TDD with Spring servlet test public class EmployeeSearchServletTest { @Test public void testsearchbyempid() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); // ➊ MockHttpServletResponse response = new MockHttpServletResponse(); // ➋ request.addparameter("empid", "5874"); // ➌ EmployeeSearchServlet searchservlet = new EmployeeSearchServlet(); // ➍ searchservlet.service(request, response); // ➎ Employee employee = (Employee)request.getAttribute( getattribute("employee"); employee // ➏ assertequals (" 박성철 ", employee.getname() ); // ➐ assertequals ("5874", employee.getempid() ); assertequals ("fupfin", employee.getid() ); assertequals (" 회장 ", employee.getposition() ); assertequals("/searchresult.jsp", response.getforwardedurl()); // ➑

발표를마치며

Q&A 감사합니다 doortts@gmail.com

이미지참조 Longing for Summer http://www.flickr.com/photos/68165632@n00/1553091251/ Coupling sketches cropped http://www.flickr.com/photos/49432745@n03/4533798684/ Tagged, finally... http://www.flickr.com/photos/kornrawiee/3189034267/ Vincent Boiteau http://www.flickr.com/photos/2dogs_productions