<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    【源譯】JUnitPerf 使用手冊(cè)

    From:http://www.itcomputer.com.cn/Programs/Java/java/200512/2439.html

    【源譯】 JUnitPerf 使用手冊(cè)

    ?

    JUnitPerf

    摘要

    JUnitPerf是一個(gè)來(lái)度量代碼的性能和執(zhí)行效率的一個(gè)性能測(cè)試工具,通過(guò)編寫(xiě)用于JUnitPerf的單元測(cè)試代碼可以使這一過(guò)程自動(dòng)化。從另外一個(gè)角度來(lái)說(shuō)它是 JUnit 的一個(gè)擴(kuò)展插件。

    假如你對(duì)這種類型的自動(dòng)化測(cè)試感興趣的話可以參考我寫(xiě)的書(shū)《Pragmatic Project Automation

    您也可以花兩天時(shí)間光顧一下站點(diǎn)《Test-Driven Development with JUnit Workshop》,這里提供了一些很好的JUnit的學(xué)習(xí)途徑并且還有Mike Clark的一些講義和實(shí)踐指導(dǎo)手冊(cè)幫助你更深入地了解測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。

    目錄

    ·???????? 簡(jiǎn)介

    ·???????? 使用目的

    ·???????? JUnitPerf下載

    ·???????? JUnitPerf安裝

    ·???????? JUnitPerf構(gòu)建與測(cè)試

    ·???????? 如何使用JUnitPerf

    ·???????? 編寫(xiě)有效的JUnitPerf測(cè)試

    ·???????? 局限性

    ·???????? 技術(shù)支持

    ·???????? 捐助

    ·???????? 培訓(xùn)與指導(dǎo)

    ·???????? 許可信息

    ·???????? 感謝

    ·???????? 相關(guān)資源

    簡(jiǎn)介

    JUnitPerf是基于JUnit的一個(gè)度量性能和執(zhí)行效率的一個(gè)自動(dòng)化測(cè)試框架(工具)。

    JUnitPerf包含以下兩個(gè)主要的類(擴(kuò)展了JUnit):

    ·???????? TimedTest

    TimedTest用來(lái)執(zhí)行測(cè)試,返回執(zhí)行該測(cè)試所使用的時(shí)間。

    TimedTest構(gòu)造方法中需要指定一個(gè)最大可接受的執(zhí)行時(shí)間。默認(rèn)情況下,執(zhí)行該方法時(shí)會(huì)等待被執(zhí)行的測(cè)試執(zhí)行完畢,如果實(shí)際所用的時(shí)間超過(guò)了指定的最大時(shí)間則標(biāo)識(shí)測(cè)試失敗。另外你也可以通過(guò)在構(gòu)造方法指定當(dāng)實(shí)際執(zhí)行時(shí)間超過(guò)最大可接受時(shí)間時(shí)不繼續(xù)執(zhí)行該測(cè)試,并標(biāo)識(shí)測(cè)試未通過(guò)。

    ·???????? LoadTest

    LoadTest用來(lái)模仿多個(gè)并發(fā)用戶多次迭代執(zhí)行測(cè)試。

    使用目的

    很明顯,JUnitPerf是對(duì)JUnit測(cè)試框架的一個(gè)擴(kuò)展。這種方式的擴(kuò)展允許動(dòng)態(tài)地增加JUnit測(cè)試用例來(lái)進(jìn)行性能測(cè)試,不會(huì)影響到先前的測(cè)試。這樣您就可以快速簡(jiǎn)易地構(gòu)造出性能測(cè)試套件。

    性能測(cè)試套件可以自動(dòng)地,獨(dú)立于其它的JUnit測(cè)試用例執(zhí)行。實(shí)際使用中,一般要盡量避免把JUnit測(cè)試用例和JUnitPerf測(cè)試用例組織在一起,這樣才能更加獨(dú)立地執(zhí)行測(cè)試套件,并且也可按不同的順序執(zhí)行。持續(xù)時(shí)間較長(zhǎng)的性能測(cè)試可能會(huì)延長(zhǎng)測(cè)試的時(shí)間,從而導(dǎo)致你不愿意去執(zhí)行所有的單元測(cè)試。因此,這需要你有計(jì)劃地不時(shí)地去執(zhí)行該測(cè)試,而不必影響到其他工作。

    JUnitPerf傾向于針對(duì)已經(jīng)有明確的性能要求或者執(zhí)行效率要求,并且要保證代碼重構(gòu)后依然保持這樣的目標(biāo)的測(cè)試。例如,您可以使用JUnitPerf測(cè)試來(lái)確保在同樣的條件下不會(huì)由于改變算法而導(dǎo)致性能降低。您也可以使用它來(lái)確保重構(gòu)一個(gè)資源池后不會(huì)導(dǎo)致在負(fù)載情況下的執(zhí)行效率降低(這種保證是通過(guò)比較條件改變前后的執(zhí)行時(shí)間和效率,只提供一個(gè)度量的依據(jù))。

    從投入產(chǎn)出的角度來(lái)看維護(hù)一個(gè)注重實(shí)效的測(cè)試是相當(dāng)重要的。傳統(tǒng)的性能度量工具和技術(shù)首先會(huì)去找出性能問(wèn)題的潛在出處,而JUnitPerf則用來(lái)不斷地自動(dòng)測(cè)試并且檢查需求和實(shí)際的結(jié)果。

    以下是一個(gè)實(shí)際使用場(chǎng)景的例子:

    你有一個(gè)功能良好的程序,并且通過(guò)了必要的JUnit測(cè)試套件的測(cè)試驗(yàn)證功能通過(guò)。從這個(gè)角度來(lái)說(shuō)你已經(jīng)達(dá)到了設(shè)計(jì)所想象的目標(biāo)。

    然后使用一個(gè)性能度量工具來(lái)分析程序的哪部分執(zhí)行時(shí)間最長(zhǎng)。基于設(shè)計(jì)知識(shí),您已經(jīng)具有很好的工具對(duì)程序做實(shí)際的評(píng)估。并且重構(gòu)后的代碼清晰簡(jiǎn)潔,接下來(lái)的工作就是調(diào)整一小部分代碼。

    接下來(lái)就可以寫(xiě)JUnitPerf測(cè)試用例了,為這部分代碼指定可接受的性能和效率參數(shù)。如果不對(duì)代碼做任何改動(dòng)的情況下直接進(jìn)行測(cè)試將不會(huì)通過(guò),證明測(cè)試用例是正確的。接著對(duì)代碼做一些小的調(diào)整。

    每次調(diào)整后都重新編譯和運(yùn)行JUnitPerf測(cè)試。如果實(shí)際的性能到達(dá)了預(yù)期的指標(biāo),測(cè)試就算是通過(guò)了。如果實(shí)際的性能達(dá)不到預(yù)期的指標(biāo),就需要繼續(xù)調(diào)整過(guò)程直到測(cè)試通過(guò)。如果將來(lái)代碼再次重構(gòu)了你也可以重新運(yùn)行測(cè)試。如果測(cè)試未通過(guò),而同時(shí)之前的性能標(biāo)準(zhǔn)也提高了,這時(shí)就需要回溯到原來(lái)并且繼續(xù)重構(gòu)直到測(cè)試通過(guò)。

    JUnitPerf下載

    JUnitPerf 1.9是當(dāng)前最新的版本。包含以前所有版本的功能。

    本版需要Java 2和JUnit 3.5或以上版本。

    發(fā)行包包含一個(gè)JAR文件,源代碼,示例代碼,API文檔和本文檔。

    JUnitPerf 安裝

    Windows

    Windows上按以下步驟安裝:

    1.???? 解壓junitperf-<version>.zip文件到一個(gè)目錄中,在系統(tǒng)環(huán)境變量中增加%JUNITPERF_HOME%,值為文件解壓后的目錄。

    2.???? 把JUnitPerf加到CLASSPATH路徑中:

    set CLASSPATH=%CLASSPATH%;%JUNITPERF_HOME%\lib\junitperf-<version>.jar

    Unix (bash)

    UNIX上按以下步驟安裝:

    1.???? 解壓縮junitperf-<version>.zip到相應(yīng)的目錄下。例如:$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)建與測(cè)試

    $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

    測(cè)試

    JUnitPerf安裝包中包含了用于跟JUnitPerf結(jié)合使用的JUnit測(cè)試用例的實(shí)例。

    可以輸入以下命令驗(yàn)證JUnitPerf安裝是否正常:

    cd $JUNITPERF_HOME

    ant test

    如何使用JUnitPerf

    最好的方式是使用JUnitPerf中附帶的示例,這里包含了各種類型的測(cè)試。

    $JUNITPERF_HOME/samples目錄包含了本文中所講的所有示例代碼.

    TimedTest

    TimedTest構(gòu)造方法有兩個(gè)參數(shù),一個(gè)是已存在的JUnit測(cè)試用例,另一個(gè)是預(yù)期的最大的執(zhí)行時(shí)間。

    例如要針對(duì)ExampleTestCase.testOneSecondResponse()方法創(chuàng)建一個(gè)執(zhí)行時(shí)間的測(cè)試并且等待該方法執(zhí)行完畢,如果時(shí)間超過(guò)1秒則視為未通過(guò)。

    long maxElapsedTime = 1000;

    Test testCase = new ExampleTestCase("testOneSecondResponse");

    Test timedTest = new TimedTest(testCase, maxElapsedTime);

    同樣地,如果想要在執(zhí)行過(guò)程如果超出預(yù)期時(shí)間立即結(jié)束本次測(cè)試可以在TimedTest構(gòu)造函數(shù)中增加第三個(gè)參數(shù),舉例如下:

    long maxElapsedTime = 1000;

    Test testCase = new ExampleTestCase("testOneSecondResponse");

    Test timedTest = new TimedTest(testCase, maxElapsedTime, false);

    以下代碼創(chuàng)建了一個(gè)執(zhí)行時(shí)間的測(cè)試,用來(lái)測(cè)試被定義在單元測(cè)試ExampleTestCase.testOneSecondResponse()方法所代表的功能執(zhí)行的時(shí)間。

    執(zhí)行效率測(cè)試舉例

    import com.clarkware.junitperf.*;

    import junit.framework.Test;

    ?

    public class ExampleTimedTest {

    ?

    ??? public static Test suite() {

    ???????

    ??????? long maxElapsedTime = 1000;

    ???????

    ??????? Test testCase = new ExampleTestCase("testOneSecondResponse");

    ??????? Test timedTest = new TimedTest(testCase, maxElapsedTime);

    ???????

    ??????? return timedTest;

    ??? }

    ???

    ??? public static void main(String[] args) {

    ??????? junit.textui.TestRunner.run(suite());

    ??? }

    }

    LoadTest

    LoadTest用來(lái)仿效多個(gè)用戶并發(fā)執(zhí)行多次來(lái)進(jìn)行測(cè)試。

    LoadTest最簡(jiǎn)單的構(gòu)造函數(shù)只有兩個(gè)參數(shù),測(cè)試用例和用戶數(shù),默認(rèn)情況下該測(cè)試只迭代一次。

    例如,創(chuàng)建一個(gè)10用戶并發(fā)執(zhí)行一次ExampleTestCase.testOneSecondResponse()方法:

    int users = 10;

    Test testCase = new ExampleTestCase("testOneSecondResponse");

    Test loadTest = new LoadTest(testCase, users);

    負(fù)載測(cè)試過(guò)程也可以指定一個(gè)額外的計(jì)數(shù)器實(shí)例用來(lái)指定用戶并發(fā)執(zhí)行之間的延遲時(shí)間。ConstantTimer類構(gòu)造函數(shù)包含一個(gè)常量參數(shù),用來(lái)指定延遲時(shí)間,如果指定為0則表示所有的用戶同時(shí)開(kāi)始。RandomTimer類可以構(gòu)造出隨機(jī)的延遲時(shí)間。

    例如:創(chuàng)建一個(gè)負(fù)載測(cè)試,10個(gè)并發(fā)用戶各執(zhí)行一次ExampleTestCase.testOneSecondResponse()方法,各個(gè)用戶之間延遲1秒鐘執(zhí)行。

    int users = 10;

    Timer timer = new ConstantTimer(1000);

    Test testCase = new ExampleTestCase("testOneSecondResponse");

    Test loadTest = new LoadTest(testCase, users, timer);

    為了仿效并發(fā)用戶以指定迭代次數(shù)執(zhí)行測(cè)試,LoadTest類構(gòu)造函數(shù)包含了RepeatedTest參數(shù)。這樣就可以為每個(gè)測(cè)試用例指定迭代次數(shù)了。

    例如:創(chuàng)建一個(gè)負(fù)載測(cè)試,10個(gè)并發(fā)用戶,每個(gè)用戶迭代執(zhí)行ExampleTestCase.testOneSecondResponse()方法20次,每個(gè)并發(fā)用戶之間延遲1秒。

    int users = 10;

    int iterations = 20;

    Timer timer = new ConstantTimer(1000);

    Test testCase = new ExampleTestCase("testOneSecondResponse");

    Test repeatedTest = new RepeatedTest(testCase, iterations);

    Test loadTest = new LoadTest(repeatedTest, users, timer);

    或者這樣來(lái)寫(xiě):

    int users = 10;

    int iterations = 20;

    Timer timer = new ConstantTimer(1000);

    Test testCase = new ExampleTestCase("testOneSecondResponse");

    Test loadTest = new LoadTest(testCase, users, iterations, timer);

    如果負(fù)載測(cè)試要求測(cè)試在setUp()方法中包含特殊的測(cè)試狀態(tài),那么就應(yīng)該使用TestFactory類來(lái)確保每個(gè)并發(fā)用戶線程使用一個(gè)本地線程測(cè)試實(shí)例。例如創(chuàng)建一個(gè)10用戶并發(fā)的測(cè)試,每個(gè)用戶運(yùn)行ExampleStatefulTest類的一個(gè)本地線程,可這樣來(lái)寫(xiě):

    int users = 10;

    Test factory = new TestFactory(ExampleStatefulTest.class);

    Test loadTest = new LoadTest(factory, users);

    如果測(cè)試其中的某一個(gè)方法,可以這樣:

    int users = 10;

    Test factory = new TestMethodFactory(ExampleStatefulTest.class, "testSomething");

    Test loadTest = new LoadTest(factory, users);

    以下的例子是測(cè)試單元測(cè)試ExampleTestCase.testOneSecondResponse()方法對(duì)應(yīng)的功能的一個(gè)負(fù)載測(cè)試,用來(lái)測(cè)試該功能的執(zhí)行效率。其中有10個(gè)并發(fā)用戶,無(wú)延遲,每個(gè)用戶只運(yùn)行一次。LoadTest本身使用了TimedTest來(lái)得到在負(fù)載情況下ExampleTestCase.testOneSecondResponse()方法的實(shí)際運(yùn)行能力。如果全部的執(zhí)行時(shí)間超過(guò)了1.5秒則視為不通過(guò)。10個(gè)并發(fā)處理在1.5秒通過(guò)才算通過(guò)。

    負(fù)載下承受能力測(cè)試舉例

    import com.clarkware.junitperf.*;

    import junit.framework.Test;

    public class ExampleThroughputUnderLoadTest {

    ??? public static Test suite() {

    ????

    ??????? int maxUsers = 10;

    ??????? long maxElapsedTime = 1500;

    ???????

    ??????? Test testCase = new ExampleTestCase("testOneSecondResponse");

    ??????? Test loadTest = new LoadTest(testCase, maxUsers);

    ??????? Test timedTest = new TimedTest(loadTest, maxElapsedTime);

    ??????? return timedTest;

    ??? }

    ???

    ??? public static void main(String[] args) {

    ??????? junit.textui.TestRunner.run(suite());

    ??? }

    }

    在下面的例子中,測(cè)試被顛倒過(guò)來(lái)了,TimedTest度量ExampleTestCase.testOneSecondResponse()方法的執(zhí)行時(shí)間。然后LoadTest中嵌套了TimedTest來(lái)仿效10個(gè)并發(fā)用戶執(zhí)行ExampleTestCase.testOneSecondResponse()方法。如果某個(gè)用戶的執(zhí)行時(shí)間超過(guò)了1秒則視為不通過(guò)。

    負(fù)載下響應(yīng)時(shí)間測(cè)試舉例

    import com.clarkware.junitperf.*;

    import junit.framework.Test

    public class ExampleResponseTimeUnderLoadTest {

    ??? public static Test suite() {

    ????

    ??????? int maxUsers = 10;

    ??????? long maxElapsedTime = 1000;

    ???????

    ??????? Test testCase = new ExampleTestCase("testOneSecondResponse");

    ??????? Test timedTest = new TimedTest(testCase, maxElapsedTime);

    ??????? Test loadTest = new LoadTest(timedTest, maxUsers);

    ??????? return loadTest;

    ??? }

    ???

    ??? public static void main(String[] args) {

    ??????? junit.textui.TestRunner.run(suite());

    ??? }

    }

    性能測(cè)試套件

    下面的測(cè)試用例例子中把ExampleTimedTest和ExampleLoadTest結(jié)合在一個(gè)測(cè)試套件中,這樣就可以自動(dòng)地執(zhí)行所有相關(guān)的性能測(cè)試了:

    Example Performance Test Suite

    import junit.framework.Test;

    import junit.framework.TestSuite;

    public class ExamplePerfTestSuite {

    ??? public static Test suite() {

    ??????? TestSuite suite = new TestSuite()

    suite.addTest(ExampleTimedTest.suite());

    ??????? suite.addTest(ExampleLoadTest.suite());

    ???????

    ??????? return suite;

    ??? }

    ???

    ??? public static void main(String[] args) {

    ??????? junit.textui.TestRunner.run(suite());

    ??? }

    }

    編寫(xiě)有效的JUnitPerf測(cè)試

    Timed Tests

    Waiting Timed Tests

    默認(rèn)情況下TimedTest測(cè)試中如果實(shí)際測(cè)試時(shí)間超過(guò)了預(yù)期時(shí)間則繼續(xù)執(zhí)行JUnit的測(cè)試。這種waiting timed test總是允許JUnit測(cè)試?yán)鄯e所有的測(cè)試結(jié)果,直到測(cè)試完成并且檢查完所有的測(cè)試結(jié)果。

    如果測(cè)試執(zhí)行中等待測(cè)試完畢的用例直接或間接地派生多個(gè)線程,那么此次測(cè)試只有等到所有的線程執(zhí)行完畢才會(huì)返回到timed test中。另外一方面該測(cè)試將無(wú)限期地等待。一般來(lái)說(shuō),單元測(cè)試應(yīng)該等待所有派生的線程執(zhí)行完畢,例如使用Thread.join()方法,以便準(zhǔn)確地判斷結(jié)果。

    Non-Waiting Timed Tests

    此外,TimedTest還提供了一個(gè)構(gòu)造方法,當(dāng)實(shí)際時(shí)間超過(guò)預(yù)期時(shí)間時(shí)立即表示未通過(guò)。這種類型的測(cè)試如果執(zhí)行時(shí)間超過(guò)了預(yù)期的最大時(shí)間則不等待測(cè)試?yán)^續(xù)執(zhí)行完畢。這種類型的測(cè)試比上一種方式更加有效,根據(jù)需要這種測(cè)試可節(jié)約時(shí)間,將不再等待程序執(zhí)行并且立即標(biāo)識(shí)測(cè)試未通過(guò)。然而,跟上面一種類型不同的是,這種類型的測(cè)試如果中間有測(cè)試不通過(guò)的話就不繼續(xù)執(zhí)行后面的測(cè)試了。

    Load Tests

    Non-Atomic Load Tests

    默認(rèn)情況下,如果LoadTest擴(kuò)展出來(lái)的測(cè)試直接或間接地派生線程,它不會(huì)強(qiáng)制這種線程并發(fā)執(zhí)行(正如在事務(wù)中定義的一樣)。這種類型的測(cè)試假設(shè)它擴(kuò)展的測(cè)試在當(dāng)返回控制時(shí)交互地完成。例如如果擴(kuò)展測(cè)試的派生線程和控制返回沒(méi)有等待派生進(jìn)程執(zhí)行完畢,那么擴(kuò)展測(cè)試就假定為一次性地完成了。

    而一般來(lái)講,單元測(cè)試中為了準(zhǔn)確地判斷結(jié)果,應(yīng)該等待派生的線程也執(zhí)行完畢,例如使用Thread.join()方法然而在某些情況下并不是一定要這樣的。例如,對(duì)于EJB分布式的查詢結(jié)果,應(yīng)用服務(wù)器可能派生一個(gè)新的線程去處理這個(gè)請(qǐng)求。如果新的線程在同一個(gè)線程組中運(yùn)行decorated測(cè)試(默認(rèn)情況),那么一個(gè)非原子的壓力測(cè)試僅僅等待壓力測(cè)試直接派生的線程執(zhí)行完畢而新生成的線程則會(huì)被忽略掉。

    總之,非原子壓力測(cè)試僅僅等待壓力測(cè)試中直接派生的線程執(zhí)行完畢來(lái)模仿多個(gè)并發(fā)用戶。

    Atomic Load Tests

    如果多個(gè)線程規(guī)定一個(gè)decorated測(cè)試成功地執(zhí)行,這就意味著只有所有decorated測(cè)試中的線程執(zhí)行完畢這個(gè)decorated測(cè)試才被認(rèn)為是完成了。可以使用setEnforceTestAtomicity(true)來(lái)強(qiáng)迫執(zhí)行這種測(cè)試()。這將有效地促使這種測(cè)試等待屬于decorated測(cè)試的線程組的所有線程執(zhí)行完畢。原子性壓力測(cè)試也會(huì)把任何過(guò)早退出的線程當(dāng)成是失敗。如果一個(gè)線程突然崩潰,那么屬于同一線程組的其他線程就會(huì)立即停止執(zhí)行。

    如果decorated測(cè)試派生的線程屬于同一個(gè)線程組,默認(rèn)情況下線程執(zhí)行decorated 測(cè)試,這樣原子壓力測(cè)試將無(wú)限期地等待派生的線程執(zhí)行完畢。

    總之,原子壓力測(cè)試將等待所有屬于同一線程組的線程執(zhí)行完畢,壓力測(cè)試直接派生的線程,來(lái)模仿多個(gè)用戶并發(fā)。

    局限性

    JUnitPerf已知有以下缺陷:

    ·???????? TimedTest返回的時(shí)間是測(cè)試用例的testXXX()方法的時(shí)間,包括setUp(), testXXX()和 tearDown()三個(gè)方法的總時(shí)間,這是任何測(cè)試實(shí)例中所能提供的最小的測(cè)試粒度。因此期望的時(shí)間也應(yīng)該考慮set-up 和tear-down的運(yùn)行時(shí)間。(譯者注:或者可以自己在JUnit測(cè)試用例使用System.currentTimeMillis()方法來(lái)計(jì)算某個(gè)步驟的執(zhí)行時(shí)間)

    ·???????? JUnitPerf并不是一個(gè)完整的壓力和性能測(cè)試工具,并且它也不會(huì)用來(lái)取代其它類似的工具。它僅僅用來(lái)編寫(xiě)本地的單元性能測(cè)試來(lái)幫助開(kāi)發(fā)人員做好重構(gòu)。

    ·???????? The performance of your tests can degrade significantly if too many concurrent users are cooperating in a load test. The actual threshold number is JVM specific.

    在壓力測(cè)試中如果有太多的用戶并發(fā)運(yùn)行則測(cè)試情況會(huì)越來(lái)越糟。應(yīng)該參照JVM的規(guī)范來(lái)指定用戶數(shù)。

    技術(shù)支持

    如果您有任何關(guān)于JUnitPerf的疑問(wèn),需要改進(jìn)的要求,成功的經(jīng)歷或者bug,或者當(dāng)有新的版本發(fā)布時(shí)得到通知請(qǐng)發(fā)email給mike@clarkware.com。您的個(gè)人信息不會(huì)被公開(kāi)。

    您也可以通過(guò)郵件列表(http://groups.yahoo.com/group/junitperf/)的方式來(lái)討論有關(guān)JUnitPerf并且在有新的版本發(fā)布時(shí)收到通知。

    捐助

    您可以通過(guò)購(gòu)買(mǎi)《Pragmatic Project Automation》(http://www.pragmaticprogrammer.com/sk/auto/)一書(shū)的方式支持JUnitPerf的繼續(xù)開(kāi)發(fā)。

    培訓(xùn)與指導(dǎo)

    可以通過(guò)訪問(wèn)站點(diǎn)http://clarkware.com/courses/TDDWithJUnit.html了解有關(guān)快速地創(chuàng)建測(cè)試代碼的方法。

    這里也提供有關(guān)JUnit的指導(dǎo)(http://clarkware.com/mentoring.html)來(lái)幫助你改進(jìn)測(cè)試。

    如果想獲得更多的信息請(qǐng)與我聯(lián)系(mailto:mike@clarkware.com)。

    許可信息

    JUnitPerf is licensed under the BSD License.

    感謝

    非常感謝Ervin Varga在線程健壯性和原子性測(cè)試方面給予的幫助。他在這些方面提出使用線程組來(lái)捕獲和處理線程的異常,此外在TimeTest和TestFactory中提出了如果執(zhí)行時(shí)間超時(shí)則立即標(biāo)識(shí)為失敗的實(shí)現(xiàn)方式。非常感激他對(duì)JUnitPerf的親睞和建議。

    翻譯

    MSN:wyingquan at hotmail dot com? 完成時(shí)間:2005-4-19

    相關(guān)資源及參考文檔

    ·???????? JUnit Primer
    Mike Clark, Clarkware Consulting, Inc.

    本文簡(jiǎn)單闡述了如何使用JUnit測(cè)試框架來(lái)編寫(xiě)和運(yùn)行簡(jiǎn)單的測(cè)試用例及套件。

    ·???????? javapronews.com/javapronews-47-20030721ContinuousPerformanceTestingwithJUnitPerf.html" target="_parent">Continuous Performance Testing With JUnitPerf
    Mike Clark (JavaProNews, 2003)

    本文講解了如何編寫(xiě)JUnitPerf測(cè)試來(lái)不時(shí)地檢查性能和可測(cè)性等情況。

    ·???????? Test-Driven Development: A Practical Guide
    David Astels (Prentice Hall, 2003)

    包括一章由本文作者編寫(xiě)的如何使用JUnitPerf來(lái)持續(xù)進(jìn)行性能測(cè)試。

    ·???????? Java Extreme Programming Cookbook
    Eric Burke, Brian Coyner (O'Reilly & Associates, 2003)

    其中有一張專門(mén)講述了JUnitPerf的用法。

    ·???????? Java Tools for Extreme Programming: Mastering Open Source Tools Including Ant, JUnit, and Cactus
    Richard Hightower, Nicholas Lesiecki (John Wiley & Sons, 2001)

    包含一章描述了如何與HttpUnit一起使用JUnitPerf。

    ?

    用junitperf做并發(fā)測(cè)試帶來(lái)的問(wèn)題------------很值得注意的一個(gè)問(wèn)題
    http://www.yuxn.cn/article_view.asp?id=980

    posted on 2006-03-02 15:49 扭轉(zhuǎn)乾坤 閱讀(337) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA使用技巧

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(2)

    隨筆分類(31)

    隨筆檔案(30)

    文章分類(32)

    文章檔案(33)

    相冊(cè)

    PHP小站-首頁(yè)

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 久久夜色精品国产亚洲av| 亚洲影院天堂中文av色| 精品人妻系列无码人妻免费视频| 在线免费观看一区二区三区| 亚洲欧洲综合在线| 日韩成人免费视频| 国产亚洲精品岁国产微拍精品| 特级毛片A级毛片免费播放| 在线播放免费人成视频在线观看 | 无码精品一区二区三区免费视频 | 成年人免费观看视频网站| 亚洲视频免费播放| 国产精品免费看久久久| 亚洲老妈激情一区二区三区| 一级做性色a爰片久久毛片免费| 国产一区二区三区免费看| 亚洲欧美日本韩国| 免费看片A级毛片免费看| 亚洲中文字幕久久精品无码A| 18国产精品白浆在线观看免费| 亚洲黄色免费网站| 免费无码毛片一区二区APP| 久久久久亚洲精品无码系列| 久久国产福利免费| 亚洲国产精品无码久久一线| 国产午夜成人免费看片无遮挡 | 永久在线毛片免费观看| 亚洲精品无码少妇30P| 最近免费中文字幕4| 亚洲精品精华液一区二区 | 无码免费午夜福利片在线 | 亚洲日本中文字幕一区二区三区| 老湿机一区午夜精品免费福利| 国产免费av片在线无码免费看| 国产精品自拍亚洲| 免费国产一级特黄久久| 成人嫩草影院免费观看| 国产精品亚洲mnbav网站| a级成人免费毛片完整版| 久久夜色精品国产嚕嚕亚洲av| 无码国产精品一区二区免费模式 |