使用 PowerMock 分析 JUnit 测试?

Posted

技术标签:

【中文标题】使用 PowerMock 分析 JUnit 测试?【英文标题】:Profiling JUnit tests with PowerMock? 【发布时间】:2012-01-26 09:29:53 【问题描述】:

我们有几个非常慢的 JUnit 测试,它们大量使用模拟,包括静态函数的模拟。单项测试需要 20-30 秒,整个“mvn 测试”需要 25 分钟。

我想分析时间浪费在哪里,但在分析方面没有什么经验。

我假设依赖的模拟对象的初始化时间太长了。

两个问题:

1) 我怎样才能快速得到数字在哪些方法中浪费了时间?我不需要复杂的高级用户工具,只需要一些基本的东西来获取数字。 (证明我们所做的那种嘲笑是邪恶的)

2) 您知道哪些设计缺陷会导致如此糟糕的时序吗?我们测试应该调用模拟服务的支持 JSF 的 bean。也许支持 bean 中可能存在一些输入验证或未重构的业务逻辑,但无法更改(请不要对此发表评论;-))

ad 2) 例如,一项测试有大约 30 个 (!) 类要准备使用 @PrepareForTest 进行测试。这不好,但我无法解释原因。

【问题讨论】:

【参考方案1】:

这是我对此的看法:

    尝试使用像Apache Commons StopWatch class 这样简单的东西。我发现这是一种在代码中发现瓶颈的简单方法,通常当你发现第一个瓶颈是什么时,其余的就更容易发现了。我几乎从不浪费时间尝试配置过于复杂的分析工具。

    我认为在完全模拟的单元测试中存在这样的性能缺陷很奇怪。如果我猜的话,我会说您缺少一两个模拟组件,并且实际上在您不知情的情况下调用了数据库或外部 Web 服务。当然我可能是错的,因为我不使用 PowerMock 并且我强调永远不要模拟 any 静态方法。这是您目前最大的设计缺陷,也是为您的代码提供良好测试覆盖率的最大障碍。那么该怎么办?您有 2 个选项,您可以将静态方法重构为更容易模拟的类方法。另一种选择是将静态方法包装在类对象包装器中,然后改为模拟包装器。如果静态方法来自我没有源的第三方库,我通常会这样做。

    one test has about 30 (!) classes to be prepared for test with @PrepareForTest. This cannot be good, but I cannot explain why. 这听起来确实像您的方法做得太多了! 在大约 99% 的情况下,这对于单个方法来说是太多的依赖关系。这种方法很可能可以分离成更容易测试的方法。

希望这会有所帮助。

【讨论】:

以上是关于使用 PowerMock 分析 JUnit 测试?的主要内容,如果未能解决你的问题,请参考以下文章

PowerMock+Junit测试小记

我们可以使用Mockito和PowerMock出售junit测试类

PowerMock 入门

使用 Powermock 时出现 NoClassDefFoundError

如何使用 JUnit、EasyMock 或 PowerMock 模拟静态最终变量

解决Jacoco和PowerMock不兼容的问题