2010-12-09 5 views
18

TDD를 배우려고하는데, 쓸 필요가있는 작은 앱으로 테스트하는 방법에 대해 머리 글자를 쓰는 데 어려움을 겪고 있습니다.간단한 예제로 TDD 학습하기

는 사용자로부터 CSV 파일의 위치, 워드 문서 편지 병합 템플릿의 위치와 출력 위치를 취할 필요가있다 : 다음

앱의 (단순화 다소) 사양

이다.

그러면 앱이 csv 파일을 읽고 각 행에 대해 단어 템플릿과 데이터를 병합하고 지정된 폴더로 출력합니다.

그냥 분명히 말해서, 나는 방금 나가서 시작한 경우 어떻게해야 하는지를 알고 있다고 확신하면서 그러한 응용 프로그램을 코딩하는 방법에 대해 묻지 않습니다. 하지만 TDD를 사용하여 테스트를 수행하려는 경우 실제 csv 파일을 테스트하거나 병합을 수행하는 타사 구성 요소를 테스트하지 않으려는 것으로 추측하고 있습니다. pdf로 변환하십시오.

저는 몇 가지 일반적인 TDD 안내가 큰 도움이 될 것이라고 생각합니다!

답변

26

나는 당신의 prog의 각 단계에 대한 시나리오를 생각해 내기 시작할 것입니다. 램, 실패 사례와 자신의 예상 행동을 시작 :

  • 사용자가 널 csv 파일의 위치를 ​​제공하는 것은 (AN ArgumentNullException를 throw).

  • 사용자가 빈 csv 파일 위치를 제공합니다 (ArgumentException을 던짐).

  • 사용자가 지정한 csv 파일이 존재하지 않습니다 (적절하다고 생각되는 모든 것).

그런 다음 각 시나리오에 대한 테스트를 작성하여 실패하는지 확인하십시오. 다음으로, 테스트 통과를위한 충분한 코드를 작성하십시오. 그 후

public class Merger { 
    public void Merge(string csvPath, string templatePath, string outputPath) { 
     if (csvPath == null) { throw new ArgumentNullException("csvPath"); } 
    } 
} 

표준 시나리오로 이동 :

  • 지정된 CSV 파일이 테스트 통과를 만드는 코드가 종종 최종 코드이기 때문에 즉, 이러한 조건 중 일부에 대한 아주 쉽게 한 줄 (병합은 한 번 호출되어야하며, 출력은 예상 된 위치에 기록되어야 함).

  • 지정된 csv 파일에는 두 줄이 있습니다 (병합을 두 번 호출해야하며 예상 된 위치에 출력됩니다).

  • 출력 파일의 이름은 사용자의 기대치에 따라 달라집니다.

등등. 이 두 번째 단계가되면 스텁하고 조롱하려는 동작을 식별하기 시작합니다. 예를 들어, 파일이 존재하는지 여부를 확인합니다. .NET에서는 쉽게 스텁하는 것이 아니므로 실제 파일 시스템에서 프로그램을 분리 할 수있는 어댑터 인터페이스와 클래스를 작성해야합니다 (예 : 실제 CSV 파일과 편지 병합 템플릿에 대해서는 아무 것도 말하지 않습니다.) 이 사용할 수있는 다른 방법이 있지만,이 방법은 매우 표준입니다 :

public interface IFileFinder { bool FileExists(string path); } 

// Concrete implementation to use in production 
public class FileFinder: IFileFinder { 
    public bool FileExists(string path) { return File.Exists(path); } 
} 

public class Merger { 
    IFileFinder finder; 
    public Merger(IFileFinder finder) { this.finder = finder; } 
} 

테스트에서, 당신은 스텁 구현을 전달합니다 :

[Test] 
[ExpectedException(typeof(FileNotFoundException))] 
public void Fails_When_Csv_File_Does_Not_Exist() { 

    IFileFinder finder = mockery.NewMock<IFileFinder>(); 
    Merger  merger = new Merger(finder); 
    Stub.On(finder).Method("FileExists").Will(Return.Value(false)); 

    merger.Merge("csvPath", "templatePath", "outputPath"); 
} 
+1

아주 좋은 구체적인 예! – Davy8

2

단위 테스트를하려면 클래스를 종속성에서 분리하여 클래스 자체를 효과적으로 테스트 할 수 있어야합니다.

이렇게하려면 클래스에 종속성을 주입해야합니다. 일반적으로 의존성 인터페이스를 구현하는 객체를 생성자의 클래스에 전달하여이 작업을 수행합니다.

조롱 프레임 워크는 테스트 중에 클래스가 호출 할 수있는 종속성의 모의 인스턴스를 만드는 데 사용됩니다. 의존성과 같은 방식으로 작동하도록 mock을 정의한 다음 테스트가 끝나면 상태를 확인합니다.

Rhino mock을 가지고 놀고 설명서의 예제를 통해이 작동 방식에 대한 느낌을 얻으시기 바랍니다.

http://ayende.com/projects/rhino-mocks.aspx

5

간단한 일반적인 지침 :

  • 가 먼저 단위 테스트를 작성. 처음에는 모두 실패합니다.
  • 그런 다음 테스트 의 클래스로 이동하여 각 메서드가 과 관련된 테스트가 통과 될 때까지 코드를 작성합니다.
  • 모든 공개 방법 (예 : )에 대해 이렇게하십시오.

단위 테스트를 작성하면 실제로 요구 사항을 지정하지만 다른 형식으로는 코드를 쉽게 읽을 수 있습니다.

다른 각도에서 보면 : 새로운 블랙 박스 클래스를 받고 유닛 테스트를하면 단위 테스트를 읽고 클래스의 작동 방식과 작동 방식을 확인해야합니다.

  • Link1
  • Link2 : 자세한 내용과 예제는 TDD에 대한 StackOverflow의 기사에 대한 몇 가지 링크가 여기에 Art Of Unit Testing

    :

    내가 아주 좋은 책을 추천 단위 테스트에 대한 자세한 내용을 읽으려면
+1

일을 단위 테스트의 예술을 참조하십시오. 훌륭한 책입니다. – Steven