我通過為一個標準 Test 裝飾上 LoadTest(由 TimedTest 裝飾)應用了上述規(guī)范,清單 4 顯示了其結果。
清單 4. 經(jīng)裝飾的負載和時限測試
public static Test suite() {
int users = 10;
Timer timer = new ConstantTimer(100);
long maxElapsedTime = 2000;
return new TimedTest(new LoadTest(
new WidgetDAOImplTest("testCreate"), users, timer),
maxElapsedTime);
}
正如您所看到的那樣,testCreate() 方法運行 10 次(每隔 100 毫秒啟動一個線程),且每個線程必須在 2 秒內(nèi)完成,否則整個測試場景將失敗。
使用注意
盡管 JUnitPerf 是一個性能測試框架,但也要先大致估計一下測試要設定的性能指數(shù)。這是由于所有由 JUnitPerf 裝飾的測試都通過 JUnit 框架運行,所以存在額外的消耗,特別是在利用 fixture 時。由于 JUnit 本身用一個 setUp 和一個 tearDown() 方法裝飾所有測試樣例,所以要在測試場景的整個上下文中考慮執(zhí)行時間。
相應地,我經(jīng)常創(chuàng)建使用我想要的 fixture 邏輯的測試,但也會運行一個空白測試來確定性能指數(shù)基線。這是一個大致的估計,但它必須作為基線添加到任何想要的測試限制中。
例如,如果運行一個由 fixture 邏輯(使用 DbUnit)裝飾的空白測試用時 2.5 秒,那么您想要的所有測試限制都應將這一額外時間考慮在內(nèi) —— 這可以從清單 5 中的基準測試中看到:
清單 5. JUnitPerf 基準測試
public class DBUnitSetUpBenchmarkTest extends DatabaseTestCase {
private WidgetDAO dao = null;
public void testNothing(){
//should be about 2.5 seconds
}
protected IDatabaseConnection getConnection() throws Exception {
Class driverClass = Class.forName("org.hsqldb.jdbcDriver");
Connection jdbcConnection =
DriverManager.getConnection(
"jdbc:hsqldb:hsql://127.0.0.1", "sa", "");
return new DatabaseConnection(jdbcConnection);
}
protected IDataSet getDataSet() throws Exception {
return new FlatXmlDataSet(new File("test/conf/seed.xml"));
}
protected void setUp() throws Exception {
super.setUp();
final ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
this.dao = (WidgetDAO) context.getBean("widgetDAO");
}
}
請注意,清單 5 的測試樣例 testNothing() 什么都沒做。其惟一的目的是確定運行 setUp() 方法(當然,該方法也通過 DbUnit 設置了一個數(shù)據(jù)庫)的總時間。
也請記住,測試時間將依賴于機器的配置而變化,同時也依賴于在執(zhí)行 JUnitPerf 測試時運行的東西而變化。我經(jīng)常發(fā)現(xiàn),將 JUnitPerf 測試放到它們自己的分類中有助于將它們同標準測試隔離開。這意味著,在運行一個測試時不必每次都運行 JUnitPerf 測試,例如在一個 CI 環(huán)境中簽入代碼。我也會創(chuàng)建特定的 Ant 任務,從而只在精心策劃的將性能測試考慮在內(nèi)的場景或環(huán)境中運行這些測試。
試試吧!
用 JUnitPerf 進行性能測試無疑是一門嚴格的科學,但在開發(fā)生命周期的早期,這是確定和監(jiān)控應用程序代碼的低端性能的方式。另外,由于它是一個基于裝飾器的 JUnit 擴展框架,所以可以很容易地用 JUnitPerf 裝飾現(xiàn)有的 JUnit 測試。
想想您已經(jīng)花了這么多時間來擔心應用程序在負載下會怎樣執(zhí)行。用 JUnitPerf 進行性能測試可以為您減少擔憂并節(jié)省時間,同時也確保了應用程序代碼的質(zhì)量。