2012-01-26 44 views
2

我们有几个非常非常慢的JUnit测试,它们大量使用嘲讽,包括静态函数的嘲弄。单次测试需要20-30秒,整个“mvn测试”需要25分钟。使用PowerMock分析JUnit测试?

我想分析哪些时间浪费了,但在分析中几乎没有经验。

我假设从属模拟对象的初始化花费太长时间。

两个问题:

1)如何可以迅速得到号码哪些方法浪费时间?我不需要复杂的高级用户工具,只需要一些基本的数据。 (证明我们所做的嘲笑是邪恶的)

2)你有什么设计缺陷会产生如此糟糕的时机吗?我们测试应该调用模拟服务的JSF支持bean。也许在后台bean中可能有一些输入验证或不重构的业务逻辑,但不能改变(请不要对此进行评论;-))

ad 2)例如,一个测试约有30(! )类准备用@PrepareForTest进行测试。这不好,但我无法解释为什么。

回答

3

下面是对这个我输入:使用简单的东西,如Apache Commons StopWatch class

  1. 尝试。我发现这是一种很容易找到代码瓶颈的方法,通常当你找到第一个瓶颈时,其余的更容易找到。我几乎不会浪费时间去尝试配置过于复杂的分析工具。

  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%的情况下,这对于单一方法来说太多依赖。这种方法更可能分为单独的更容易测试的方法。

希望这会有所帮助。