Jsf 使用PowerMock评测JUnit测试?

Jsf 使用PowerMock评测JUnit测试?,jsf,junit,profiling,powermock,Jsf,Junit,Profiling,Powermock,我们有两个非常慢的JUnit测试,它们大量使用模拟,包括静态函数的模拟。单个测试需要20-30秒,整个“mvn测试”需要25分钟 我想分析哪些地方浪费了时间,但在分析方面几乎没有经验 我假设依赖模拟对象的初始化花费的时间太长 两个问题: 1) 如何快速获取浪费时间的方法的数字?我不需要复杂的超级用户工具,只需要一些基本的数据。(证明我们所做的嘲弄是邪恶的) 2) 你知道什么样的设计缺陷会导致如此糟糕的时间安排吗?我们测试应该调用模拟服务的JSF支持bean。可能在支持bean中存在一些输入验证或

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

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

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

两个问题:

1) 如何快速获取浪费时间的方法的数字?我不需要复杂的超级用户工具,只需要一些基本的数据。(证明我们所做的嘲弄是邪恶的)

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


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

以下是我对此的看法:

  • 试着用一些简单的方法,比如。我发现这是一种在代码中发现瓶颈的简单方法,通常当您找到第一个瓶颈是什么时,其他瓶颈就更容易发现。我几乎从不浪费时间来配置过于复杂的分析工具

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

  • 一个测试需要准备大约30个(!)类,以便使用@PrepareForTest进行测试。这不太好,但我无法解释原因。
    这听起来确实像是你也有一些方法做得太多了!在99%的情况下,对于一个方法来说,依赖性太多了。这种方法很有可能被分成单独的、更容易测试的方法

  • 希望这有帮助