2010-06-04 9 views
5

다른 클래스로부터받은 통신에 따라 값이 자주 변경되는 속성으로 클래스를 단위 테스트하고 있습니다. 클래스가 5 초 동안 아무런 통신도받지 못하면 속성은 기본값으로 되돌아갑니다.타임 아웃을 통한 단위 테스트

내가 테스트하고자하는 값을 트리거하기 위해 통신 구성 요소를 스텁 (stub)하고 조롱하는 것은 쉽습니다. 문제는 만약 내가 바쁜 (기계를 만드는 것처럼) 기계에 단위 테스트를 실행하고 속성을 기본값으로 만드는 상당한 지연이 있으면 내 단위 테스트가 실패한다는 것입니다.

다양한 통신 조건을 시뮬레이션 할 때이 속성이 적절한 값인지 어떻게 테스트하겠습니까?

하나의 아이디어는 타임 아웃을 제어하는 ​​클래스의 일부를 스텁 (stub) 할 수 있도록 내 코드를 재구성하는 것입니다. 또 하나는 단위 테스트를 작성하여 시간 초과로 인해 실패했는지를 감지하고 테스트 결과에이를 표시 할 수 있도록하는 것입니다.

답변

3

시간 제한 속성을 구성 가능하게 만들 수 있습니다. 그런 다음 단위 테스트에서 충분히 높은 값으로 설정하거나 리셋 동작을 단위 테스트하려는 경우 충분히 낮게 설정하십시오.

+0

나는 내 상황에 대한 간단한 솔루션이기 때문에이 경로를 이동하기로 결정했습니다. 다른 제안들도 훌륭했습니다. 모두에게 감사드립니다! –

3

DateTime.Now를 사용할 때의 동일한 문제가 있습니다. Ayende described이 트릭 내가 좋아하는 것을 함께 다루는 :

public static class SystemTime 
{ 
    public static Func<DateTime> Now =() => DateTime.Now; 
} 

다음을 테스트에 :

[Test] 
public void Should_calculate_length_of_stay_from_today_when_still_occupied() 
{ 
    var startDate = new DateTime(2008, 10, 1); 
    SystemTime.Now =() => new DateTime(2008, 10, 5); 

    var occupation = new Occupation {StartDate = startDate}; 

    occupation.LengthOfStay().ShouldEqual(4); 
} 

어쩌면 당신은 당신의 시간 제한 같은 친척 트릭을 활용할 수 있습니까?

+0

+1 흥미 롭습니다. –

7

다른 접근 방식을 시도합니다. 게임 개발자는 종종 게임 시간을 제어 할 방법이 필요합니다. 빨리 감기 기능 또는 프레임 속도를 동기화 할 수 있습니다. 하드웨어 시계 또는 시뮬레이션 된 시계에서 틱을 읽는 Timer 개체를 소개합니다.

귀하의 경우 단위 테스트를위한 제어 가능한 타이머와 프로덕션 모드의 시스템 시간을 위임하는 타이머를 제공 할 수 있습니다. 이렇게하면 테스트 케이스를 통과하는 시간과 특정 시간 초과 조건에서 테스트 대상 클래스가 어떻게 반응해야 하는지를 제어 할 수 있습니다.

의사 코드 :

public void testTimeout() throws Exception { 
    MockTimerClock clock = new MockTimerClock(); 

    ClassUnderTest cut = new ClassUnderTest(); 
    cut.setTimerClock(clock); 
    cut.beginWaitingForCommunication(); 

    assertTrue(cut.hasDefaultValues()); 
    cut.receiveOtherValues(); 
    assertFalse(cut.hasDefaultValues()); 

    clock.tick(5,TimeUnit.SECONDS); 
    assertTrue(cut.hasDefaultValues()); 
    cut.shutdown(); 
} 
관련 문제