JUnit是编写性能测试的正确工具吗?

47

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

JUnit是测试性能的正确工具吗?在单元(方法和类)级别上,有更好的性能测试工具吗?

4个回答

46

可能有更好的方法,但也有一些框架可以帮助使用JUnit实现基准测试。一些有用的实践是预热运行,统计评估。请查看JUnitBenchmarksJUnitPerf

编辑看起来自题目提出后JUnitBenchmarks已经被废弃。该项目的维护者建议转向JMH。感谢Barry NL提供信息。


1
我接受了这个因为我和我的团队对JUnit集成有很强的亲和力,而@Pangea则提供了一个很好的答案来进行基准测试而不需要JUnit集成。 - Freiheit
1
我们的项目已经为所有单元测试实施了JUnit。使用JUnitPerf框架将它们扩展到性能测试非常容易且合理。 - Panini Luncher
很酷,很高兴这个答案仍然有用 :) - kostja
2
关于 JUnitBenchmarks:“该项目已被弃用,推荐使用 JMH。”可以在此处找到:http://openjdk.java.net/projects/code-tools/jmh/。 - Barry NL

23

正是我即将要推荐的 :) - bric3
1
Google Caliper似乎不是一个成功的项目。他们自两年前以来仍处于测试阶段(beta)。 - JeanValjean
Google Caliper现在自己推荐JMH用于新的基准测试项目,或者更适合Android Java/Kotlin的Jetpack - Reuel Ribeiro

7
你的测试应该被更好地定义为基准测试。是的,虽然JUnit不是最佳选择,但可以这样使用。例如,你可以定义测试的最大评估时间,因此如果算法被更改导致性能下降,则测试失败。使用@Test(timeout=12345)进行配置。
如果需要真正的性能测试,请考虑JMeter。

-6

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);
}

这里是具体文档


2
JUnit支持非常相似的@Parameterized。 - nes1983

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接