당신과 같이 사용자 정의 테스트 러너에 타임 아웃 기능을 추가 할 수 있습니다
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 ...
으로 사용자 정의 타임 아웃 유도 전략을 제공 할 수있을 것입니다이 주자를 통해 실행하도록 전달합니다.
내 주자가 이미 다른 클래스를 확장 중이므로 BlockJUnit4ClassRunner를 확장 할 수 없습니다. 이것을 확장하지 않고도 다른 방법이 있습니까? 어쩌면 클래스에 새로운 시간 초과 필드를 삽입하거나 런타임에 테스트 주석에 시간 초과 값을 삽입 할 수 있습니다. –
@AlexanderRumanovsk : 나는 당신이 비행 중에 테스트 클래스를 변경할 수 있다고 생각하지 않습니다. 사용자 정의 러너가 사용 사례에 알맞은 도구라고 생각합니다. "내 주자가 이미 다른 클래스를 확장 중입니다."그래서 (모든 계층의 어딘가에) org.junit.runner.Runner를 확장하여 다른 모든 클래스가 실패 할 경우 (즉, 사용하는 러너가 쉽지 않은 경우) 이 타임 아웃을 적용하기위한 후크),'run()'메소드를 오버라이드하고'run()'메소드가있는 타임 아웃 블록에서'super.run()'에 호출을 래핑 할 수 있습니다. – glytching