|
在應(yīng)用程序的開發(fā)中,驗(yàn)證應(yīng)用程序的性能幾乎總處于次要的地位。請(qǐng)注意,我強(qiáng)調(diào)的是驗(yàn)證 應(yīng)用程序的性能。應(yīng)用程序的性能總是 首要考慮的因素,但開發(fā)周期中卻很少包含對(duì)性能的驗(yàn)證。 由于種種原因,性能測(cè)試常被延遲到開發(fā)周期的后期。以我的經(jīng)驗(yàn),企業(yè)之所以在開發(fā)過程中不包含性能測(cè)試是因?yàn)?,他們不知道?duì)于正在進(jìn)行開發(fā)的應(yīng)用程序要期待什么。提出了一些(性能)指數(shù),但這些指數(shù)是基于預(yù)期負(fù)載提出的。 發(fā)生下列兩種情況之一時(shí),性能測(cè)試就成為頭等大事:
本月,我將介紹兩種簡(jiǎn)單的性能測(cè)試技術(shù),在上述兩種情況中的任何一種發(fā)生前進(jìn)行測(cè)試。 改進(jìn)代碼質(zhì)量別錯(cuò)過 Andrew 的 討論論壇,里面有關(guān)于代碼語法、測(cè)試框架以及如何編寫專注于質(zhì)量的代碼的幫助。 用 JUnitPerf 進(jìn)行測(cè)試在軟件開發(fā)的早期階段,使用 JUnit 很容易確定基本的低端性能指數(shù)。JUnitPerf 框架能夠?qū)y(cè)試快速地轉(zhuǎn)化為簡(jiǎn)單的負(fù)載測(cè)試,甚至壓力測(cè)試。 可使用 JUnitPerf 創(chuàng)建兩種測(cè)試類型: 恰當(dāng)?shù)臅r(shí)限測(cè)試JUnitPerf 例如,假設(shè)存在一個(gè) Widget 應(yīng)用程序,其中,特定的對(duì)于業(yè)務(wù)致關(guān)重要的方法(如 創(chuàng)建 清單 1. 簡(jiǎn)單的 widget 測(cè)試public class WidgetDAOImplTest extends TestCase {
private WidgetDAO dao;
public void testCreate() throws Exception{
IWidget wdgt = new Widget();
wdgt.setWidgetId(1000);
wdgt.setPartNumber("12-34-BBD");
try{
this.dao.createWidget(wdgt);
}catch(CreateException e){
TestCase.fail("CreateException thrown creating a Widget");
}
}
protected void setUp() throws Exception {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
this.dao = (WidgetDAO) context.getBean("widgetDAO");
}
}由于 JUnitPerf 是一個(gè)基于裝飾器的框架,為了真正地駕馭它,必須提供一個(gè) 也可以選擇傳入一個(gè) 例如,在清單 2 中,我在運(yùn)行 清單 2. 為生成 TimedTest 而實(shí)現(xiàn)的 suite 方法public static Test suite() {
long maxElapsedTime = 2000; //2 seconds
Test timedTest = new TimedTest(
new WidgetDAOImplTest("testCreate"), maxElapsedTime);
return timedTest;
}此測(cè)試通常在 JUnit 框架中運(yùn)行 —— 現(xiàn)有的 Ant 任務(wù)、Eclipse 運(yùn)行器等等,會(huì)像運(yùn)行任何其他 JUnit 測(cè)試一樣運(yùn)行這個(gè)測(cè)試。惟一的不同是,該測(cè)試將發(fā)生在計(jì)時(shí)器的上下文中。 過度的負(fù)載測(cè)試與在測(cè)試場(chǎng)景中驗(yàn)證一個(gè)方法(或系列方法)的時(shí)間限制正好相反,JUnitPerf 也方便了負(fù)載測(cè)試。正如在 使用 清單 3 是用 清單 3. 為生成負(fù)載測(cè)試而實(shí)現(xiàn)的 suite 方法public static Test suite() {
int users = 10;
Timer timer = new ConstantTimer(100);
return new LoadTest(
new WidgetDAOImplTest("testCreate"),
users, timer);
}請(qǐng)注意, 用樣式進(jìn)行裝飾裝飾器并不局限于單個(gè)的裝飾物。例如,在 Java? I/O 中,可以為 裝飾可以有多個(gè)層次,JUnitPerf 的
我通過為一個(gè)標(biāo)準(zhǔn) 清單 4. 經(jīng)裝飾的負(fù)載和時(shí)限測(cè)試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);
}正如您所看到的那樣, 使用注意盡管 JUnitPerf 是一個(gè)性能測(cè)試框架,但也要先大致估計(jì)一下測(cè)試要設(shè)定的性能指數(shù)。這是由于所有由 JUnitPerf 裝飾的測(cè)試都通過 JUnit 框架運(yùn)行,所以就存在額外的消耗,特別是在利用 fixture 時(shí)。由于 JUnit 本身用一個(gè) 相應(yīng)地,我經(jīng)常創(chuàng)建使用我想要的 fixture 邏輯的測(cè)試,但也會(huì)運(yùn)行一個(gè)空白測(cè)試來確定性能指數(shù)基線。這是一個(gè)大致的估計(jì),但它必須作為基線添加到任何想要的測(cè)試限制中。 例如,如果運(yùn)行一個(gè)由 fixture 邏輯(使用 DbUnit)裝飾的空白測(cè)試用時(shí) 2.5 秒,那么您想要的所有測(cè)試限制都應(yīng)將這一額外時(shí)間考慮在內(nèi) —— 這可以從清單 5 中的基準(zhǔn)測(cè)試中看到: 清單 5. JUnitPerf 基準(zhǔn)測(cè)試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");
}
}請(qǐng)注意,清單 5 的測(cè)試樣例 也請(qǐng)記住,測(cè)試時(shí)間將依賴于機(jī)器的配置而變化,同時(shí)也依賴于在執(zhí)行 JUnitPerf 測(cè)試時(shí)運(yùn)行的東西而變化。我經(jīng)常發(fā)現(xiàn),將 JUnitPerf 測(cè)試放到它們自己的分類中有助于將它們同標(biāo)準(zhǔn)測(cè)試隔離開。這意味著,在運(yùn)行一個(gè)測(cè)試時(shí)不必每次都運(yùn)行 JUnitPerf 測(cè)試,例如在一個(gè) CI 環(huán)境中簽入代碼。我也會(huì)創(chuàng)建特定的 Ant 任務(wù),從而只在精心策劃的將性能測(cè)試考慮在內(nèi)的場(chǎng)景或環(huán)境中運(yùn)行這些測(cè)試。 試試吧!用 JUnitPerf 進(jìn)行性能測(cè)試無疑是一門嚴(yán)格的科學(xué),但在開發(fā)生命周期的早期,這是確定和監(jiān)控應(yīng)用程序代碼的低端性能的極佳方式。另外,由于它是一個(gè)基于裝飾器的 JUnit 擴(kuò)展框架,所以可以很容易地用 JUnitPerf 裝飾現(xiàn)有的 JUnit 測(cè)試。 想想您已經(jīng)花了這么多時(shí)間來擔(dān)心應(yīng)用程序在負(fù)載下會(huì)怎樣執(zhí)行。用 JUnitPerf 進(jìn)行性能測(cè)試可以為您減少擔(dān)憂并節(jié)省時(shí)間,同時(shí)也確保了應(yīng)用程序代碼的質(zhì)量。 參考資料學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
討論
|
|
|