2013-03-05 3 views
2

내가 다음 클래스 (~ 의사) 테스트 해요으니,이 가정하자 :,,의 가정하자 더 ... 문제가 될 수있는 문제에 대한단위 테스트 - 어떻게 복잡한 방법을 단위 테스트해야합니까?

// (...) 
public Result Process(Image image) 
{ 
    Image image2 = PreprocessImage(image); 
    PartialResult r1 = Process1(image2); 
    PartialResult r2 = Process2(r1); 
    Result result = FinalProcessing(r2); 

    return result; 
} 

public Image PreprocessImage(Image image) 
{ 
    Image tmp1 = Resize(image); 
    Image tmp2 = Blur(tmp1); 
    Image tmp3 = Median(tmp2); 
    Image tmp4 = ExtractSpecificAreas(tmp3); 

    return tmp4; 
} 

public Image Median(Image image) 
{ 
    // Actual image median algorithm 
} 

을 그 예를 들어, Process1 (이러한 방법의 대부분의 결과 , Process2, FinalProcessing, ExtractSpecificAreas)은 예측하기가 쉽지 않습니다. 예를 들어 휴리스틱/결정적인 알고리즘이 이미지에서 기능을 추출하려고 시도하는 경우가 있습니다. 90 %의 상황에서는 성공할 수 있습니다.

단위 테스트는 다음 중 어느 것입니까? 무효 입력/경계 조건을 제외하고 어떻게이 단위 테스트를 단위 테스트합니까? 단위 테스트가 의미를 갖는 방법은 초등학생이 (또는 얼마나 복잡 할 수 있습니까?) 방법은 무엇입니까?

답변

6

단위 테스트의 일반적인 규칙은 테스트 할 수있는 가능한 한 작은 조각을 테스트하는 것입니다. 좋은 규칙은 각 테스트가 공용 API에서 정확히 하나의 메소드를 실행해야한다는 것입니다.

즉,이 메소드 만 실행해야하며 다른 메소드는 일시적으로 실행해서는 안됩니다. 따라서 foo()을 테스트하고 bar()을 호출하려는 경우 테스트하지 말고 bar()을 조롱해야합니다. 내부, 개인 방법 baz()를 호출해도 괜찮습니다.

메서드에서 수백 가지 내부 메서드를 호출하면 refactoring이 필요합니다.

단위 테스트가 실패하면 문제의 정확한 위치를 알려야한다는 논리가 있습니다. 만약 유닛 테스트 main()이라면, 실패는 프로젝트의 코드 어딘가에 버그가 있음을 알려주는 것입니다. 단위 테스트, 예를 들어, String.length()이라면 테스트가 실패합니다. 버그가 있어야하는 곳을 알 수 있습니다.

또한 다음 질문에 대한 답변입니다. 예기치 못한 결과를 반환하는 방법이 있습니다. 그들을 조롱하면 항상 좋은 결과와 나쁜 결과를 반환 할 수 있으므로 결과를 올바르게 처리하는 방법을 테스트 할 수 있습니다.

예기치 않은 방법에 대해서는 유사한 전략을 찾아야합니다. 예를 들어 훈련 된 어딘가에 신경망을 가지고 있다고 가정합니다. 따라서 테스트는 이미지가 90 %의 시간 동안 올바르게 정렬 될 때까지 N 번 방법으로 일부 교육 이미지를 전달하는 것일 수 있습니다.

다시 이러한 방법을 예측 가능하고 예측할 수없는 부분으로 나눌 수 있어야합니다. 그런 다음 조롱 또는 통계 분석으로 테스트 할 수 있습니다.

두 개의 큰 모의 프레임 워크는 MockitoPowerMock입니다.

+0

사실 신경망은 없지만 결정 론적 알고리즘은 복잡합니다. 그러나 입력 데이터의 복잡성과 품질 때문에 일부 오탐 또는 거짓 네거티브는 거의 없습니다. 그것들을 단위 테스트한다면, 실패한 테스트는 본질적으로 실패한 메소드를 지적하지 않을 수도 있습니다. – Spook

+0

동일한 입력에 대해 항상 동일한 결과를 반환하는 것처럼 들립니다. 그렇다면 다른 코드처럼 단위 테스트를 수행 할 수 있습니다. 무작위 입력으로 단위 테스트를 작성하지 마십시오. 올바른 결과를 알 수있는 이미지 세트를 만들거나 알고리즘의 결과가 정확해야한다고 말할 수있는 곳에서 단위 테스트에서 예상되는 결과를 사용하십시오. –

1

나는 Aaron Digulla가 가장 중요한 것을 이미 지적했다고 생각한다 : 가능한 가장 작은 조각들을 시험하고 모의 객체를 사용하라.

그러나 내가 한 가지 더 추가 할 수 있습니다 : 당신은 또한, 전체 응용 프로그램을 테스트하기 위해 작은 조각이 잘 협력하고 있는지 여부, 즉 (이 어쨌든 통합 테스트보다는 단위 테스트하지만 것 할 수 있습니다 - 당신을 둘 다해야한다). 휴리스틱 알고리즘을 테스트하기 위해 쉬운 작업으로 시작하는 것이 유용하다는 것을 알았습니다. 귀하의 경우에는 "쉬운"이미지 일 것입니다. 이것은 물론, 당신에게 기준선을 제공합니다, 그것이 90 % situtations에서 작동한다는 것을 보장하지 않습니다.그러나 어쨌든 개발 중에는 도움이됩니다. 원하는 경우보다 현실적인 샘플로 (통합) 테스트 스위트를 향상시킬 수 있습니다.

관련 문제