摘要
JUnitPerf是一個來度量代碼的性能和執(zhí)行效率的一個性能測試工具,通過編寫用于JUnitPerf的單元測試代碼可以使這一過程自動化。從另外一個角度來說它是JUnit的一個擴展插件。
假如你對這種類型的自動化測試感興趣的話可以參考我寫的書《Pragmatic Project Automation》
您也可以花兩天時間光顧一下站點《Test-Driven Development with JUnit Workshop》,這里提供了一些很好的JUnit的學習途徑并且還有Mike Clark的一些講義和實踐指導手冊幫助你更深入地了解測試驅(qū)動開發(fā)。
簡介
JUnitPerf是基于JUnit的一個度量性能和執(zhí)行效率的一個自動化測試框架(工具)。
JUnitPerf包含以下兩個主要的類(擴展了JUnit):
· TimedTest
TimedTest用來執(zhí)行測試,返回執(zhí)行該測試所使用的時間。
TimedTest構(gòu)造方法中需要指定一個大可接受的執(zhí)行時間。默認情況下,執(zhí)行該方法時會等待被執(zhí)行的測試執(zhí)行完畢,如果實際所用的時間超過了指定的大時間則標識測試失敗。另外你也可以通過在構(gòu)造方法指定當實際執(zhí)行時間超過大可接受時間時不繼續(xù)執(zhí)行該測試,并標識測試未通過。
· LoadTest
LoadTest用來模仿多個并發(fā)用戶多次迭代執(zhí)行測試。
使用目的
很明顯,JUnitPerf是對JUnit測試框架的一個擴展。這種方式的擴展允許動態(tài)地增加JUnit測試用例來進行性能測試,不會影響到先前的測試。這樣您可以快速簡易地構(gòu)造出性能測試套件。
性能測試套件可以自動地,獨立于其它的JUnit測試用例執(zhí)行。實際使用中,一般要盡量避免把JUnit測試用例和JUnitPerf測試用例組織在一起,這樣才能更加獨立地執(zhí)行測試套件,并且也可按不同的順序執(zhí)行。持續(xù)時間較長的性能測試可能會延長測試的時間,從而導致你不愿意去執(zhí)行所有的單元測試。因此,這需要你有計劃地不時地去執(zhí)行該測試,而不必影響到其他工作。
JUnitPerf傾向于針對已經(jīng)有明確的性能要求或者執(zhí)行效率要求,并且要保證代碼重構(gòu)后依然保持這樣的目標的測試。例如,您可以使用JUnitPerf測試來確保在同樣的條件下不會由于改變算法而導致性能降低。您也可以使用它來確保重構(gòu)一個資源池后不會導致在負載情況下的執(zhí)行效率降低(這種保證是通過比較條件改變前后的執(zhí)行時間和效率,只提供一個度量的依據(jù))。
從投入產(chǎn)出的角度來看維護一個注重實效的測試是相當重要的。傳統(tǒng)的性能度量工具和技術(shù)首先會去找出性能問題的潛在出處,而JUnitPerf則用來不斷地自動測試并且檢查需求和實際的結(jié)果。
以下是一個實際使用場景的例子:
你有一個功能良好的程序,并且通過了必要的JUnit測試套件的測試驗證功能通過。從這個角度來說你已經(jīng)達到了設(shè)計所想象的目標。
然后使用一個性能度量工具來分析程序的哪部分執(zhí)行時間長;谠O(shè)計知識,您已經(jīng)具有很好的工具對程序做實際的評估。并且重構(gòu)后的代碼清晰簡潔,接下來的工作是調(diào)整一小部分代碼。
接下來可以寫JUnitPerf測試用例了,為這部分代碼指定可接受的性能和效率參數(shù)。如果不對代碼做任何改動的情況下直接進行測試將不會通過,證明測試用例是正確的。接著對代碼做一些小的調(diào)整。
每次調(diào)整后都重新編譯和運行JUnitPerf測試。如果實際的性能到達了預期的指標,測試算是通過了。如果實際的性能達不到預期的指標,需要繼續(xù)調(diào)整過程直到測試通過。如果將來代碼再次重構(gòu)了你也可以重新運行測試。如果測試未通過,而同時之前的性能標準也提高了,這時需要回溯到原來并且繼續(xù)重構(gòu)直到測試通過。
JUnitPerf下載
JUnitPerf 1.9是當前新的版本。包含以前所有版本的功能。
本版需要Java 2和JUnit 3.5或以上版本。
發(fā)行包包含一個JAR文件,源代碼,示例代碼,API文檔和本文檔。
JUnitPerf 安裝
Windows
在Windows上按以下步驟安裝:
1. 解壓junitperf-<version>.zip文件到一個目錄中,在系統(tǒng)環(huán)境變量中增加%JUNITPERF_HOME%,值為文件解壓后的目錄。
2. 把JUnitPerf加到CLASSPATH路徑中:
set CLASSPATH=%CLASSPATH%;%JUNITPERF_HOME%libjunitperf-<version>.jar
Unix (bash)
在UNIX上按以下步驟安裝:
1. 解壓縮junitperf-<version>.zip到相應的目錄下。例如:$JUNITPERF_HOME。
2. 修改文件的權(quán)限:
chmod -R a+x $JUNITPERF_HOME
3. 把JUnitPerf加到CLASSPATH路徑中:
export CLASSPATH=$CLASSPATH:$JUNITPERF_HOME/lib/junitperf-<version>.jar
構(gòu)建與測試
在$JUNITPERF_HOME/lib/junitperf-<version>.jar文件中已經(jīng)包含有編譯好的類文件。
構(gòu)建
$JUNITPERF_HOME/build.xml文件是Ant構(gòu)建文件。
可以使用以下命令構(gòu)建JUnitPerf:
cd $JUNITPERF_HOME
ant jar
測試
JUnitPerf安裝包中包含了用于跟JUnitPerf結(jié)合使用的JUnit測試用例的實例。
可以輸入以下命令驗證JUnitPerf安裝是否正常:
cd $JUNITPERF_HOME
ant test
如何使用JUnitPerf
好的方式是使用JUnitPerf中附帶的示例,這里包含了各種類型的測試。
$JUNITPERF_HOME/samples目錄包含了本文中所講的所有示例代碼.
TimedTest
TimedTest構(gòu)造方法有兩個參數(shù),一個是已存在的JUnit測試用例,另一個是預期的大的執(zhí)行時間。
例如要針對ExampleTestCase.testOneSecondResponse()方法創(chuàng)建一個執(zhí)行時間的測試并且等待該方法執(zhí)行完畢,如果時間超過1秒則視為未通過。