【问题标题】:JUnit test for an expected timeoutJUnit 测试预期超时
【发布时间】:2016-09-18 05:04:46
【问题描述】:

我通过 TCP 套接字进行了通信测试,我希望服务器在我发送特定消息时不会在设定的时间范围内响应。

服务器的行为是我无法控制的。

如果测试没有在设定的时间范围内完成,我知道如何失败。但是我怎么能做相反的事情,让它在时间范围内没有完成呢?

如果没有在一秒钟内完成,我可以使用@Test (timeout=1000) 使测试失败。

但是,使用 Junit 4,是否有一个函数可以测试预期的超时作为肯定结果? IE。如果在时间范围内完成则测试失败,否则通过?

【问题讨论】:

  • 超时是否抛出异常?如果是这样,您可以测试该超时异常。
  • 这个要小心,我觉得你不能expecttimeout抛出的异常。您可以使用计时器或只检查操作的时间,然后,如果它超过您想要的时间,则抛出您期望的异常。不过似乎效率不高。
  • 另外,测试的目的究竟是什么?如果它超出了服务器下游代码的范围,我不确定在您的端进行测试有多大好处。如果您希望您的代码能够处理超时,那么您应该只模拟套接字并抛出异常。

标签: java unit-testing testing junit


【解决方案1】:

好问题。实际上你可以只使用junit 工具来做到这一点。我的想法是反转Timeout 规则行为+ 使用Test 注释的expected 属性。唯一的限制:您必须将测试放在单独的类中,因为Rule 适用于其中的所有测试:

public class Q37355035 {

    private static final int MIN_TIMEOUT = 100;

    @Rule
    public Timeout timeout = new Timeout(MIN_TIMEOUT) {
        public Statement apply(Statement base, Description description) {
            return new FailOnTimeout(base, MIN_TIMEOUT) {
                @Override
                public void evaluate() throws Throwable {
                    try {
                        super.evaluate();
                        throw new TimeoutException();
                    } catch (Exception e) {}
                }
            };
        }
    };

    @Test(expected = TimeoutException.class)
    public void givesTimeout() throws InterruptedException {
        Thread.sleep(1000);
    }
}

【讨论】:

    【解决方案2】:

    我正在建立 Andremoniy 的精彩答案,如果你喜欢这个答案,别忘了给他的答案投票!

    如果测试没有在预期的时间范围内完成,我使用了以下修改来跳过测试。这样做的好处是测试将被 JUnit 标记为已跳过而不是成功。这有利于乐观地执行测试,这些测试有时会挂起或完成不够快,但您不想将它们标记为失败或删除它们。

    public class OptimisticTestClass {
    
        private static final int TEST_METHOD_TIMEOUT_MS = 100;
    
        @Rule
        public Timeout timeout = new Timeout(TEST_METHOD_TIMEOUT_MS, TimeUnit.MILLISECONDS) {
            public Statement apply(Statement base, Description description) {
                return new FailOnTimeout(base, TEST_METHOD_TIMEOUT_MS) {
                    @Override
                    public void evaluate() throws Throwable {
                        try {
                            super.evaluate();
                        } catch (TestTimedOutException e) {
                            Assume.assumeNoException("Test did not finish in the allocated time, skipping!", e);
                        }
                    }
                };
            }
        };
    
        // The test times out and is skipped
        public void givesTimeout() throws InterruptedException {
            Thread.sleep(1000);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2021-12-10
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 2018-02-13
      • 2014-07-21
      相关资源
      最近更新 更多