ContiPerf是一個輕量級的測試工具,它能很輕易的讓用戶使用Junit4的測試用例進行聯系的性能測試。其設計的靈感來自于Junit4利用注釋進行簡單的測試配置還來自于JUnitPerf用包裝單元測試用于性能測試的思路。
ContiPerf目前最新的版本是2.1,它的依賴少,只需要Java5和Junit4.7以上。而且可以很輕松的通過maven導入,只需在pom文件中加入以下內容:以下是一個簡單的例子:
首先,我們從上面的例子可以看到要使用ContiPerf必須現在@Rule的注釋下生成一個ContiPerfRule的對象。ContiPerfRule的構造函數有三個,分別為:
public ContiPerfRule()、public ContiPerfRule(ExecutionLogger executionLogger)和public ContiPerfRule(ReportModule... modules)。
@PerfTest
用戶可以在這個注釋中添加性能測試的執行要求。
Invocations:方法的執行次數,例:@PerfTest(invocations = 300)重復執行300次;
Threads:同時執行的線程數,例:@PerfTest(invocations = 30, threads = 2)兩個線程并發執行,每個線程執行15次,總共執行30次;
Duration:在指定時間范圍內一直執行測試,例:@PerfTest(duration = 300)在300毫秒內反復執行。
三個屬性可以組合使用,其中Threads必須和其他兩個屬性組合才能生效。當Invocations和Duration都有指定時,以執行次數多的為準。
例,@PerfTest(invocations = 300, threads = 2, duration = 100),如果執行方法300次的時候執行時間還沒到100ms,則繼續執行到滿足執行時間等于100ms,如果執行到50次的時候已經100ms了,則會繼續執行之100次。
如果你不想讓測試連續不間斷的跑完,可以通過注釋設置等待時間,例,@PerfTest(invocations = 1000, threads = 10, timer = RandomTimer.class, timerParams = { 30, 80 }) ,每執行完一次會等待30~80ms然后才會執行下一次調用。
在開多線程進行并發壓測的時候,如果一下子達到最大進程數有些系統可能會受不了,ContiPerf還提供了“預熱”功能,例,@PerfTest(threads = 10, duration = 60000, rampUp = 1000) ,啟動時會先起一個線程,然后每個1000ms起一線程,到9000ms時10個線程同時執行,那么這個測試實際執行了69s,如果只想衡量全力壓測的結果,那么可以在注釋中加入warmUp,即@PerfTest(threads = 10, duration = 60000, rampUp = 1000, warmUp = 9000) ,那么統計結果的時候會去掉預熱的9s。
當執行的測試類中包括了多個測試方法的時候,如下圖
則執行是順序的,先執行test1,再執行test2。結果如圖:
如果想讓一個測試類中的方法也是并發執行,那么只要在類的前面加一個注釋@RunWith(ParallelRunner.class)。
@Required
通過這個注釋可以添加一些對性能期望,如果達到期望值則測試通過,如果沒有達到期望值則執行失敗。
@Required(throughput = 20) :每秒鐘至少執行20次
@Required(average = 50):測試全部完成平均執行時間為20ms
@Required(median = 45):至少50%次執行的時間在45ms內
@Required(max = 2000) :所有執行的執行時間沒有超過2s
@Required(totalTime = 5000) :測試完成執行時間少于5s
@Required(percentile90 = 3000) :所有執行中90%的執行時間少于3s
@Required(percentile95 = 5000):所有執行中95%的執行時間少于5s
@Required(percentile99 = 10000):所有執行中99%的執行時間少于10s
@Required(percentiles = "66:200,96:500"):所有執行中66%的執行時間少于200ms,96%的執行時間少于500ms
@PerfTest和@Required不僅可以指定某一個方法,也可以至于類的前面指定某一個類的執行參數。例,
同時ContiPerf還支持推Test Suites的性能測試,只需在類的最前面加注釋@RunWith和@SuiteClasses ,例如:在每次執行完測試的時候,ContiPerf會自動生成測試報告,報告放在target/contiperf-report/index.html下。
PS:如果在對類指定了執行的參數,對類中的方法也執行了執行參數,那么實際執行的結果是什么?
通過簡單的實驗來解答這個問題:
為什么要新建ContiPerfRule這個對象?
原文轉自:http://www.anti-gravitydesign.com