【问题标题】:Setup JUnit test timeout using reflection使用反射设置 JUnit 测试超时
【发布时间】:2018-02-13 22:30:24
【问题描述】:

到目前为止,我已经找到了两种设置 JUnit 测试超时的方法。要么使用:

@Test(timeout=XXX)

或者使用类似的东西:

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

就我而言,我有一个 Test Runner 作为主类来运行我的所有测试套件,因此我可以将测试作为可执行 jar 执行。 我希望这个跑步者使用反射动态设置超时。

可以吗?

【问题讨论】:

    标签: java reflection junit timeout


    【解决方案1】:

    您可以像这样将超时功能添加到自定义测试运行器:

    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
    • willNotTimeout:会过去的

    尽管您需要通过此运行器运行测试,但您将能够从一个地方控制它们的超时设置并提供自定义超时派生策略,例如 if test name matches &lt;some regex&gt; then timeout is x else ...

    【讨论】:

    • 无法扩展 BlockJUnit4ClassRunner,因为我的跑步者已经在扩展另一个类。有没有其他方法可以做到这一点而不必扩展它?也许在类中插入一个新的超时字段,或者在运行时将超时值插入到测试注释中......
    • @AlexanderRumanovsk:我真的不认为您能够即时更改测试类。我认为自定义跑步者非常适合您的用例。你写道:“我的跑步者已经在扩展另一个类”所以它必须(在层次结构的某个地方)扩展org.junit.runner.Runner所以如果一切都失败了(即如果你使用的跑步者没有一个简单的钩子来应用这个超时)您始终可以覆盖run() 方法并将对super.run() 的调用包装在一个超时块​​中。它有一个run() 方法。
    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 2015-02-13
    • 2011-03-29
    • 2016-09-18
    • 2017-10-30
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    相关资源
    最近更新 更多