SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
데이터베이스 와 테스트
13장/25장

             이수안(inch772@naver.com)
                                  아꿈사
     (http://cafe.naver.com/architect1.c
                                    afe)
데이터 베이스 없이 테스트 할 수
있다면 수단과 방법을 가리지 마라!
데이터 베이스 없이 테스트 할 수
있다면 수단과 방법을 가리지 마라!
   Why?데이터베이스를 사용하는 테스트는 그렇지 않는 테스트 보다

       20배 이상 느리다
하지만 무시하고 테스트
안 할 수도 없는 없다!
하지만 무시하고 테스트
안 할 수도 없는 없다!

  Why?
     대부분 데이터 베이스가 어플리케이션에   필수 적인 부분임
데이터베이스와 엮이면 어려운 점

테스트 픽스처의 영속성이
   변덕스러운 테스트/애매한 테스트
   반복 안 되는 테스트/서로 반응하는 테스트

DB엯결을 위해 픽스처를 공유하여
   엮인 테스트 (서로 반응하는 테스트)
   DB 샌드박스가 없다면 테스트 젂쟁이 발생됨

DB엯결에 대한 커다란 일반 픽스처를 유발시켜
   테스트에서 명시하는 것을 알기 어렵게 함
데이터베이스 없이 테스트 하기

레이어 소프트웨어 아키텍처를 사용한다면
데이터베이스를 사용하지 않고 비지로직을 테스트함

How?
 비즈니스 로직의 하위 레이어를 테스트 대역으로 사용
패턴

데이터 베이스 샌드박스
저장 프로시저 테스트
테이블 삭제 해체
트랜잭션 롤백 해체
데이터 베이스 샌드박스
개발자, 테스트 별로 다른 테스트용
데이터 베이스 제공
데이터 베이스 샌드박스

할 수 있는 것
  테스트 실행 전쟁 방지



할 수 없는 것
  반복 안 되는 테스트
  서로 반응 하는 테스트
데이터 베이스 샌드박스
전용 데이터 베이스 샌드박스

테스트 실행기별 데이터베이스 스키마

데이터베이스 분할 스키마
패턴

데이터 베이스 샌드박스
저장 프로시저 테스트
테이블 삭제 해체
트랜잭션 롤백 해체
저장 프로시저 테스트
저장 프로시저 별로 완전 자동 테스트를 작성한다
저장 프로시저 테스트


복잡한 로직이 들어가 있는 테스트에 대해서는
항상 저장 테스트 작성

일반적 테스트처럼
  호출 조건과 기대 결과를 나연함
저장 프로시저 테스트
데이터 베이스 내 저장 프로시저 테스트
   프로시저 언어로 테스트 작성
   데이터 베이스 개발팀에서 직접 작성할 경우
   최근 DB는 C#과 JAVA등도 사용 가능함

원격 저장 프로시저 테스트
   원격에서 프로시저 호출을 수행
   프로시저 호출의 호출과 결과를 검증하는 왕복 테스트
패턴

데이터 베이스 샌드박스
저장 프로시저 테스트
테이블 삭제 해체
트랜잭션 롤백 해체
테이블 삭제 해체

테스트에서 픽스처를 해체하기 위해
변경된 테이블을   삭제한다
테이블 삭제 해체

트랜젝션 롤백으로 처리가 불가능 한 경우 사용됨
   매우 긴 트랜젝션 유발
   롤백을 하여도 남아 있는 픽스처가 생김

테스트 실행기별 데이터베이스 스키마로 사용되는 경우 이상적

트랜잭션이 지원되지 않는 데이터 베이스인 경우

델타 단언문을 사용하면 별도 해제가 필요하지 않을 수도 있음
테이블 삭제 해체
테이블 데이터 삭제시에 엯관된 테이블도 고려 해야 함

구현 방법(P.837)
    테이블 삭제 해체 테스트
    지엯 해체 테스트
    SQL로 테이블 삭제 해체
    ORM으로 테이블 삭제 해체
패턴

데이터 베이스 샌드박스
저장 프로시저 테스트
테이블 삭제 해체
트랜잭션 롤백 해체
트랜잭션 롤백 해체
해체하기 위해 커밋 하지 않은 테스트 트랜잭션을 롤백한다
트랜잭션 롤백 해체

트랜젝션 롤백을 지원하는 데이터베이스에서만 사용 될 수 있음

