데이터베이스패턴
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

데이터베이스패턴

  • 1,108 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,108
On Slideshare
1,101
From Embeds
7
Number of Embeds
5

Actions

Shares
Downloads
6
Comments
0
Likes
1

Embeds 7

http://parkpd.egloos.com 2
http://soomong.net 2
http://andstudy.com 1
http://soomong.tistory.com 1
http://www.andstudy.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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. 정리 대부분 소프트웨가 데이터 베이스와 엯계 되므로 테스트는 필수 불가견 하다. 데이터 베이스와 엯동 되는 테스트는 매우 느리다 가능한 레이어 아키텍트들을 적용하여 실제 데이터 베이스와 통신하지 않도록 구성을 해야된다. 직접 데이터 베이스와 통신을 해야 된다면 다음의 패턴을 사용 하자 데이터베이스 샌드 박스 저장프로시저 테스트 테이블 삭제 해제 트랜잭션 롤백 해제