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

在上个星期,我创build了两个class级,我的团队对他们的performance表示了一些担忧。 为了评估我的代码,我编写了一些简单的JUnittesting,通过构build丰富的testing数据集来执行这些类,然后通过相关的方法提供数据以进行数千次迭代。 我logging了每次迭代的运行时间,然后使用循环和System.nanoTime()注销高,低和平均时间。 最后,我有JUnit断言高和平均时间在可接受的范围内。 这个testing方法给了我的团队对这个代码的信心。

JUnit是以这种方式testing性能的正确工具吗? 是否有更好的工具来testing单元(方法和类)的性能?

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

编辑看起来像JUnitBenchmarks已被弃用,因为问题已被陈述。 项目的维护人员build议转到JMH 。 谢谢Barry NL的提醒。

不,JUnit是为unit testing而devise的。 在Java中编写性能testing时,有很多事情需要注意。 使用专为编写微基准testing而devise的Google Caliper 。

看看我如何在Java中编写正确的微基准testing?

您的testing应该更好地定义为基准testing。 是的,JUnit可以这样使用,虽然它不是最好的select。 但是你可以例如定义最大值。 testing评估时间,所以如果algorithm改变导致性能下降,则testing失败。 使用@Test(timeout=12345)进行configuration。

如果你需要真正的性能testing考虑JMeter。

JUnit更多的是为unit testing而devise的,也许TestNG在这种情况下会是更好的select,特别是它的@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); } 

这是特定的文档 。