假设我实现了一个让当前线程休眠10秒的方法。现在我想编写一个单元测试用例来测试这个方法的功能。我怎样才能做到这一点?以下代码是更好的选择吗?
@Test
public void testSleep() {
long start = System.currentTimeMillis();
invokeFunction(2000);
long end = System.currentTimeMillis();
Assert.assertTrue(end - start > 2000);
}
答案 0 :(得分:0)
我想说你附上的代码是一个很好的测试,可以测试invokeFunction(2000)
的持续时间确实至少需要2000毫秒。但是,它并没有证明该功能大约需要你指定的时间。
@Test
public void testSleep() {
for(int i=250; i<3000; i+= 250) {
long start = System.currentTimeMillis();
invokeFunction(i);
long end = System.currentTimeMillis();
Assert.assertTrue(end - start >= i);
Assert.assertTrue(end - start <= i+ 250);
}
}
通过这种方式,您可以显示该函数大约花费的时间量,容差为250毫秒。使用原始测试,如果invokeFunction
方法被硬编码为休眠5000毫秒,那么您的测试将通过,但实现实际上并不正确。
答案 1 :(得分:0)
我会说这取决于你想要测试的内容。你没有测试函数实际上是否在线程X秒,你正在测试该方法需要至少X秒来完成。
我的意思是,如果函数执行的操作不仅仅是Thread.sleep,那么你正在计算所有的东西。
请注意,我至少说,因为无法保证线程会准确地睡眠这段时间;醒来可能需要更长的时间(jvm会尽力而为)。
但TBH我不知道除了你正在做的任何其他更好的方法,而不是为了能够测试它而改变你的函数实现(比如有一个只有目的的中间组件)只是为了睡眠线程,只是监视进入和退出该组件。)