我们有一些非常慢的JUnit测试,它们大量使用模拟,包括模拟静态函数。单次测试需要20-30秒,整个" mvn测试"需要25分钟。
我想分析浪费时间的地方,但几乎没有剖析经验。
我认为依赖模拟对象的初始化需要太长时间。
两个问题:
1)如何快速获取浪费时间的方法?我不需要复杂的高级用户工具,只需要基本的东西来获取数字。 (证明我们做的那种嘲弄是邪恶的)
2)您是否了解设计缺陷会产生如此糟糕的时间?我们测试应该调用模拟服务的JSF支持bean。也许在后台bean中可能会有一些输入验证或未重构的业务逻辑,但这不能改变(请不要评论;-))
ad 2)例如,一个测试有大约30个(!)类准备用@PrepareForTest进行测试。这不可能是好事,但我无法解释原因。
答案 0 :(得分:3)
以下是我对此的意见:
尝试使用像Apache Commons StopWatch class这样的简单内容。我发现这是一种在代码中发现瓶颈的简单方法,通常当你发现第一个瓶颈是什么时,其余的更容易被发现。我几乎从不浪费时间尝试配置过于复杂的分析工具。
我认为在完全模拟的单元测试中存在这样的性能缺陷是很奇怪的。如果我猜测我会说你缺少一个或两个模拟组件,而实际上在没有你知道的情况下调用数据库或外部Web服务。当然我可能是错的,因为我没有使用PowerMock,我总是强调从不模拟任何静态方法。这是您目前最大的设计缺陷,也是为您的代码提供良好测试覆盖率的最大障碍。那么该怎么办?您有2个选项,您可以将静态方法重构为可以更容易模拟的类方法。另一个选项是将静态方法包装在类对象包装器中,然后模拟包装器。如果静态方法来自我没有源的第三方库,我通常会这样做。
one test has about 30 (!) classes to be prepared for test with @PrepareForTest. This cannot be good, but I cannot explain why.
这听起来好像你也可能有完全做太多的方法!在大约99%的情况下,单个方法的依赖性太多了。很可能这种方法可以分成更容易测试的单独方法。
希望这有帮助。