테스트 실행이 되어도 언제다 동일한 데이터 상태를 보장함

테이블 삭제 해체 보다는 적용 쉬움

테스트나 테스트 코드에서 데이터를 커밋 할 수 없음
트랜잭션 롤백 해체
객체 트랜잭션 롤백
public void testGetFlightsByOrigin_NoInboundFlight_TRBTD()
throws Exception {
           // Fixture Setup
           TransactionManager.beginTransaction();
           BigDecimal outboundAirport = createTestAirport("1OF");
           BigDecimal inboundAirport = null;
           FlightDto expectedFlightDto = null;
           try {
                       inboundAirport = createTestAirport("1IF");
                       expectedFlightDto =
                       createTestFlight( outboundAirport, inboundAirport);
                       // Exercise System
                       List flightsAtDestination1 =
                       facade.getFlightsByOriginAirport(inboundAirport);
                       // Verify Outcome
                       assertEquals(0,flightsAtDestination1.size());
           } finally {
                       TransactionManager.abortTransaction();
           }
}
트랜잭션 롤백 해체
데이터 베이스 트랜잭션 롤백
[TestFixture]
public class TransactionRollbackTearDownTest                  [Test]
{                                                             public void AnNUnitTest()
               private SqlConnection _Connection;             {
               private SqlTransaction _Transaction;           const string C_INSERT_SQL =
       [Setup]                                                "INSERT INTO Invoice(Amount, Tax, CustomerId)" +
       public void Setup()                                    " VALUES({0}, {1}, {2})";
       {                                                      SqlCommand cmd = _Connection.CreateCommand();
       string dbConnectionString = ConfigurationSettings.     cmd.Transaction = _Transaction;
       AppSettings.Get("DbConnectionString");                 cmd.CommandText = string.Format(
       _Connection = new SqlConnection(dbConnectionString);   C_INSERT_SQL,
       _Connection.Open();                                    new object[] {"100.00", "7.00", 2001});
       _Transaction = _Connection.BeginTransaction();         // Exercise SUT
       }                                                      cmd.ExecuteNonQuery();
       [TearDown]                                             // Verify result
       public void TearDown()                                 // etc.
       {                                                      }
       _Transaction.Rollback();                               {
       _Connection.Close();
       // Avoid NUnit "instance behavior" bug
       _Transaction = null;
       _Connection = null;
       }
데이터베이스로 테스트 하기 (한번 더!)

가능한 레이어로 나누고 실제 데이터 베이스에 접근하지 않도록 하자

데이터 베이스엯동은 ‘가능한 적게, 하지만 너무 적지도 않게’
    고객테스트 중 대표적인 것 하나 정도 뽑아 테스트
정리
대부분 소프트웨가 데이터 베이스와 엯계 되므로 테스트는
필수 불가견 하다.
데이터 베이스와 엯동 되는 테스트는 매우 느리다
가능한 레이어 아키텍트들을 적용하여 실제 데이터 베이스와 통신하지
않도록 구성을 해야된다.
직접 데이터 베이스와 통신을 해야 된다면 다음의 패턴을 사용 하자
    데이터베이스 샌드 박스
    저장프로시저 테스트
    테이블 삭제 해제
    트랜잭션 롤백 해제

Más contenido relacionado

La actualidad más candente

Android xml parsing
Android xml parsingAndroid xml parsing
Android xml parsingSangon Lee
 
Oracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameterOracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameter엑셈
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
NLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracleNLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracle엑셈
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGDG Korea
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple OverviewKim Hunmin
 
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Spring test mvc 발표자료
Spring test mvc 발표자료Spring test mvc 발표자료
Spring test mvc 발표자료수홍 이
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1성일 한
 
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)Suwon Chae
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기OnGameServer
 
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 

La actualidad más candente (19)

Android xml parsing
Android xml parsingAndroid xml parsing
Android xml parsing
 
Oracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameterOracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameter
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
NLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracleNLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracle
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android Looper
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
 
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
Spring test mvc 발표자료
Spring test mvc 발표자료Spring test mvc 발표자료
Spring test mvc 발표자료
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1
 
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 

Destacado

03애니메이션s
03애니메이션s03애니메이션s
03애니메이션sInHee Kim
 
웹데이터베이스 01주차-강의 개요
웹데이터베이스 01주차-강의 개요웹데이터베이스 01주차-강의 개요
웹데이터베이스 01주차-강의 개요Yoonwhan Lee
 
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기위키북스
 
하루 안에 페이스북 웹 앱 만들기
하루 안에 페이스북 웹 앱 만들기하루 안에 페이스북 웹 앱 만들기
하루 안에 페이스북 웹 앱 만들기YongHui Lee
 
KGC 2013 - 5일만에 레벨 디자인하기
KGC 2013 - 5일만에 레벨 디자인하기KGC 2013 - 5일만에 레벨 디자인하기
KGC 2013 - 5일만에 레벨 디자인하기용태 이
 
앱 디자인 시작하기
앱 디자인 시작하기앱 디자인 시작하기
앱 디자인 시작하기Sangho Lee
 
사례로 본 모바일 웹/앱 기획, 제작 과정 및 포인트
사례로 본 모바일 웹/앱 기획, 제작 과정 및 포인트사례로 본 모바일 웹/앱 기획, 제작 과정 및 포인트
사례로 본 모바일 웹/앱 기획, 제작 과정 및 포인트mosaicnet
 

Destacado (7)

03애니메이션s
03애니메이션s03애니메이션s
03애니메이션s
 
웹데이터베이스 01주차-강의 개요
웹데이터베이스 01주차-강의 개요웹데이터베이스 01주차-강의 개요
웹데이터베이스 01주차-강의 개요
 
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
 
하루 안에 페이스북 웹 앱 만들기
하루 안에 페이스북 웹 앱 만들기하루 안에 페이스북 웹 앱 만들기
하루 안에 페이스북 웹 앱 만들기
 
KGC 2013 - 5일만에 레벨 디자인하기
KGC 2013 - 5일만에 레벨 디자인하기KGC 2013 - 5일만에 레벨 디자인하기
KGC 2013 - 5일만에 레벨 디자인하기
 
앱 디자인 시작하기
앱 디자인 시작하기앱 디자인 시작하기
앱 디자인 시작하기
 
사례로 본 모바일 웹/앱 기획, 제작 과정 및 포인트
사례로 본 모바일 웹/앱 기획, 제작 과정 및 포인트사례로 본 모바일 웹/앱 기획, 제작 과정 및 포인트
사례로 본 모바일 웹/앱 기획, 제작 과정 및 포인트
 

Similar a 데이터베이스패턴

Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Testbeom kyun choi
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기Heo Seungwook
 
10장 결과 검증
10장 결과 검증10장 결과 검증
10장 결과 검증dagri82
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationHyuncheol Jeon
 
스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기 스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기 Chanwook Park
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅NAVER D2
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화AnselmKim
 
제1회 Tech Net Sql Server 2005 T Sql Enhancements
제1회 Tech Net Sql Server 2005 T Sql Enhancements제1회 Tech Net Sql Server 2005 T Sql Enhancements
제1회 Tech Net Sql Server 2005 T Sql Enhancementsbeamofhope
 
Naver api for android
Naver api for androidNaver api for android
Naver api for androidSangon Lee
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙Hong Hyo Sang
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블YongEun Choi
 
Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Hyosang Hong
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 

Similar a 데이터베이스패턴 (20)

Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
10장 결과 검증
10장 결과 검증10장 결과 검증
10장 결과 검증
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
 
스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기 스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
TEST?
TEST?TEST?
TEST?
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화
 
제1회 Tech Net Sql Server 2005 T Sql Enhancements
제1회 Tech Net Sql Server 2005 T Sql Enhancements제1회 Tech Net Sql Server 2005 T Sql Enhancements
제1회 Tech Net Sql Server 2005 T Sql Enhancements
 
Cygnus unit test
Cygnus unit testCygnus unit test
Cygnus unit test
 
Naver api for android
Naver api for androidNaver api for android
Naver api for android
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
miss_pattern_v2
miss_pattern_v2miss_pattern_v2
miss_pattern_v2
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블
 
Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 

Más de Suan Lee

HTML5 & CSS 살펴보기
HTML5 & CSS  살펴보기HTML5 & CSS  살펴보기
HTML5 & CSS 살펴보기Suan Lee
 
Pmp 자격증 도전기
Pmp 자격증 도전기Pmp 자격증 도전기
Pmp 자격증 도전기Suan Lee
 
ApprenticeshipPatterns/Chapter5
ApprenticeshipPatterns/Chapter5ApprenticeshipPatterns/Chapter5
ApprenticeshipPatterns/Chapter5Suan Lee
 
maven 소개
maven 소개maven 소개
maven 소개Suan Lee
 
Spring IoC
Spring IoCSpring IoC
Spring IoCSuan Lee
 

Más de Suan Lee (6)

HTML5 & CSS 살펴보기
HTML5 & CSS  살펴보기HTML5 & CSS  살펴보기
HTML5 & CSS 살펴보기
 
Pmp 자격증 도전기
Pmp 자격증 도전기Pmp 자격증 도전기
Pmp 자격증 도전기
 
ApprenticeshipPatterns/Chapter5
ApprenticeshipPatterns/Chapter5ApprenticeshipPatterns/Chapter5
ApprenticeshipPatterns/Chapter5
 
maven 소개
maven 소개maven 소개
maven 소개
 
Maven
MavenMaven
Maven
 
Spring IoC
Spring IoCSpring IoC
Spring IoC
 

데이터베이스패턴

