当以毫秒为单位的执行超过指定值时,为什么我的Java JUnit 5超时测试通过



我要做的事情:

2毫秒后测试失败

下面是我的代码示例。它在12-22毫秒之间变化。我发现,如果我把值改为"1",有时甚至会在看似随机的时间失败。。

@Test
@Timeout(unit = TimeUnit.MILLISECONDS, value = 2)
public void hundredCities() {
assertEquals(740,
stringAlgorithm.findTotalLengthOfStringArray(
new String[] {
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam" })
);
}

然而。。。

测试通过

我在这里做错了什么?

字符串算法代码:

公共类StringAlgorithm{

public int findTotalLengthOfStringArray(String[] test) {
// String[] test = {"Bananas", "Apples"};
String s = "";
for (String i : test) {
s += i;
}
char [] c = s.toCharArray();
System.out.println(c.length);
return c.length;
}

}

IntelliJ IDEA报告的时间可能无法准确反映测试方法的执行时间。特别是,为执行的第一个测试报告的时间包括设置测试套件所花费的时间。通过在测试类的早些时候添加另一个测试方法;移动";并且hundredCities本身可以很好地在2ms的超时持续时间内执行。

您可以通过记录和断言显式占用的时间来验证这一点:

@Test
public void hundredCities() {
long start = System.nanoTime();
assertEquals(740,
stringAlgorithm.findTotalLengthOfStringArray(
new String[] {
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam",
"Stockholm", "Paris", "London", "New York", "Amsterdam" })
);
long executionTime = System.nanoTime() - start;
System.out.println(Duration.ofNanos(executionTime).toMillis());
assertTrue(executionTime < 2_000_000);
}

在我的机器上,我必须添加大约1000个城市,才能持续超过2ms。当然,这个阈值会因不同的硬件、操作系统、Java版本等而异。

最新更新