您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
翻譯JRUnit的文檔
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2013/1/25 15:34:30 ] 推薦標簽:

    后,還有個org.jboss.jrunit.TestDriver類,用于表示客戶端和服務(wù)器端測試的“驅(qū)動”。這個類可以產(chǎn)生新的test harness,把客戶端和服務(wù)器端的test case放在里面跑。這個測試驅(qū)動可以通過一個JGroup消息總線與那些test harness進行通訊,從而控制服務(wù)器和所有客戶端的test case,并從它們那里獲得測試結(jié)果

    邏輯上,運行一個由test runner控制的測試的順序如下:
(The logical order of a test run as controlled by the test runner is:  )
(譯注:這個test runner可能是指剛才所說的driver)
1.為每個客戶端和服務(wù)器端test case生成一個新的test harness
2.等待確認,直至所以test harness創(chuàng)建完畢,它們各自的消息總線也已經(jīng)啟動
3.一旦收到確認,會等待服務(wù)器端的test case啟動(比如,調(diào)用服務(wù)器test case的setUp方法)。否則,假如沒有收到確認,殺死所以進程,返回出錯信息給JUnit。(譯注:可見jrunit只是junit的一個擴展,底層還是依賴于junit的實現(xiàn),比如錯誤提示)
4.確認服務(wù)器端啟動完畢后,通知所有的test case(客戶端和服務(wù)器的)開始運行。否則(如果沒有確認信息),對所有test harness發(fā)送退出信息。
5.等待客戶端test case的結(jié)果
6.一旦收到全部客戶端返回的結(jié)果,通知服務(wù)器進行tear down(例如,調(diào)用服務(wù)器test case的teardown方法)。否則,殺死所以進程返回出錯信息給JUnit
7.等待服務(wù)器端的測試結(jié)果(當然服務(wù)器test case要有test方法)
8.處理所有測試結(jié)果,提交給JUnit TestResult類,測試結(jié)果會以普通Junit測試報告的方式呈現(xiàn)出來。
9.等待服務(wù)器關(guān)閉的信息,表明服務(wù)器已經(jīng)成功地關(guān)閉并清理完資源
10.關(guān)閉消息總線和根測試(root test run),返回至Junit的執(zhí)行線程中。

    對于test driver,用戶需要進行編碼的地方是實現(xiàn)一個繼承自org.jboss.jrunit.TestDriver的抽象類,并實現(xiàn)其中的declareTestClasses()方法。在這個方法內(nèi)部調(diào)用TestDriver類的addTestClasses方法,并且指定客戶端test case類、客戶端的并發(fā)數(shù)量以及服務(wù)器端test case類

 

基準修飾符(Benchmark Decorator)
   JRunit使用基準修飾符來提供除了普通Junit測試結(jié)果外的一些數(shù)據(jù),稱為基準結(jié)果
   org.jboss.jrunit.decorators.ThreadLocalDecorator(以及其他可以接收線程個數(shù)和循環(huán)次數(shù)(等參數(shù))的修飾符)——指定多少個線程數(shù),會有多少個執(zhí)行同一個測試的線程被創(chuàng)建。指定多少次循環(huán),會在每個測試實例中,對每個測試方法循環(huán)那么多次。比如,如果指定3個線程、10次循環(huán),那么將會有三個線程執(zhí)行該測試用例(也即創(chuàng)建了三個測試實例),每個測試實例中,會將里面的所以test方法執(zhí)行10遍。下面是一個相關(guān)的例子:
public class SimpleThreadLoopCounter extends TestCase
{
    private static int staticCounter = 0;
    private static int staticMethodCounter = 0;
    private int localCounter = 0;
    public static Test suite()
    {
        return new ThreadLocalDecorator(SimpleThreadLoopCounter.class, 3, 10, 0, true, true);
    }
    public SimpleThreadLoopCounter()
    {
        staticCounter++;
    }
    public void testCounter() throws Exception
    {
        System.out.println("staticCounter = " + staticCounter);
        System.out.println("staticMethodcounter = " + ++staticMethodCounter);
        System.out.println("localCounter = " + ++localCounter);
    }
}

運行這個例子,后的輸出會是:
staticCounter = 3 staticMethodcounter = 30 localCounter = 10

   有個問題是關(guān)于junit如何處理多個test方法(譯注:具體方式在開頭已經(jīng)有所說明)。對于每個test case中的每個test方法,junit都會創(chuàng)建一個新的測試實例來運行這個方法。為了說明這一點,我們復(fù)制上面代碼的testCounter方法(把復(fù)制后的改名為testCounter2),那么在輸出結(jié)果中后一行變?yōu)椋?br /> staticCounter = 6 staticMethodcounter = 60 localCounter = 10
(譯注:指定了三個線程,junit又為每個測試類創(chuàng)建兩個實例,所以總共3×2個,但是對于每一個,它的localCounter 還是10,即執(zhí)行了10次循環(huán))

   JRUnit和修飾符的注意事項:如果numberOfThreads大于1,那ServerTestHarness不會運行。但是numberOfThreads可以拿來模擬同一時刻并發(fā)的客戶端數(shù)量,從這個意義上來說,我認為這不算是個大問題。如果要用ServerTestHarness來這么做,事實上也的確可以產(chǎn)生多個客戶端。即時這些客戶端不是在一個進程中并發(fā)運行,起碼也是在各個單獨的進程中并發(fā)。而能夠設(shè)定循環(huán)變量也是很有必要的,雖然這樣會讓客戶端額外地調(diào)用服務(wù)器一段時間(或者反復(fù)調(diào)用)。因此,如果進行遠程測試并且要用ThreadLocalDecorator獲取基準數(shù)據(jù)的話,你可以使用下面這個ThreadLocalDecorator的構(gòu)造器,它的線程數(shù)是默認為1的
    public ThreadLocalDecorator(Class testClazz, int loops)

上一頁12下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd