2011-10-13 3 views
1

모든 중첩 된 메서드에 대해 단위 테스트를 작성해야합니까? 아니면 호출자에 대한 하나의 테스트를 작성하는 것으로 충분합니까? 예를 들어TDD 기능 테스트

:

void Main() 
{ 
    var x = new A().AFoo(); 
} 

public class A 
{ 
    public int AFoo() 
    {   
     // some logic 
     var x = new B().BFoo(); 

     // might have some logic 

     return x; 
    } 
} 

public class B 
{ 
    public int BFoo() 
    { 
     // some logic 
     return ???; 
    } 
} 

즉 main() 메소드에 대한 단위 테스트를 작성하기에 충분하다 또는 I 홈페이지, A.AFoo(), B.BFoo() 메소드에 대한 테스트를 작성해야합니까? 얼마나 깊이 갈 수 있을까요?

미리 감사드립니다.

답변

2

단위 테스트는 단위에서 작동해야하며, 단위 테스트는 단위 및 클래스의 메소드입니다. 즉, 고려중인 각 클래스에 대해 별도의 테스트 클래스를 작성하고 클래스에 제공된 각 메소드에 대해 최소한 하나의 테스트 메소드를 작성해야합니다. 게다가 클래스 B의 버그로 인해 클래스 A에서 오류가 발생하지 않도록 가능한 한 클래스를 격리하는 것이 중요합니다. 이것이 Inversion of Control (Dependency Injection)이 유용한 이유입니다. 왜냐하면 여러분이 B 클래스의 인스턴스를 A 클래스의 인스턴스에 추가하면 B를 Mock 객체로 변경할 수 있습니다.

단위 테스트를 작성하는 이유 중 하나는 코드에서 각 클래스의 메소드가 특히 가장자리 케이스를 비롯한 모든 조건에서 어떻게 작동 할 것으로 예상되는지를 설명하는 것입니다. main 메소드에 테스트를 작성하여 클래스 B의 예상되는 동작을 자세히 설명하는 것은 어렵습니다.

테스트 구동 개발과 객체 모의 방법을 설명하는 온라인 자료를 읽고, 아마도 JMock과 같은 우수한 조롱 라이브러리를 사용하는 것이 좋습니다. 자세한 내용은 question을 참조하십시오.

5

테스트 주체는 AB 클래스의 단위 테스트를 만들어야한다고 말합니다.

각 클래스에는 모든 테스트를 거쳐야합니다. 메소드가 둘 이상의 것을 수행 할 수있는 경우 (예 : if 문이있는 경우), 각 경로에 대한 테스트가 있어야합니다. 테스트가 너무 복잡해지면 코드를 리팩토링하여 테스트를 단순화하는 것이 좋습니다.

참고로 바로 옆에 A을 테스트하기가 어렵습니다. B에 의존하기 때문에 격리되어 있습니다. B이 간단하다면 지금 당장은 괜찮을 것입니다. 기술적으로는 AB을 함께 테스트하기 때문에 A 통합 테스트에 대한 테스트의 이름을 지정할 수 있습니다. 또 다른 옵션은 메소드 AFoo이 작동하는 B의 인스턴스를 매개 변수로 허용하는 것입니다. 그렇게하면 B의 인스턴스를 조롱하고 실제 단위 테스트를 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 모든 것을 테스트해야하고 모든 메소드를 테스트해야한다고 동의하지만, 하나의 메소드 (Main)가 다른 메소드를 호출하고 모든 시나리오에서 Main을 테스트 한 다음, A.AFoo 클래스의 모든 시나리오를 반복하는 몇 가지 사례를 발견했습니다. B.BFoo 클래스의 동일한 시나리오 –

+1

@vlad, 모든 클래스에는 자체 테스트가 있어야합니다. – hvgotcodes

+1

@hvgotcodes - 나는 그걸 조금 고칠 것입니다. 모든 ''public ''유형에는 자체 테스트가 있어야합니다. – Gishu

1

단위 테스트를 통해 디버깅 작업을 줄일 수 있습니다. 따라서 AFoo에 대한 단위 테스트를 작성하고 BFoo에 대한 테스트를 작성하지 않은 경우 테스트 중 하나가 실패하면 클래스 A 또는 클래스 B에 속하는지 여부를 알 수 없습니다. BFoo에 대한 테스트도 역시 적은 시간에 오류.