在上周,我创建了两个课程,我的团队对他们的表现表示了一些担忧。为了评估我的代码,我编写了一些简单的JUnit测试,它们通过构建丰富的测试数据集来运行这些类,然后通过相关方法为数千次迭代提供数据。我记录了每次迭代的运行时间,然后使用循环和System.nanoTime()
记录了高,低和平均时间。最后我让JUnit断言高和平均时间都在可接受的范围内。这种测试方法让我的团队对此代码充满信心。
JUnit是否是以这种方式测试性能的合适工具?是否有更好的工具来测试单元(方法和类)级别的性能?
答案 0 :(得分:41)
可能有更好的方法,但也有一些框架可以帮助实现与JUnit的基准测试。一些有用的实践是热身运行,统计评估。请查看JUnitBenchmarks和JUnitPerf
编辑看起来JUnitBenchmarks已被弃用,因为问题已经陈述。该项目的维护人员建议继续JMH。谢谢Barry NL的单挑。
答案 1 :(得分:21)
没有。 JUnit专为单元测试而设计。在Java中编写性能测试时需要注意很多事情。使用专为编写微基准测试而设计的Google Caliper。
答案 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。