JUnit测试预期超时

tct7dpnv  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(143)

我有一个通过TCP套接字进行的通信测试,我希望当我发送某个消息时,服务器不会在设定的时间范围内做出响应。
服务器的行为不是我能控制的。
我知道如果一个测试没有在设定的时间框架内完成,那么它将失败。但是我如何才能做到相反的事情,使它因为没有在规定的时间框架内完成而通过呢?
我可以使用@Test (timeout=1000)使一个测试失败,如果没有在一秒钟内完成。
但是,使用Junit 4,是否有一个函数可以测试预期的超时是否为肯定结果?即,如果在时间范围内完成,测试将失败,否则将通过?

ax6ht2ek

ax6ht2ek1#

问得好。实际上,您可以只使用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 {
        TimeUnit.SECONDS.sleep(1);
    }
}
erhoui1w

erhoui1w2#

我是建立在伟大的答案由安德烈,不要忘记投票赞成他的答案,如果你喜欢这一个!
我使用了下面的修改来跳过一个没有在预期时间内完成的测试。这样做的好处是测试将被JUnit标记为Skipped而不是Successful。这对于乐观执行测试是很好的,因为有时候测试会挂起或者完成得不够快,但是你不想把它们标记为failed或者删除它们。

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);
    }
}
thigvfpy

thigvfpy3#

在Java 9中更简单

CompletableFuture.supplyAsync(() -> dormammu.bargain())
                     .orTimeout(1, TimeUnit.SECONDS)
                     .handle((result, throwable) -> {
                         if (!(throwable instanceof TimeoutException)) {
                             Assertions.fail();
                         }
                         return result;
                     }).get();

如果方法在1秒内没有返回,它将超时。在句柄方法中,您可以确保抛出TimeoutException,否则测试失败。

相关问题