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

时间:2012-02-07 14:50:49

标签: java junit performance-testing

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

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

4 个答案:

答案 0 :(得分:41)

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

编辑看起来JUnitBenchmarks已被弃用,因为问题已经陈述。该项目的维护人员建议继续JMH。谢谢Barry NL的单挑。

答案 1 :(得分:21)

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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:-5)

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