JUnitTest for Karaf Startup

时间:2017-11-16 06:34:55

标签: java testing junit apache-karaf smoke-testing

我想编写一个JUnitTest,它可以确保我的Karaf服务器正常启动并且所有(需要的)Bundle都已安装并处于活动状态。

为此,我有一个测试,调用一个帮助方法" assertBundleState"这确保了给定的Bundle处于给定状态。测试如下:

@Test (timeout=30000L)    
public void testBundlesStarted() throws Exception {
    assertBundleState("bundle.Name", BundleLifecycleState.Active);
... <other bundles in similar way>
}

这在过去运作良好。从未达到超时。

不幸的是,我现在必须加载一个捆绑包,这需要更长的时间来启动。因此,当测试执行时,Bundles尚未启动。所以测试失败了。

我在BeforeClass方法中尝试了一下,但我对这个解决方案并不满意。因为我不能确保每次在每台机器上给定的睡眠时间足够。所以我正在寻找一些基于事件的解决方案来与Karaf互动。

@BeforeClass
public static void init() throws Exception {
    Thread.sleep(120000L);
}

有没有人知道如何以更好的方式解决它? 感谢

1 个答案:

答案 0 :(得分:1)

听起来assertBundleState可以成功确定Karaf服务器是否已启动且“已准备就绪”。但问题是你不知道在检查这个之前要等多久;如果你没有等待足够长的时间,你会冒一个假阴性的风险,如果你等了太久,你的构建经过的时间会被错误地延长。

我认为你无法注册某种类型的侦听器或回调钩子,当它准备好时,它将调用Karaf服务器。实际上,即使这是可能的,你仍然需要迎合失败的情况,即Karaf服务器无法启动的地方(因此永远不会调用听众)。

所以,我认为你只需要等待Karaf服务器可用,并隐藏Thread.sleep电话的丑陋以及等待太久的潜在时间。您可以使用Awaitility勾选这些框。例如:

@Test
public void aTest() {
    // run your test

    // this will wait until Karaf is available for at most 10 seconds
    // and will check every 100ms so if Karaf becomes available earlier 
    // than 10 seconds then the test will complete almost as soon as
    // it becomes available but if Karaf does not become available 
    // within 10 seconds then the test will fail
    await().atMost(10, SECONDS).until(karafIsAvailable());

    // assert 
    // ...
}

private Callable<Boolean> karafIsAvailable() {
    return new Callable<Boolean>() {
        public Boolean call() throws Exception {
            // return true if your condition has been met
            // e.g. assertBundleState
            return ...;
        }
    };
}