亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
有關Junit的多線程測試
作者:網絡轉載 發布時間:[ 2012/12/11 15:24:23 ] 推薦標簽:

testExampleThread()方法實際上稱不上是一個測試方法,實際上,你想使測試自動化,并且不想把檢查結果輸出到控制臺,但是,這里卻是這樣的,因此,這一點示范了Junit是不支持多線程的。
注意:testExampleThread()方法執行三項任務:
1、 打印“Hello,World”;
2、 初始化并起動一個支持打印“Delayed Hello World.”線程;
3、 打印“Goodbye,World”。

    如果你運行這個測試類,你會注意到一些錯誤。TextHellWorld()方法像你期望的那樣運行和結束。它沒有發出任何有關線程的異常,但是你卻不會接受到來自線程的返回信息。注意,你不會看到“Delayed Hello World”。為什么?因為線程還在激活狀態的時候,Junit已經執行完成。問題發生在下面這行,使線程執行結束的時候,你的測試不能反映出它的執行結果。這個問題行是在Junit的TestRunner中。它沒有被設計成搜尋Runnable實例,并且等待這些線程發出報告,它只是執行它們并且忽略了它們的存在。因為這個原因,幾乎不可能在Junit中編寫和維護多線程的單元測試。

進入GroboUtils

    GroboUtils是Matt Albrecht編寫的一個開源項目,它的目標是擴展Java的測試可能性。GroboUtils被發布在MIT許可下,這使它可以很友好的包含到其它的開源項目中。

Grobo TestingJUnit 子項目

    GroboUtils被列入與同類測試方面有關的試驗的子項目。這篇文章的焦點集中在Grobo TestingJUnit 子項目,它為Junit引入了一個支持多線程測試的擴展類庫。(這個子項目還引入了集成測試和嚴重錯誤的概念,但是這些特征超出了這篇文章所討論的范圍。)

    在GroboTestingJUnit子項目內是BroboTestingJUnit-1.1.0-core.jar類庫,它包含了MultiThreadedTestRunner和TestRunnable類,這兩個類是對Junit進行擴展處理多線程測試所必須的。

TestRunnable類

    TestRunnalbe類擴展了junit.framework.Assert類并且實現了java.lang.Runnable接口。你可以在你的測試類內定義TestRunnable對象做為內隱類。雖然,傳統的線程類實現一個run()方法,但是你的嵌套TestRunnable類必須實現runTest()方法來替代run()方法。這個方法將被MultiThreadedTestRunner類在運行時調用,因此你不應該在構造器中調用它。


MultiThreadedTestRunner類

    MultiThreadedTestRunner是一個允許把異步運行的線程數組放入Junit內一個框架。這個類在它的構造器中接受一個TestRunnable實例的數組做為參數。一旦建立了這個類的一個實例,它的runTestRunnables()方法應該被調用開始執行線程測試。

    和標準的JunitTestRunner不一樣,MultiThreadedTestRunner將等待,直到所有的線程執行終止退出。這樣強制Junit在線程執行任務的時候進行等待,從而巧妙的解決了我們前面提出的問題。讓我們來看一下GroboUtils和Junit是怎樣集成的。

編寫多線程測試

    現在把上面例子中的內隱類擴展自net.sourceforge.groboutils.junit.vl.TestRunnable包,我們必須像下面這樣來重寫runTest()方法。
private class DelayedHello
extends TestRunnable {
private String name;
private DelayedHello(
String name) {
this.name = name;
}
public void runTest() throws Throwable {
long l;
l = Math.round(2 + Math.random() * 3);

// Sleep between 2-5 seconds
Thread.sleep(l * 1000);
System.out.println(
"Delayed Hello World " + name);
}
}

    這時,我們全然不用創建工作線程。MultiThreadedTestRunner將在底層做這件事情,你重寫runTest()方法來替實現run()方法,runTest()方法被后面的MultiThreadedTestRunner類調用———我們自己不會調用它。
一旦TestRunnable被定義,我們必須定義新的測試用例。在我們的testExampleThread()方法中,我們實例化了幾個TestRunnable對象,并且把它們添加到一個數組中。然后,示例化MultiThreadedTestRunner類,把TestRunnable對象數組做為參數傳遞給這人類的構造子函數。現在,我們有了一個MultiThreadedTestRunner類的實例,我們可以調用它的runTestRunnables()方法來執行測試。

    MultiThreadedTestRunner(和Junit中的TestRunner不一樣)在繼續執行之前,將等待每一個線程運行終止。它也為通過構造器傳遞給它的每個TestRunnalbe對象創建工作線程并且調用異步的start()方法。這意味著你沒有必要通過創建你自己的線程來跳過這個障礙———MultiThreadedTestRunner會為你做這件事。下面是ExampleTest的終版:
