在應(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ā)過(guò)程中不包含性能測(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ò)過(guò) Andrew 的 討論論壇,里面有關(guān)于代碼語(yǔ)法、測(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í)器的上下文中。 過(guò)度的負(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 的
我通過(guò)為一個(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è)試都通過(guò) JUnit 框架運(yùn)行,所以就存在額外的消耗,特別是在利用 fixture 時(shí)。由于 JUnit 本身用一個(gè) 相應(yīng)地,我經(jīng)常創(chuàng)建使用我想要的 fixture 邏輯的測(cè)試,但也會(huì)運(yùn)行一個(gè)空白測(cè)試來(lái)確定性能指數(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è)試無(wú)疑是一門嚴(yán)格的科學(xué),但在開發(fā)生命周期的早期,這是確定和監(jiān)控應(yīng)用程序代碼的低端性能的極佳方式。另外,由于它是一個(gè)基于裝飾器的 JUnit 擴(kuò)展框架,所以可以很容易地用 JUnitPerf 裝飾現(xiàn)有的 JUnit 測(cè)試。 想想您已經(jīng)花了這么多時(shí)間來(lái)?yè)?dān)心應(yīng)用程序在負(fù)載下會(huì)怎樣執(zhí)行。用 JUnitPerf 進(jìn)行性能測(cè)試可以為您減少擔(dān)憂并節(jié)省時(shí)間,同時(shí)也確保了應(yīng)用程序代碼的質(zhì)量。 參考資料學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
討論
|
|
來(lái)自: bananarlily > 《IT》