2017-09-05 4 views
1

JUnit 테스트 시간 제한을 설정하는 데 두 가지 방법이 있습니다.리플렉션을 사용하여 JUnit 테스트 제한 시간 설정

@Test(timeout=XXX) 

또는 같은 것을 사용 : 내 경우에는

@ClassRule 
public static Timeout timeoutRule = new Timeout(XXX, TimeUnit.MILLISECONDS); 

을, 내 모든 테스트 스위트를 실행하는 메인 클래스로 테스트 러너, 그래서 나는 같은 테스트를 실행할 수 있습니다 사용 실행 가능한 jar. 리플렉션을 사용하여이 주자가 dinamically 시간 초과를 설정하고 싶습니다.

할 수 있습니까?

답변

0

당신과 같이 사용자 정의 테스트 러너에 타임 아웃 기능을 추가 할 수 있습니다

public class TimeoutTestRunner extends BlockJUnit4ClassRunner { 

    public TimeoutTestRunner(Class<?> clazz) throws InitializationError { 
     super(clazz); 
    } 

    @Override 
    protected Statement withPotentialTimeout(FrameworkMethod method, Object test, Statement next) { 
     return FailOnTimeout.builder() 
       // you'll probably want to configure/inject this value rather than hardcode it ... 
       .withTimeout(1, TimeUnit.MILLISECONDS) 
       .build(next); 
    } 
} 

를이 테스트 러너를 사용하여 다음과 같은 시험의 경우 시험 ...

@RunWith(TimeoutTestRunner.class) 
public class YourTest { 

    @Test 
    public void willTimeout() throws InterruptedException { 
     Thread.sleep(50); 
     assertTrue(true); 
    } 

    @Test 
    public void willNotTimeout() throws InterruptedException { 
     assertTrue(true); 
    } 
} 

... 것입니다 다음과 같이 동작합니다 :

  • willTimeout하십시오 TestTimedOutException
  • 0 실패합니다
  • willNotTimeout는 :

당신이 당신의 테스트가 필요하지만 당신이 자신의 타임 아웃이 한 장소에서 설정 제어 및 if test name matches <some regex> then timeout is x else ...으로 사용자 정의 타임 아웃 유도 전략을 제공 할 수있을 것입니다이 주자를 통해 실행하도록 전달합니다.

+0

내 주자가 이미 다른 클래스를 확장 중이므로 BlockJUnit4ClassRunner를 확장 할 수 없습니다. 이것을 확장하지 않고도 다른 방법이 있습니까? 어쩌면 클래스에 새로운 시간 초과 필드를 삽입하거나 런타임에 테스트 주석에 시간 초과 값을 삽입 할 수 있습니다. –

+0

@AlexanderRumanovsk : 나는 당신이 비행 중에 테스트 클래스를 변경할 수 있다고 생각하지 않습니다. 사용자 정의 러너가 사용 사례에 알맞은 도구라고 생각합니다. "내 주자가 이미 다른 클래스를 확장 중입니다."그래서 (모든 계층의 어딘가에) org.junit.runner.Runner를 확장하여 다른 모든 클래스가 실패 할 경우 (즉, 사용하는 러너가 쉽지 않은 경우) 이 타임 아웃을 적용하기위한 후크),'run()'메소드를 오버라이드하고'run()'메소드가있는 타임 아웃 블록에서'super.run()'에 호출을 래핑 할 수 있습니다. – glytching