데이터베이스패턴

26
데이터베이스 와 테스트 13/25이수안([email protected] ) 아꿈사 (http://cafe.naver.com/architect1.c afe)

Upload: suan-lee

Post on 29-Jun-2015

817 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 데이터베이스패턴

데이터베이스 와 테스트13장/25장

이수안([email protected])아꿈사

(http://cafe.naver.com/architect1.cafe)

Page 2: 데이터베이스패턴

데이터 베이스 없이 테스트 할 수있다면 수단과 방법을 가리지 마라!

Page 3: 데이터베이스패턴

데이터 베이스 없이 테스트 할 수있다면 수단과 방법을 가리지 마라!

데이터베이스를사용하는테스트는그렇지않는테스트보다

20배 이상느리다

Why?

Page 4: 데이터베이스패턴

하지만 무시하고 테스트안할 수도 없는 없다!

Page 5: 데이터베이스패턴

하지만 무시하고 테스트안할 수도 없는 없다!

대부분데이터베이스가어플리케이션에필수 적인부분임

Why?

Page 6: 데이터베이스패턴

데이터베이스와 엮이면 어려운 점

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

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

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

Page 7: 데이터베이스패턴

데이터베이스 없이 테스트 하기

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

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

Page 8: 데이터베이스패턴

패턴

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

Page 9: 데이터베이스패턴

데이터 베이스 샌드박스

개발자, 테스트 별로 다른 테스트용데이터 베이스 제공

Page 10: 데이터베이스패턴

데이터 베이스 샌드박스

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

할수없는것반복안되는테스트서로반응하는테스트

Page 11: 데이터베이스패턴

데이터 베이스 샌드박스

전용데이터 베이스 샌드박스

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

데이터베이스분할 스키마

Page 12: 데이터베이스패턴

패턴

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

Page 13: 데이터베이스패턴

저장프로시저 테스트

저장 프로시저 별로 완전 자동 테스트를 작성한다

Page 14: 데이터베이스패턴

저장프로시저 테스트

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

일반적 테스트처럼호출 조건과 기대 결과를 나연함

Page 15: 데이터베이스패턴

저장프로시저 테스트

데이터베이스내저장프로시저테스트프로시저언어로테스트작성데이터베이스개발팀에서직접작성할경우최근 DB는 C#과 JAVA등도사용가능함

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

Page 16: 데이터베이스패턴

패턴

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

Page 17: 데이터베이스패턴

테이블 삭제 해체

테스트에서 픽스처를 해체하기 위해

변경된 테이블을 삭제한다

Page 18: 데이터베이스패턴

테이블 삭제 해체

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

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

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

델타단언문을사용하면별도해제가필요하지않을수도있음

Page 19: 데이터베이스패턴

테이블데이터삭제시에엯관된테이블도고려해야함

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

테이블 삭제 해체

Page 20: 데이터베이스패턴

패턴

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

Page 21: 데이터베이스패턴

해체하기위해커밋하지않은테스트트랜잭션을롤백한다

트랜잭션 롤백 해체

Page 22: 데이터베이스패턴

트랜잭션 롤백 해체

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

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

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

테스트나테스트코드에서데이터를커밋할수없음

Page 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();

}

}

Page 24: 데이터베이스패턴

트랜잭션 롤백 해체데이터베이스 트랜잭션롤백

[TestFixture]

public class TransactionRollbackTearDownTest

{

private SqlConnection _Connection;

private SqlTransaction _Transaction;

[Setup]

public void Setup()

{

string dbConnectionString = ConfigurationSettings.

AppSettings.Get("DbConnectionString");

_Connection = new SqlConnection(dbConnectionString);

_Connection.Open();

_Transaction = _Connection.BeginTransaction();

}

[TearDown]

public void TearDown()

{

_Transaction.Rollback();

_Connection.Close();

// Avoid NUnit "instance behavior" bug

_Transaction = null;

_Connection = null;

}

[Test]

public void AnNUnitTest()

{

const string C_INSERT_SQL =

"INSERT INTO Invoice(Amount, Tax, CustomerId)" +

" VALUES({0}, {1}, {2})";

SqlCommand cmd = _Connection.CreateCommand();

cmd.Transaction = _Transaction;

cmd.CommandText = string.Format(

C_INSERT_SQL,

new object[] {"100.00", "7.00", 2001});

// Exercise SUT

cmd.ExecuteNonQuery();

// Verify result

// etc.

}

{

Page 25: 데이터베이스패턴

데이터베이스로테스트하기 (한번더!)

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

데이터베이스엯동은 ‘가능한적게, 하지만너무적지도않게’고객테스트중대표적인것하나정도뽑아테스트

Page 26: 데이터베이스패턴

정리

대부분소프트웨가데이터베이스와엯계되므로 테스트는필수불가견하다.데이터베이스와엯동되는테스트는매우느리다가능한레이어아키텍트들을적용하여실제데이터베이스와통신하지않도록구성을해야된다.직접데이터베이스와통신을해야된다면다음의패턴을사용하자

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