我是否应该期望mockito测试中不在方法中的代码因为java即时编译而运行得更快?

rwqw0loc  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(311)

我需要帮忙做个小实验。我有两个测试文件: testFileA.java 以及
testFileB.java testFileA.java 看起来像

@Test
    public void test1() throws Throwable {
        Instant start = Instant.now();
        mvc.perform(MockMvcRequestBuilders
                        .post('someEndpoint/')
                        .andDo(print())
                        .andExpect(status().isCreated())
        Instant end = Instant.now();
        System.out.println(">>>>>>>>>>>>>>>>>End" + Duration.between(start, end));
    }

    @Test
    public void test2() throws Throwable {
        //same contents as test 1
    }

    @Test
    public void test3() throws Throwable {
        //same contents as test 1
    }
``` `testFileB.java` 看起来像

@Test
public void test1() throws Throwable {
Instant start = Instant.now();
this.abstractedCode();
Instant end = Instant.now();
System.out.println(">>>>>>>>>>>>>>>>>End" + Duration.between(start, end));
}

@Test
public void test2() throws Throwable {
       //same contents as test 1
}

@Test
public void test3() throws Throwable {
    //same contents as test 1
}

public void abstractedCode(){
  mvc.perform(MockMvcRequestBuilders
                    .post('someEndpoint/')
                    .andDo(print())
                    .andExpect(status().isCreated())
}
我的期望 `testFileB.java` 因为重复的代码被重构成一个方法调用,所以第一个测试会花费更长的时间,而随后的每个测试不会花费那么长的时间;javajit编译器使得我们不必再次重新编译相同的代码。我的期望被证明是正确的。
我的期望 `testFileA.java` 因为公共代码没有被重构成函数,所以每个测试所需的时间和前一个测试一样长,但结果不是这样。行为是一样的,第一次测试的时间稍微长一点,接下来的两次则更短。
我猜jvm中发生了一些事情,使得它变得如此 `mvc.perform()` 我调用的方法不必一次又一次地重新编译,jit编译器正在帮助我的程序,尽管它不在我定义的函数中。是真的吗?
sxissh06

sxissh061#

一个明显的答案是:你把时间花在了错误的地方。
“jit优化”带来的好处只在应用程序长时间运行、数百万次调用同一方法的设置中才起作用。
jit的重点不是优化在jvm生命周期中调用一次的测试方法。
意思:花时间来训练如何编写可测试的产品代码,以及清理测试代码。这在这里更重要。
当然:单元测试套件的执行时间仍然很重要。但当这变成一个问题时,你很可能会面临糟糕的书面测试,例如使用默认超时等等。。。如果不是几分钟的话,最后的测试要花很多秒。这是你关心的。不过,对于单元测试环境,您绝对不关心jit的魔力。

相关问题