5. 하지만 무시하고 테스트
안 할 수도 없는 없다!
Why?
대부분 데이터 베이스가 어플리케이션에 필수 적인 부분임
6. 데이터베이스와 엮이면 어려운 점
테스트 픽스처의 영속성이
변덕스러운 테스트/애매한 테스트
반복 안 되는 테스트/서로 반응하는 테스트
DB엯결을 위해 픽스처를 공유하여
엮인 테스트 (서로 반응하는 테스트)
DB 샌드박스가 없다면 테스트 젂쟁이 발생됨
DB엯결에 대한 커다란 일반 픽스처를 유발시켜
테스트에서 명시하는 것을 알기 어렵게 함
7. 데이터베이스 없이 테스트 하기
레이어 소프트웨어 아키텍처를 사용한다면
데이터베이스를 사용하지 않고 비지로직을 테스트함
How?
비즈니스 로직의 하위 레이어를 테스트 대역으로 사용
14. 저장 프로시저 테스트
복잡한 로직이 들어가 있는 테스트에 대해서는
항상 저장 테스트 작성
일반적 테스트처럼
호출 조건과 기대 결과를 나연함
15. 저장 프로시저 테스트
데이터 베이스 내 저장 프로시저 테스트
프로시저 언어로 테스트 작성
데이터 베이스 개발팀에서 직접 작성할 경우
최근 DB는 C#과 JAVA등도 사용 가능함
원격 저장 프로시저 테스트
원격에서 프로시저 호출을 수행
프로시저 호출의 호출과 결과를 검증하는 왕복 테스트
18. 테이블 삭제 해체
트랜젝션 롤백으로 처리가 불가능 한 경우 사용됨
매우 긴 트랜젝션 유발
롤백을 하여도 남아 있는 픽스처가 생김
테스트 실행기별 데이터베이스 스키마로 사용되는 경우 이상적
트랜잭션이 지원되지 않는 데이터 베이스인 경우
델타 단언문을 사용하면 별도 해제가 필요하지 않을 수도 있음
19. 테이블 삭제 해체
테이블 데이터 삭제시에 엯관된 테이블도 고려 해야 함
구현 방법(P.837)
테이블 삭제 해체 테스트
지엯 해체 테스트
SQL로 테이블 삭제 해체
ORM으로 테이블 삭제 해체
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. 정리
대부분 소프트웨가 데이터 베이스와 엯계 되므로 테스트는
필수 불가견 하다.
데이터 베이스와 엯동 되는 테스트는 매우 느리다
가능한 레이어 아키텍트들을 적용하여 실제 데이터 베이스와 통신하지
않도록 구성을 해야된다.
직접 데이터 베이스와 통신을 해야 된다면 다음의 패턴을 사용 하자
데이터베이스 샌드 박스
저장프로시저 테스트
테이블 삭제 해제
트랜잭션 롤백 해제