ric*_*lva 4 performance junit android unit-testing mockito
当使用mockito 2时,与使用@Mock注释或在设置方法中实例化它们相比,在内联实例化模拟时,我看到了巨大的性能提升。这对我来说非常令人困惑,因为尽管性能明显提升,但文档中没有任何地方不鼓励内联实例化模拟。所有时间均取自 Android studio 的测试运行器输出,显示执行时间。
我通过一个非常简单的测试创建了一个新项目:
private val mockBanana: Banana
private lateinit var cut: Person
@Before
fun setup(){
cut = Person()
}
@Test
fun check(){
cut.banana = mockBanana
cut.eat()
verify(mockBanana).grow()
verify(mockBanana).harvest()
verify(mockBanana).peelOff()
verify(mockBanana).eat()
}
Run Code Online (Sandbox Code Playgroud)
然后,我只是改变了模拟的创建方式。
慢的方法:在setup中调用mock。需要 400 毫秒
@Before
fun setup(){
mockBanana = mock(Banana::class.java)
cut = Person()
}
Run Code Online (Sandbox Code Playgroud)
慢方法:mock注解。需要 430 毫秒
@Mock
private lateinit var mockBanana: Banana
Run Code Online (Sandbox Code Playgroud)
快速方法:内联调用mock。需要 25 毫秒
private val mockBanana: Banana = mock(Banana::class.java)
Run Code Online (Sandbox Code Playgroud)
最初,我认为性能提升是由于每个类仅创建一次模拟,然后在所有测试之间共享,这将是一个大问题。然而,进一步的测试毫无疑问表明这不是原因(我在mockito代码中使用了断点和日志,并且多次创建了模拟。此外,测试之间的模拟引用总是不同的)。
在我开始这项巨大的努力之前,我将重构项目中的所有测试,我想更好地了解性能提升,以确保将来不会出现任何问题。
事实证明,“性能提升”只是 android studio 在测试执行时间上的误导。我使用 JProfiler 并发现内联方法调用和在设置方法中执行都会导致调用需要Mockito.mock()相同的时间来执行。唯一的区别是在堆栈跟踪中执行调用的位置,所以我假设 android studio 仅在某个点之后开始计数,这导致执行时间非常低。
我还使用 gradle 的内置分析器进行了双重检查,并观察到相同的结果。无论模拟初始化方法如何,测试执行所需的时间都是相同的。
| 归档时间: |
|
| 查看次数: |
1234 次 |
| 最近记录: |