2

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

我想分析时间浪费在哪里,但在分析方面经验很少。

我假设依赖模拟对象的初始化需要很长时间。

两个问题:

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

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

广告 2)例如,一项测试有大约 30 个(!)类要准备使用 @PrepareForTest 进行测试。这不可能是好事,但我无法解释为什么。

4

1 回答 1

3

这是我对此的意见:

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

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

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

希望这可以帮助。

于 2012-01-26T12:20:59.870 回答