2009-07-04 6 views
5

전 Unit Testing에 초보자이며 최선의 조언을 듣고 있습니다. Xcode를 사용하여 코코아로 코딩하고 있습니다.단위 테스트 용 외부 데이터 파일

사용자가 입력 한 URL의 유효성을 검사하는 방법이 있습니다. http : // 프로토콜 만 허용하고 유효한 문자가있는 URL 만 수락합니다.

하나의 테스트를 허용하고 테스트 데이터 파일을 사용할 수 있습니까? 데이터 파일은 유효/무효 URL의 예와 URL의 유효성 확인 여부를 제공합니다. 나는 또한 이것을 사용하여 오류 메시지의 설명과 도메인을 확인한다.

내가 JUnit을 자바에 실용 단위 테스트를 읽은이

을하고 있어요 왜이 날이 OK라고 생각하게 외부 데이터 파일과 예제를 제공합니다. 또한 다른 데이터를 테스트하기 위해 매우 유사한 코드로 단위 테스트를 많이 작성할 필요가 없습니다.

  • 잘못된 문자
  • 잘못된 프로토콜
  • 유효한 URL을 :

    그러나 다른 한편으로 ...

    것은 나는을 테스트하고 있습니다 경우

이 모두 동일한 테스트 데이터 파일에 있으므로 동일한 테스트에서 나중에 문제가 발생합니까? 나는 한 가지 시험이 한 가지 이유 때문에 실패해야한다는 것을 읽었다.

내가 뭘하고 있니?

단위 테스트에서 다른 사람들이 테스트 데이터를 어떻게 사용합니까?

답변

5

일반적으로 필요한 경우에만 테스트 데이터 파일을 사용하십시오. 테스트 데이터 파일을 사용할 때 여러 가지 단점이 있습니다.

  • 테스트 코드는 테스트 코드와 테스트 데이터 파일로 나뉩니다. 따라서 테스트를 이해하고 유지하기가 더 어려워집니다.
  • 가능한 한 빨리 단위 테스트를하고 싶습니다. 데이터 파일을 불필요하게 읽는 테스트를하면 테스트 속도가 느려질 수 있습니다.

내가 데이터 파일을 사용합니까 몇 가지 경우가 있습니다

  • 입력 (예를 들어, XML 문서) 큰가. String 연결을 사용하여 큰 입력을 만들 수는 있지만 테스트 코드를 읽기 어렵게 만들 수 있습니다.
  • 테스트는 실제로 파일을 읽는 코드를 테스트하는 것입니다. 이 경우에도 테스트를 모든 임시 코드가 한 곳에서 수행되도록 임시 디렉토리에 테스트 파일을 작성하도록 할 수 있습니다.

유효한 URL과 유효하지 않은 URL을 인코딩하는 대신 코드로 테스트를 작성하는 것이 좋습니다.잘못된 문자 테스트, 잘못된 프로토콜 테스트, 유효하지 않은 도메인 테스트 및 유효한 URL 테스트를 만드는 것이 좋습니다. 충분한 범위가 있다고 생각하지 않는 경우 유효하지 않은 여러 URL을 테스트하기 위해 미니 통합 테스트를 만들 수 있습니다. 여기에 자바의 예와의 JUnit의 :이 물어 완벽하게 합리적인 질문이라고 생각하지만

public void testManyValidUrls() { 
    UrlValidator validator = new UrlValidator(); 
    assertValidUrl(validator, "http://foo.com"); 
    assertValidUrl(validator, "http://foo.com/home"); 
    // more asserts here 
} 

private static void assertValidUrl(UrlValidator validator, String url) { 
    assertTrue(url + " should be considered valid", validator.isValid(url); 
} 
+0

거룩한 암소. 엄청난 도움이됩니다. 이것은 정확히 제가 한 조언의 종류입니다. 외부 파일에 내 유효성 검사 데이터의 많은 부분을 이상하게 작성했지만 필자는 왜 그런지에 대해 생각하지 못했습니다. 당신의 대답은 나의 나쁜 감정을 못살게합니다. 유지 보수성과 속도면에서 좋지 않습니다. 샘플 코드는 또한 내 코드의 시작점으로 유용합니다. 감사합니다. 정말 끝내주는 군. –

1

, 나는 당신이 이것에 대해 지나치게 걱정해야한다고 생각하지 않습니다. 엄밀히 말하자면 각 테스트가 한 가지만 테스트해야한다는 것이 맞지만 데이터 파일 사용을 방해하지는 않습니다.

SUT (System Under Test)가 단순한 URL 파서/유효성 검사기 인 경우 단일 URL을 매개 변수로 사용한다고 가정합니다. 따라서 잘못된 데이터를 얼마나 많은 데이터를 동시에 공급할 수 있는지에 대한 제한이 있습니다. 잘못된 문자와 잘못된 프로토콜을 모두 포함하는 URL을 입력하는 경우에도 단일 결과 만 발생합니다 (URL이 유효하지 않음).

설명하는 것은 데이터 기반 테스트 (매개 변수화 된 테스트라고도 함)입니다. 테스트 자체를 단순하게 유지하면 다른 데이터를 제공하는 것이 문제가되지 않습니다.

무엇을 합니까?은 걱정할 필요가 있습니다. 그 이유는 몇 달 후에 발생하는 테스트가 실패한 이유를 신속하게 찾을 수 있기를 바랍니다. 테스트 출력이 테스트 데이터 파일의 특정 행을 가리키는 경우 무엇이 잘못되었는지 신속하게 파악할 수 있어야합니다. 반면에 테스트가 실패하고 파일의 모든 행에 오류가있는 경우에만 메시지가 표시되면 테스트 유지 가능성 악몽의 윤곽을 보게됩니다.

개인적으로 가능한 한 테스트와 밀접하게 관련된 테스트 데이터를 갖기 위해 약간 기울여야합니다. 왜냐하면 필자는 Tests as Executable Specifications의 개념을 매우 중요하게 생각하기 때문입니다. 테스트 데이터가 각 테스트 내에서 하드 코딩되면 입력 및 예상 출력 간의 관계를 매우 명확하게 지정할 수 있습니다. 테스트 자체에서 데이터를 제거할수록이 '스펙'을 읽는 것이 어려워집니다.

이것은 각 테스트 내에서 입력 데이터의 값을 정의하는 경향이 있음을 의미합니다. 유일한 유사점이 입력 및/또는 예상 출력 인 매우 유사한 테스트를 많이 작성해야한다면 파라미터 화 된 테스트를 작성하지만 하드 코딩 된 테스트에서 해당 매개 변수화 된 테스트를 호출 할 수 있습니다 (각각은 단 한 줄의 코드입니다).). 나는 외부 데이터 파일을 사용한 적이 없다고 생각합니다.

하지만 다시 요즘 나는 심지어 을 알고 있습니다. Constrained Non-Determinism을 사용하고 있기 때문에을 입력합니다. 대신, 나는 Equivalence Classes와 Derived Values으로 일한다.

+0

정말 도움이되는 대답입니다. 흥미로운 점은 허용 된 답변보다 데이터 파일을 조금 더 관대하게 사용한다는 것입니다. 귀하의 대답은 제게 다양한 의견을 제시하는데 도움이됩니다. 모든 것과 마찬가지로 많은 의견과 판단이 내려지지 만 인정 된 답변과 함께 제 자신의 정보에 입각 한 결정을 내리는 데 훌륭한 시작점이 있습니다. 고마워요! –

관련 문제