【问题标题】:Junit4 - Cleanup on test timeoutJunit4 - 测试超时清理
【发布时间】:2011-02-24 08:24:31
【问题描述】:

当我运行带有注释 @Test(timeout = 3000) 的测试并且它超时时,它会立即终止测试并且不会调用带有 @After 注释的 tearDown 方法。

在这种情况下清理的方法是什么?

编辑: 我的测试是通过网络使用 jax-rs 调用资源端点,并且测试在 http 请求中间超时。在这种情况下,我相当确定 @After 没有被调用

【问题讨论】:

    标签: java timeout junit4


    【解决方案1】:

    严格来说,它不会杀死测试,它会失败。这显然意味着带有@After 注释的方法将运行。

    下面的代码对我来说很有魅力。

    @Test(timeout=1)
    public void testTimeout() {
        try {
            Thread.sleep(10);
        } catch (InterruptedException ex) {}
    }
    
    @After
    public void after() {
        System.out.println("@After is invoked, indeed.");
    }
    

    输出是,

    Testsuite: javaapplication1.MainTest
    After is invoked, indeed.
    Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0.054 sec
    

    【讨论】:

    • 是的,我正在使用 @After 并且超时似乎没有被调用。
    【解决方案2】:

    我的 timeout 属性也有一些问题。也许这可以帮助您找到四个问题...

    在我的情况下,混淆是由于使用 @Test(timeout=...) 注释的方法中的测试代码在单独的线程中运行的事实引起的。因此,我在测试期间访问的一些 ThreadLocal 内容无法在 @After 方法中清理。

    【讨论】:

    • 我的错,我应该提供更多信息。我的测试通过网络使用 jax-rs 调用了一堆资源端点,所以我真的不确定当测试在 http 请求中间超时时会发生什么,我认为它只会杀死测试产生的所有线程。你在说类似的话吗?
    【解决方案3】:
    @Rule  
    public Timeout to = new Timeout(300000);
    

    这适用于 JUnit 4.7。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多