我通過為一個(gè)標(biāo)準(zhǔn) Test 裝飾上 LoadTest(由 TimedTest 裝飾)應(yīng)用了上述規(guī)范,清單 4 顯示了其結(jié)果。
清單 4. 經(jīng)裝飾的負(fù)載和時(shí)限測試
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() 方法運(yùn)行 10 次(每隔 100 毫秒啟動一個(gè)線程),且每個(gè)線程必須在 2 秒內(nèi)完成,否則整個(gè)測試場景將失敗。
使用注意
盡管 JUnitPerf 是一個(gè)性能測試框架,但也要先大致估計(jì)一下測試要設(shè)定的性能指數(shù)。這是由于所有由 JUnitPerf 裝飾的測試都通過 JUnit 框架運(yùn)行,所以存在額外的消耗,特別是在利用 fixture 時(shí)。由于 JUnit 本身用一個(gè) setUp 和一個(gè) tearDown() 方法裝飾所有測試樣例,所以要在測試場景的整個(gè)上下文中考慮執(zhí)行時(shí)間。
相應(yīng)地,我經(jīng)常創(chuàng)建使用我想要的 fixture 邏輯的測試,但也會運(yùn)行一個(gè)空白測試來確定性能指數(shù)基線。這是一個(gè)大致的估計(jì),但它必須作為基線添加到任何想要的測試限制中。
例如,如果運(yùn)行一個(gè)由 fixture 邏輯(使用 DbUnit)裝飾的空白測試用時(shí) 2.5 秒,那么您想要的所有測試限制都應(yīng)將這一額外時(shí)間考慮在內(nèi) —— 這可以從清單 5 中的基準(zhǔn)測試中看到:
清單 5. JUnitPerf 基準(zhǔn)測試
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() 什么都沒做。其惟一的目的是確定運(yùn)行 setUp() 方法(當(dāng)然,該方法也通過 DbUnit 設(shè)置了一個(gè)數(shù)據(jù)庫)的總時(shí)間。
也請記住,測試時(shí)間將依賴于機(jī)器的配置而變化,同時(shí)也依賴于在執(zhí)行 JUnitPerf 測試時(shí)運(yùn)行的東西而變化。我經(jīng)常發(fā)現(xiàn),將 JUnitPerf 測試放到它們自己的分類中有助于將它們同標(biāo)準(zhǔn)測試隔離開。這意味著,在運(yùn)行一個(gè)測試時(shí)不必每次都運(yùn)行 JUnitPerf 測試,例如在一個(gè) CI 環(huán)境中簽入代碼。我也會創(chuàng)建特定的 Ant 任務(wù),從而只在精心策劃的將性能測試考慮在內(nèi)的場景或環(huán)境中運(yùn)行這些測試。
試試吧!
用 JUnitPerf 進(jìn)行性能測試無疑是一門嚴(yán)格的科學(xué),但在開發(fā)生命周期的早期,這是確定和監(jiān)控應(yīng)用程序代碼的低端性能的方式。另外,由于它是一個(gè)基于裝飾器的 JUnit 擴(kuò)展框架,所以可以很容易地用 JUnitPerf 裝飾現(xiàn)有的 JUnit 測試。
想想您已經(jīng)花了這么多時(shí)間來擔(dān)心應(yīng)用程序在負(fù)載下會怎樣執(zhí)行。用 JUnitPerf 進(jìn)行性能測試可以為您減少擔(dān)憂并節(jié)省時(shí)間,同時(shí)也確保了應(yīng)用程序代碼的質(zhì)量。