Debug.Assert가 올바른 선택이 될 수있는 경우를 4 개 더 추가 할 것이라고 생각했습니다.
1) 여기에 언급되지 않은 내용은 자동화 된 테스트 중에 Asserts가 제공 할 수 있는 추가 개념 적용 범위 입니다. 간단한 예로서 :
추가 시나리오를 처리하기 위해 코드 범위를 확장했다고 생각하는 작성자가 상위 레벨 발신자를 수정하면 이상적으로는 (!)이 새로운 조건을 다루기 위해 단위 테스트를 작성합니다. 그러면 완전히 통합 된 코드가 제대로 작동하는 것처럼 보일 수 있습니다.
그러나 실제로 미묘한 결함이 도입되었지만 테스트 결과에서는 감지되지 않았습니다. 호출 수신자는이 경우 비 결정적되고, 오직 한 일이 예상 된 결과를 제공 할 수 있습니다. 또는 눈에 띄지 않는 반올림 오류가 발생했을 수 있습니다. 또는 다른 곳에서 똑같이 오프셋 된 오류가 발생했습니다. 또는 요청 된 액세스뿐만 아니라 부여되어서는 안되는 추가 권한이 부여됩니다. 기타.
이 시점에서 단위 테스트로 구동되는 새로운 사례 (또는 엣지 케이스)와 결합 된 수신자에 포함 된 Debug.Assert () 문은 테스트 중에 원래 작성자의 가정이 무효화되었으며 코드가 추가 검토없이 릴리스됩니다. 단위 테스트를 통한 주장은 완벽한 파트너입니다.
2) 또한 일부 테스트는 작성이 간단하지만 초기 가정을 고려할 때 비용이 많이 들고 불필요합니다 . 예를 들면 다음과 같습니다.
특정 보안 진입 점에서만 개체에 액세스 할 수있는 경우 모든 개체 메서드에서 네트워크 권한 데이터베이스에 대한 추가 쿼리를 작성하여 호출자에게 권한을 부여해야합니까? 분명히 아니다. 아마도 이상적인 솔루션에는 캐싱 또는 다른 기능 확장이 포함되지만 디자인에는 필요하지 않습니다. 개체가 안전하지 않은 진입 점에 연결되면 Debug.Assert ()가 즉시 표시됩니다.
3) 다음으로 경우에 따라 릴리스 모드로 배포 할 때 제품의 일부 또는 전체 작업에 유용한 진단 상호 작용이 없을 수도 있습니다 . 예를 들면 다음과 같습니다.
임베디드 실시간 장치라고 가정하십시오. 잘못된 패킷을 발견하면 예외를 던지고 다시 시작하는 것이 비생산적입니다. 대신, 장치는 출력에서 렌더링 노이즈 지점까지 최선의 노력으로 이익을 얻을 수 있습니다. 또한 릴리스 모드에서 배포 할 때 휴먼 인터페이스, 로깅 장치가 없거나 사람이 물리적으로 액세스 할 수 없으며 동일한 출력을 평가하여 오류를 가장 잘 인식 할 수 있습니다. 이 경우 자유 주장 및 철저한 시험판 테스트가 예외보다 더 중요합니다.
4) 마지막으로, 수취인이 매우 신뢰할 수있는 것으로 인식되기 때문에 일부 테스트는 불필요합니다 . 대부분의 경우 재사용 가능한 코드가 많을수록 신뢰할 수있는 노력을 기울였습니다. 따라서 발신자의 예기치 않은 매개 변수는 예외이지만 수신자의 예기치 않은 결과는 Assert가 일반적입니다. 예를 들면 다음과 같습니다.
검색 조건을 찾을 수 없을 때 핵심 String.Find
작업이 상태를 반환하면 -1
3이 아닌 하나의 작업을 안전하게 수행 할 수 있습니다. 그러나 실제로 반환 된 경우 -2
합리적인 조치가 없을 수 있습니다. 더 간단한 계산을 -1
값을 별도로 테스트하는 계산으로 바꾸는 것은 도움이되지 않으며 대부분의 릴리스 환경에서는 코드를 버리기 때문에 코어 라이브러리가 예상대로 작동하는지 테스트하지 않아도됩니다. 이 경우 어설 션이 이상적입니다.