코드베이스 어딘가에 원격 DB에 연결하는 실제 작업을 수행하는 코드 줄이 있습니다. 이 코드 라인은 10 번 중 9 번이며, 언어 및 환경에 특정한 런타임 라이브러리가 제공하는 "내장"메소드를 호출합니다. 따라서 "귀하의"코드가 아니므로 테스트 할 필요가 없습니다. 단위 테스트의 목적으로이 메소드 호출이 올바르게 수행 될 것임을 신뢰할 수 있습니다. 단위 테스트 스위트에서 테스트 할 수있는 것과해야 할 일은 연결 문자열이 올바른지 확인하는 것과 같이이 호출에 사용될 매개 변수가 올바른지 확인하는 것과 같은 것입니다. 저장 프로 시저 이름
이것은 단위 테스트가 런타임을 "샌드 박스"로 두지 말고 외부 상태에 의존하지 않아야한다는 제한의 목적 중 하나입니다. 실제로는 매우 실용적입니다. 단위 테스트의 목적은 작성한 코드 (또는 TDD로 작성하려고 하는 코드 )가 생각한대로 동작하는지 확인하는 것입니다. 데이터베이스 작업을 수행하는 데 사용하는 라이브러리와 같이 작성하지 않은 코드는 작성하지 않은 매우 간단한 이유로 단위 테스트 범위에 포함되어서는 안됩니다.
당신의에서 통합 테스트 스위트, 이러한 제한은 완화된다. 지금 당신 은 할 수 있습니다작성했던 코드가 그렇지 않은 코드와 잘 작동하는지 확인하기 위해 데이터베이스를 터치하는 디자인 테스트. 그러나이 두 테스트 스위트는 분리 된 상태를 유지해야합니다. 단위 테스트 스위트는 실행 속도가 빠를수록 더 효과적이므로 (개발자가 코드에 대해 작성한 모든 어설 션이 여전히 보유 중인지 신속하게 확인할 수 있음) 거의 통합 테스트 외부 리소스에 대한 종속성이 추가되어 수십 배 느려집니다. 빌드-봇이 몇 시간마다 전체 통합 제품군 실행을 처리하고 외부 리소스를 잠그는 테스트를 실행하여 개발자가 동일한 테스트를 로컬로 실행하여 서로 발가락을 밟지 않도록하십시오. 그리고 빌드가 중단되면 어떻게해야합니까? 빌드-봇이 빌드보다 실패하지 않도록하는 것이 훨씬 더 중요합니다.
이제이를 엄격하게 준수하는 방법은 데이터베이스에 연결하고 쿼리하기위한 정확한 전략에 달려 있습니다. "맨손"데이터 액세스 프레임 워크 (예 : ADO.NET의 SqlConnection 및 SqlStatement 개체)를 사용해야하는 많은 경우에, 사용자가 개발 한 전체 메서드는 기본 제공 메서드 호출 및 이 상황에서 할 수있는 최선의 방법은 전체 기능을 모의하고 통합 테스트 스위트를 신뢰하는 것입니다. 또한 테스트 목적으로 특정 코드 줄을 대체 할 수 있도록 클래스를 어떻게 설계 할 것인지에 달려 있습니다 (예 : "부분적 모의"을 허용하기 때문에 Tobi의 템플릿 메소드 패턴 제안).
데이터 지속성 모델이 데이터 계층의 코드 (예 : 트리거, 저장 프로 시저 등)에 의존하는 경우 데이터 계층 내부에 존재하거나 교차하는 테스트를 개발하는 것 외에 직접 작성하는 코드를 실행하는 다른 방법은 없습니다. 애플리케이션 런타임과 DBMS 간의 경계. 순수 주의자는 이런 이유로 ORM과 같은 것을 선호하여이 패턴을 피해야한다고 말합니다. 나는 그렇게 멀리 갈 것이라고 생각하지 않습니다. 언어 통합 쿼리 및 기타 컴파일러 확인, 도메인 종속 지속성 작업 시대에도 데이터베이스를 저장 프로 시저를 통해 노출 된 작업으로 만 잠그는 것의 가치를 보았으며 물론 이러한 저장 프로시 저는 자동화를 사용하여 확인해야합니다. 테스트. 그러나 이러한 테스트는 단위 테스트 가 아닙니다 . 그들은 통합입니다 테스트.
이 차이에 문제가있는 경우 일반적으로 "단위 테스트 적용 범위"라고하는 완전한 "코드 적용 범위"에 중점을 둡니다. 코드의 모든 줄을 단위 테스트로 처리하고 싶습니다. 얼굴에 고귀한 목표이지만, 나는 hogwash를 말한다; 사고는 실행되지만 그렇지 않은 쓰기 assertionless 테스트까지이 특정 사건을 넘어 스트레칭 안티 패턴,라는 것으로한다는 운동을귀하의 코드. 적용 범위를 위해서만 이러한 유형의 최종 실행은 최소 적용 범위를 완화하는 것보다 더 위험합니다. 코드베이스의 모든 라인이 자동화 된 테스트에 의해 실행되도록하려면 간단합니다. 코드 커버리지 메트릭을 계산할 때는 통합 테스트를 포함하십시오. 한 걸음 더 나아가 이의 제기 된 "Itino"테스트 ( "이름 만 통합")를 분리 할 수 있으며, 유닛 테스트 스위트와이 통합 테스트의 하위 범주 (아직 합리적으로 빠르게 실행되어야 함) 사이에서 대담해야합니다. 전체 범위에 가깝습니다.