是否有注释可以让我的测试在一段时间后成功终止?让我们说我希望测试在10秒的运行时间后通过。
这个功能有用吗?为了一个抽象的例子,我可以说我编写了一个机器人,它必须平衡手上的一根棍子至少10秒钟,或者在一些机器学习后玩Atari Breakout一分钟(我想自动检查它是否经过训练)足够好,而不必看它)。
我知道@Test
注释有一个timeout
参数,但它只允许我在运行一段时间后终止测试失败。那么可以运行经过一段时间后经过的测试吗?我正在寻找类似的东西,但是使用注释(显然出于同样的原因,有timeout
参数):
@Test
public void timeoutTest() {
Date begin = new Date();
Robot robot = new Robot(new AtariBreakout());
robot.play();
Date end = new Date();
Assert.assertTrue(end.getTime() - begin.getTime() >= 10000)
}
为什么我不能使用它,并对解决方案感到满意?因为它使用了这个假设,即机器人玩游戏大约十秒钟而不是说2个小时。经过一夜的广泛测试后,我不想只用100次测试中的一次来唤醒,因为机器人编程得太好了。
修改
其中一条评论指示我采用"解决方案",这恰好是完全错误的,并且在以下代码中失败:
@Test
public void test1() throws Exception {
Thread thread = new Thread(()->{
while (true)
System.out.println("HaHa");
});
thread.run();
assert (thread.isAlive());
thread.stop();
}
@Test
public void test2() throws Exception {
while (true);
}
如果test2()
在test1()
之后运行,它仍会产生输出,就像它仍然是runnig一样。在IntelliJ IDEA Community Edition上执行的测试。有趣的是,它在终止测试后仍然产生输出,所以唯一发生的事情 - 它只是发射了一种缓慢增长的叉形炸弹,每次测试运行时它都会增加。