JUnit 是编写性能测试的正确工具吗? [关闭]

Posted

技术标签:

【中文标题】JUnit 是编写性能测试的正确工具吗? [关闭]【英文标题】:Is JUnit the right tool to write performance tests? [closed] 【发布时间】:2012-02-29 00:06:28 【问题描述】:

在上周,我创建了两个课程,我的团队对它们的表现表示了一些担忧。为了评估我的代码,我编写了一些简单的 JUnit 测试,这些测试通过构建丰富的测试数据集来运行这些类,然后通过相关方法为数千次迭代提供这些数据。我记录了每次迭代的运行时间,然后使用循环和System.nanoTime() 记录了最高、最低和平均时间。最后,我让 JUnit 断言最高时间和平均时间在可接受的范围内。这种测试方法让我的团队对这段代码充满信心。

JUnit 是否适合以这种方式测试性能?是否有更好的工具来测试单元(方法和类)级别的性能?

【问题讨论】:

【参考方案1】:

没有。 JUnit 是为单元测试而设计的。在用 Java 编写性能测试时,有很多事情需要注意。使用专为编写微基准测试而设计的Google Caliper。

看How do I write a correct micro-benchmark in Java?

【讨论】:

正是我要推荐的:) Google Caliper 似乎不是一个成功的项目。自 2 年以来,它们仍处于测试阶段。【参考方案2】:

您的测试应该更好地定义为基准测试。是的,JUnit 可以以这种方式使用,尽管它不是最佳选择。但是您可以例如定义最大值。测试的评估时间,因此如果更改算法导致性能下降,则测试失败。使用@Test(timeout=12345) 进行配置。

如果您需要真正的性能测试,请考虑 JMeter。

【讨论】:

【参考方案3】:

可能有更好的方法,但也有一些框架可以帮助使用 JUnit 实现基准测试。一些有用的做法是热身运行、统计评估。看看JUnitBenchmarks和JUnitPerf

EDIT 看起来 JUnitBenchmarks 已被弃用,因为问题已经说明。该项目的维护人员建议继续使用JMH。谢谢 Barry NL 的提醒。

【讨论】:

我接受了这一点,因为我和我的团队对 JUnit 与这些选项的集成有着强烈的亲和力。 @Pangea 对于没有 Junit 集成的基准测试有一个很好的答案。 我们的项目已经为我们所有的单元测试实现了 JUnit。使用 JUnitPerf 框架将它们扩展到性能测试非常简单且有意义。 酷,很高兴这个答案仍然有用:) 关于 JUnitBenchmarks:“该项目已被 JMH 弃用。”可以在这里找到:openjdk.java.net/projects/code-tools/jmh【参考方案4】:

JUnit 更适合单元测试,也许在这种情况下 TestNG 会是更好的选择,尤其是它的@Dataprovider 功能:

//This method will provide data to any test method that declares that its Data Provider
//is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() 
 return new Object[][] 
    "Cedric", new Integer(36) ,
    "Anne", new Integer(37),
 ;

 
//This test method declares that its data should be supplied by the Data Provider
//named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) 
 System.out.println(n1 + " " + n2);

这里是specific doc。

【讨论】:

JUnit 支持非常相似的@Parameterized。

以上是关于JUnit 是编写性能测试的正确工具吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Junit 会关闭所有线程吗?

JUnit vs TestNG [关闭]

Java 单元测试及JUnit的使用

并行 JUnit 测试不执行关闭挂钩

JUnit在eclipse中有方便功能完整的统计覆盖率的功能吗

JUnit测试中的Guice注入器[关闭]