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

qcbq4gxm  于 2022-11-11  发布在  Java
关注(0)|答案(1)|浏览(97)

我想做的是:

  • 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" })
    );

}

可是......
Test passed
我做错了什么?
字符串算法代码:
公共类字符串算法{

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;

}

}

emeijp43

emeijp431#

IntelliJ IDEA报告的时间可能无法准确反映测试方法的执行时间。特别是,报告的第一个测试执行时间包括设置测试套件所花费的时间。您可以通过在测试类的前面添加另一个测试方法来看到时间“移动”到该测试,并且hundredCities本身可能会在2ms超时持续时间内执行。
您可以通过显式记录和Assert所用时间来验证这一点:

@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个城市才能持续花费超过2毫秒的时间。当然,这个阈值会因不同的硬件、操作系统、Java版本等而异。

相关问题