문제

예를 들어,내가 쓰기에 대해 테스트를 CsvReader.그것은 간단한 클래스를 열거하고 행 분할의 텍스트입니다.그 존재 이유 무 쉼표에 따옴표입니다.그것보다는 더 적은 페이지입니다.

의"black box"시험 클래스,나는 확인 것처럼

  • 어떤 경우 파일이 존재하지 않는?
  • 무엇을 못하는 경우에는 권한이 있는 파일에 대?
  • 어떤 경우는 파일이 아닌 윈도우 라인가?

그러나 사실 이러한 모든 것은 StreamReader 의 사업이다.내급없이 작동에 대해 아무것도 하는 이러한 경우.그래서 본질적으로,나 테스트는길을 끄는 오류가 발생하여 StreamReader,그리고 동작을 테스트하여 처리합니다.그것은 많은 것 같은 느낌이 든 작업에 대한 아무것도 아니다.

본 관련 질문

나의 질문은,나는 지점"glass box"시험하는 경우 내가 무엇을 알고 사용하기 이 종류의 작동하는가?

도움이 되었습니까?

해결책

이것은 실제로 CSVReader의 인터페이스에 따라 다르므로 클래스 사용자가 기대하는 내용을 고려해야합니다.

예를 들어, 매개 변수 중 하나가 파일 이름이고 파일이 존재하지 않으면 어떻게해야합니까? 스트림 리더를 사용하는지 여부에 따라 달라서는 안됩니다. 단위 테스트는 클래스의 관찰 가능한 외부 동작을 테스트해야하며 경우에 따라 약간 더 깊이 파고 특정 구현 세부 정보가 다루어 지도록해야합니다 (예 : 리더가 완료되면 파일이 닫힙니다.

그러나 장치 테스트가 모든 세부 사항에 의존하거나 구현 세부 사항으로 인해 어떤 일이 발생한다고 가정합니다.

귀하의 질문에서 언급 한 모든 예에는 수업에 대한 관찰 가능한 행동 (이 경우 예외적 인 상황)이 포함되므로 이와 관련된 단위 테스트가 있어야합니다.

다른 팁

나는 당신이 생각하지 않아야하는 시간을 낭비를 테스트하지 않는 것들의 코드입니다.그것은 디자인을 선택하지 않은 테스트를 선택할지 여부를 핸들의 오류를 기본 프레임워크 또는 그들에게 전파를 발신번호를 입력하실 수 있습니다.FWIW,나는 당신이 바로 그들에게 전파니다.일단 당신이 만든 디자인이 결정을 하지만,단위 테스트 커버 코드(그리고 그것을 커버라)테스트 없이 기본 프레임 워크입니다.용 성 주입 고 모의 스트림에는 아마도 좋은 아이디어,너무입니다.

[편집]의 예를 종속 사출(참조 링크를 위한 더 많은 정보)

를 사용하지 않는 종속성 주사 우리는:

public class CvsReader {
   private string filename;
   public CvsReader(string filename)
   {
      this.filename = filename;
   }

   public string Read()
   {
      StreamReader reader = new StreamReader( this.filename );
      string contents = reader.ReadToEnd();
      .... do some stuff with contents...
      return contents;
   }
}

과 함께 종속성을 주입(생성자를 주입)우리는 하:

public class CvsReader {
   private IStream stream;
   public CvsReader( IStream stream )
   {
      this.stream = stream;
   }

   public string Read()
   {
       StreamReader reader = new StreamReader( this.stream );
       string contents = reader.ReadToEnd();
       ...  do some stuff with contents ...
       return contents;
   }
}

이 CvsReader 더 쉽게 검사할 수 있는.우리는 인스턴스 인터페이스를 구현하는 우리에 따라 달라집에서 생성자,이 경우에는 IStream.이 때문에 우리가 만들 수 있는 또 다른 클래스(아마도 모의 클래스)를 구현하는 IStream,그러나지 않는 반드시 하는지 여부를 결정할 수 있을 때까지 I/O.우리가 사용할 수 있는 이 클래스를 공급하는 우리의 독자는 모든 데이터는 원하는 포함하지 않고 어떤 기본 프레임 워크입니다.이 경우에,나는 사용 MemoryStream 때문에 우리는 그냥 읽습니다.에서 우리는 하고 싶었지만,우리가 사용할 수 있는 모의 클래스고 풍부한 인터페이스 할 수있는 우리의 시험을 구성하는 응답이다.이 방법은 우리를 시험할 수 있는 코드를 작성 및을 포함하지 않 기본 프레임워크에 코드를 모두.또한 우리는 또한 전달 TextReader 지만,일반 주입에 의존 패턴을 사용하여 인터페이스 및 보여주고 싶었 패턴으로 인터페이스가 있습니다.틀림없이 전달하 TextReader 더 좋을 것 때문에 위의 코드는 아직도에 따라 달라집 StreamReader 구현합니다.

그렇습니다. 그러나 그것은 단위 테스트의 목적으로 엄격히 다음과 같습니다.

초록 스트림 리더 인터페이스를 정의하고 인터페이스를 구현하는 모의 스트림 리더로 자신의 구현을 테스트하여 특정 스트림 리더의 CSV 리더 구현을 추상화 할 수 있습니다. 모의 독자는 존재하지 않는 파일, 권한 문제, OS 차이 등과 같은 오류에 면역이 될 것입니다. 따라서 전적으로 자신의 코드를 테스트하고 100% 코드 범위를 달성 할 수 있습니다.

TVANFOSSON에 동의하는 경향이 있습니다. StreamReader에서 상속하고 어떤 식 으로든 확장하면 장치 테스트는 추가하거나 변경 한 기능 만 사용해야합니다. 그렇지 않으면, 당신은 많은 시간과인지 에너지 쓰기, 읽기 및 가치를 추가하지 않는 테스트를 낭비 할 것입니다.

Markj는 테스트가 클래스의 "관찰 가능한 외부 행동"을 다루어야한다는 것이 맞지만 고려해야 할 것이 적절하다고 생각합니다. 어디 그 행동은 유래합니다. 다른 (아마도 단위 테스트) 클래스의 상속을 통한 행동이라면 자신의 추가에 이점이 없습니다. 단위 테스트. Otoh, 구성을 통한 행동이라면 그럼 ~할 것 같다 패스 스루가 제대로 작동하는지 확인하기 위해 일부 테스트를 정당화하십시오.

내가 선호하는 것은 당신이 변경하는 특정 기능을 단위 테스트 한 다음 작성하는 것입니다. 완성 오류 조건을 확인하지만 비즈니스 요구 사항의 맥락에서 궁극적으로 지원하는 테스트.

FYI, 이것이 .NET 인 경우 휠을 재창조하지 않아야합니다.

C#

Microsoft.visualBasic에 대한 참조 추가 CSV 구문 분석 요구를 처리하려면 환상적인 클래스 Microsoft.visualBasic.fileio.TextFieldParser ()를 사용하십시오.

Microsoft는 이미 테스트 했으므로 필요하지 않습니다.

즐기다.

항상 프레임 워크가 발생하는 오류를 관리해야합니다. 그렇게하면 응용 프로그램이 강력하고 치명적인 오류에 충돌하지 않습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top