import junit.framework.*;
import net.sourceforge.groboutils.junit.v1.*;
public class ExampleTest extends TestCase {
private TestRunnable testRunnable;
private class DelayedHello
extends TestRunnable {
private String name;
private DelayedHello(
String name) {
this.name = name;
}
public void runTest() throws Throwable {
long l;
l = Math.round(2 + Math.random() * 3);
// Sleep between 2-5 seconds
Thread.sleep(l * 1000);
System.out.println(
"Delayed Hello World " + name);
}
}
/**在你的測試用例中使用MultiThreadedTestRunner,
* MTTR需要一個TestRunnable對象做為它的構造器的參數

* MTTR創建以后,調用runTestRunnables()方法來運行它
*/
public void testExampleThread()
throws Throwable {

//實例化 TestRunnable 類
TestRunnable tr1, tr2, tr3;
tr1 = new DelayedHello("1");
tr2 = new DelayedHello("2");
tr3 = new DelayedHello("3");

//把實例傳遞給 MTTR
TestRunnable[] trs = {tr1, tr2, tr3};
MultiThreadedTestRunner mttr =
new MultiThreadedTestRunner(trs);
//執行MTTR和線程
mttr.runTestRunnables();
}
/**
* 標準的 main() 和 suite() 方法
*/
public static void main (String[] args) {
String[] name =
{ ExampleTest.class.getName() };
junit.textui.TestRunner.main(name);
}
public static Test suite() {
return new TestSuite(ExampleTest.class);
}
}

    上面的例子中,每個線程將會在你發出測試指令后,在2到5秒之間向你返回它們的輸出,它們不僅按時間顯示,而且是以一個隨機的順序來顯示。這個單元測試只有所有的線程都執行完成后才會結束。由于外加了MultiThreadedTestRunner,所以Junit繼續執行測試用例之前,必須耐心的等待TestRunnables執行完成它們的工作,做為可選項,你可以為MultiThreadedTestRunner的執行分配大的執行時間(這樣以便你脫離線程,而不掛起測試)。
要編譯運行ExampleTest,你必須在你的CLASSPATH環境變量中指定junit.jar和GroboUtils-2-core.jar兩個類庫的位置。這樣你會看到每人線程以隨機的順序來輸出 “Delayed Hedllo World”


結束語

    寫一個多線程的單元測試不用感到苦腦,GroboUtils類庫為編寫多線程的單元測試提供了一個清晰簡單的API接口,通過把這個類庫添加到你的工具包中,你可以把單元測試擴展到模擬繁重的WEB網絡通訊和并發的數據庫處理,以及對你的同步方法進行壓力測試。

上一頁12下一頁
軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 天天摸天天摸天天躁 | 亚洲国产二区三区 | 狠狠的日视频 | 久久91久久91精品免费观看 | 青草色视频| 日本99热 | 在线不卡亚洲 | 波多野结衣一区二区三区 | 欧洲在线一区 | 国产精品视频福利一区二区 | 日韩三级免费观看 | 极品三级 | 冲田杏梨午夜久久99视 | 色偷偷88欧美精品久久久 | 免费成人视屏 | 中文字幕丝袜制服 | 日本三级在在线观看 | 看全色黄大色黄大片免责看的 | 福利片免费观看 | 久久午夜夜伦鲁鲁片不卡 | 国产综合影院 | 日韩午夜在线视频不卡片 | 亚洲国产精品久久久天堂 | 福利在线网址 | 日本一区二区三区在线 观看网站 | 亚洲伦理精品久久 | 欧美午夜网站 | 永久免费观看午夜视频在线 | 一二三区乱码一区二区三区码 | 欧美一级在线看 | 中文字幕视频免费 | 99re热久久这里只有精品6 | 午夜高清在线观看免费6 | 国产成人在线免费观看 | 亚洲黄网址 | 曰批免费视频播放在线看片一 | 国产日韩亚洲不卡高清在线观看 | 日产免费自线一二 | 男女黄色毛片 | 成人免费夜片在线观看 | 日日操日日干 |