  • 1. 데이터베이스 와 테스트 13장/25장 이수안(inch772@naver.com) 아꿈사 (http://cafe.naver.com/architect1.c afe)
  • 2. 데이터 베이스 없이 테스트 할 수 있다면 수단과 방법을 가리지 마라!
  • 3. 데이터 베이스 없이 테스트 할 수 있다면 수단과 방법을 가리지 마라! Why?데이터베이스를 사용하는 테스트는 그렇지 않는 테스트 보다 20배 이상 느리다
  • 4. 하지만 무시하고 테스트 안 할 수도 없는 없다!
  • 5. 하지만 무시하고 테스트 안 할 수도 없는 없다! Why? 대부분 데이터 베이스가 어플리케이션에 필수 적인 부분임
  • 6. 데이터베이스와 엮이면 어려운 점 테스트 픽스처의 영속성이 변덕스러운 테스트/애매한 테스트 반복 안 되는 테스트/서로 반응하는 테스트 DB엯결을 위해 픽스처를 공유하여 엮인 테스트 (서로 반응하는 테스트) DB 샌드박스가 없다면 테스트 젂쟁이 발생됨 DB엯결에 대한 커다란 일반 픽스처를 유발시켜 테스트에서 명시하는 것을 알기 어렵게 함
  • 7. 데이터베이스 없이 테스트 하기 레이어 소프트웨어 아키텍처를 사용한다면 데이터베이스를 사용하지 않고 비지로직을 테스트함 How? 비즈니스 로직의 하위 레이어를 테스트 대역으로 사용
  • 8. 패턴 데이터 베이스 샌드박스 저장 프로시저 테스트 테이블 삭제 해체 트랜잭션 롤백 해체
  • 9. 데이터 베이스 샌드박스 개발자, 테스트 별로 다른 테스트용 데이터 베이스 제공
  • 10. 데이터 베이스 샌드박스 할 수 있는 것 테스트 실행 전쟁 방지 할 수 없는 것 반복 안 되는 테스트 서로 반응 하는 테스트
  • 11. 데이터 베이스 샌드박스 전용 데이터 베이스 샌드박스 테스트 실행기별 데이터베이스 스키마 데이터베이스 분할 스키마
  • 12. 패턴 데이터 베이스 샌드박스 저장 프로시저 테스트 테이블 삭제 해체 트랜잭션 롤백 해체
  • 13. 저장 프로시저 테스트 저장 프로시저 별로 완전 자동 테스트를 작성한다
  • 14. 저장 프로시저 테스트 복잡한 로직이 들어가 있는 테스트에 대해서는 항상 저장 테스트 작성 일반적 테스트처럼 호출 조건과 기대 결과를 나연함
  • 15. 저장 프로시저 테스트 데이터 베이스 내 저장 프로시저 테스트 프로시저 언어로 테스트 작성 데이터 베이스 개발팀에서 직접 작성할 경우 최근 DB는 C#과 JAVA등도 사용 가능함 원격 저장 프로시저 테스트 원격에서 프로시저 호출을 수행 프로시저 호출의 호출과 결과를 검증하는 왕복 테스트
  • 16. 패턴 데이터 베이스 샌드박스 저장 프로시저 테스트 테이블 삭제 해체 트랜잭션 롤백 해체
  • 17. 테이블 삭제 해체 테스트에서 픽스처를 해체하기 위해 변경된 테이블을 삭제한다
  • 18. 테이블 삭제 해체 트랜젝션 롤백으로 처리가 불가능 한 경우 사용됨 매우 긴 트랜젝션 유발 롤백을 하여도 남아 있는 픽스처가 생김 테스트 실행기별 데이터베이스 스키마로 사용되는 경우 이상적 트랜잭션이 지원되지 않는 데이터 베이스인 경우 델타 단언문을 사용하면 별도 해제가 필요하지 않을 수도 있음
  • 19. 테이블 삭제 해체 테이블 데이터 삭제시에 엯관된 테이블도 고려 해야 함 구현 방법(P.837) 테이블 삭제 해체 테스트 지엯 해체 테스트 SQL로 테이블 삭제 해체 ORM으로 테이블 삭제 해체
  • 20. 패턴 데이터 베이스 샌드박스 저장 프로시저 테스트 테이블 삭제 해체 트랜잭션 롤백 해체
  • 21. 트랜잭션 롤백 해체 해체하기 위해 커밋 하지 않은 테스트 트랜잭션을 롤백한다
  • 22. 트랜잭션 롤백 해체 트랜젝션 롤백을 지원하는 데이터베이스에서만 사용 될 수 있음 테스트 실행이 되어도 언제다 동일한 데이터 상태를 보장함 테이블 삭제 해체 보다는 적용 쉬움 테스트나 테스트 코드에서 데이터를 커밋 할 수 없음
  • 23. 트랜잭션 롤백 해체 객체 트랜잭션 롤백 public void testGetFlightsByOrigin_NoInboundFlight_TRBTD() throws Exception { // Fixture Setup TransactionManager.beginTransaction(); BigDecimal outboundAirport = createTestAirport("1OF"); BigDecimal inboundAirport = null; FlightDto expectedFlightDto = null; try { inboundAirport = createTestAirport("1IF"); expectedFlightDto = createTestFlight( outboundAirport, inboundAirport); // Exercise System List flightsAtDestination1 = facade.getFlightsByOriginAirport(inboundAirport); // Verify Outcome assertEquals(0,flightsAtDestination1.size()); } finally { TransactionManager.abortTransaction(); } }
  • 24. 트랜잭션 롤백 해체 데이터 베이스 트랜잭션 롤백 [TestFixture] public class TransactionRollbackTearDownTest [Test] { public void AnNUnitTest() private SqlConnection _Connection; { private SqlTransaction _Transaction; const string C_INSERT_SQL = [Setup] "INSERT INTO Invoice(Amount, Tax, CustomerId)" + public void Setup() " VALUES({0}, {1}, {2})"; { SqlCommand cmd = _Connection.CreateCommand(); string dbConnectionString = ConfigurationSettings. cmd.Transaction = _Transaction; AppSettings.Get("DbConnectionString"); cmd.CommandText = string.Format( _Connection = new SqlConnection(dbConnectionString); C_INSERT_SQL, _Connection.Open(); new object[] {"100.00", "7.00", 2001}); _Transaction = _Connection.BeginTransaction(); // Exercise SUT } cmd.ExecuteNonQuery(); [TearDown] // Verify result public void TearDown() // etc. { } _Transaction.Rollback(); { _Connection.Close(); // Avoid NUnit "instance behavior" bug _Transaction = null; _Connection = null; }
  • 25. 데이터베이스로 테스트 하기 (한번 더!) 가능한 레이어로 나누고 실제 데이터 베이스에 접근하지 않도록 하자 데이터 베이스엯동은 ‘가능한 적게, 하지만 너무 적지도 않게’ 고객테스트 중 대표적인 것 하나 정도 뽑아 테스트
  • 26. 정리 대부분 소프트웨가 데이터 베이스와 엯계 되므로 테스트는 필수 불가견 하다. 데이터 베이스와 엯동 되는 테스트는 매우 느리다 가능한 레이어 아키텍트들을 적용하여 실제 데이터 베이스와 통신하지 않도록 구성을 해야된다. 직접 데이터 베이스와 통신을 해야 된다면 다음의 패턴을 사용 하자 데이터베이스 샌드 박스 저장프로시저 테스트 테이블 삭제 해제 트랜잭션 롤백 해제