2012-02-07 81 views
37

在上週我創建了兩個班級,我的團隊對他們的表現表達了一些擔憂。爲了評估我的代碼,我編寫了一些簡單的JUnit測試,它們通過構建豐富的測試數據集來執行這些類,然後通過相關方法提供數據以進行數千次迭代。我記錄了每次迭代的運行時間,然後使用循環和System.nanoTime()註銷高,低和平均時間。最後,我讓JUnit聲稱高和平均時間在可接受的範圍內。這種測試方法讓我的團隊對此代碼充滿信心。JUnit是編寫性能測試的正確工具嗎?

JUnit是以這種方式測試性能的正確工具嗎?是否有更好的工具來測試單元(方法和類)的性能?

回答

37

可能有更好的方法,但也有一些框架可以幫助實現與JUnit的基準測試。一些有用的做法是預熱運行,統計評估。看看JUnitBenchmarksJUnitPerf

編輯看起來像JUnitBenchmarks已經廢棄了,因爲這個問題已經指出。該項目的維護人員建議移至JMH。謝謝巴里NL參加單挑。

+1

我接受這一點是因爲我和我的團隊對JUnit與這些選項的集成具有很強的親和力。 @Pangea對於沒有Junit集成的基準測試有很好的答案。 – Freiheit 2012-02-08 15:03:40

+1

我們的項目已經爲我們所有的單元測試實現了JUnit。將它們擴展到使用JUnitPerf框架進行性能測試非常簡單,也很合理。 – 2014-10-22 19:30:46

+0

酷,很高興這個答案仍然有用:) – kostja 2014-10-23 03:23:02

21

編號JUnit是爲單元測試而設計的。在Java中編寫性能測試時,需要注意很多事情。使用專爲編寫微基準測試而設計的Google Caliper

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

+0

正是我想要推薦:) – Brice 2012-02-07 14:58:11

+0

Google Caliper似乎並不是一個成功的項目。自2年以來,它們仍處於測試階段。 – JeanValjean 2017-10-11 09:26:52

6

測試應更好地定義爲基準測試。是的,JUnit可以用這種方式,儘管它不是最好的選擇。但是你可以例如定義最大值。評估測試時間,所以如果改變算法導致性能下降,則測試失敗。使用@Test(timeout=12345)進行配置。

如果您需要真正的性能測試,請考慮一下JMeter。

-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

+2

JUnit支持非常類似的@Parameterized。 – nes1983 2013-03-19 00:48:55