您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 > junit
Junit的多線程測(cè)試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2012/11/29 15:01:47 ] 推薦標(biāo)簽:

有關(guān)Junit的多線程測(cè)試

Junit和許多開源軟件項(xiàng)目集成在一起,但是Junit執(zhí)行多線程的單元測(cè)試有一些問題。這篇文章介紹Junit的一個(gè)擴(kuò)展類庫(kù)———GroboUtils,這個(gè)類庫(kù)被設(shè)計(jì)為來解決這些問題,并且使在Junit中進(jìn)行單元測(cè)試成為可能。對(duì)Junit和線程有一個(gè)基本的理解是有好處的,但對(duì)于本篇文章的讀者來說不是必需的。

介紹
如果你已經(jīng)在一個(gè)開源的Java項(xiàng)目上工作,或者讀了許多有關(guān)“極限編程”和其它“快速開發(fā)模式”的書籍,那么,你很有可能已經(jīng)聽說過有關(guān)Junit的事情。它是由Erich Gamma和Kent Beck編寫的,Junit是一個(gè)Java的自動(dòng)測(cè)試的框架,它允許你為你的軟件定義的“單元測(cè)試”———不管是測(cè)試程序還是功能代碼,通常都是基于方法調(diào)用方法的。

Junit能在很多方面幫助你的開發(fā)團(tuán)隊(duì)———在一些文章中已經(jīng)包含了很多這方面的介紹。但從一個(gè)開者到另一個(gè)開發(fā)者,Junit實(shí)際上只專箸于兩件事:

1、它強(qiáng)制你使用自己的代碼。你的測(cè)試代碼只是作為你的產(chǎn)品代碼的客戶端,從客戶端的描述所獲得的對(duì)你的軟件的了解,能夠幫助你標(biāo)識(shí)出在API中的錯(cuò)誤以及怎樣改進(jìn)代碼,使其終達(dá)到可以使用的目的。

2、它會(huì)給你對(duì)軟件中改變帶來信心,如果你的測(cè)試用例被中斷,你是立刻知道錯(cuò)誤。在工作結(jié)束的時(shí)候,如果測(cè)試提示是綠色的,則代碼是正確,你可以自信的檢查它。

但是Junit不是解決所有軟件測(cè)試中問題,第三方的擴(kuò)展類庫(kù),例如HttpUnit,JwebUnit,XMLUnit等,已經(jīng)認(rèn)識(shí)到這些框架中不足,并且通過添加功能彌補(bǔ)不足,這些不足之一是Junit不包含多線程的單元測(cè)試。

在這篇文章中,我們會(huì)看到一個(gè)很少有人知道的解決這個(gè)問題的擴(kuò)展類庫(kù)。我們通過建立Junit框架開始,并且運(yùn)行一個(gè)例子來展示Junit在線程沒試中的不足。在我們認(rèn)識(shí)了Junit在線程測(cè)試方面的不足之后,我們通過一個(gè)使用GroboUtils框架的例子來討論GroboUnitls

線程回顧

對(duì)于那些不熟悉線程的人來說,在這一點(diǎn)上是非常不安的(一點(diǎn)都不夸大),離開你的系統(tǒng),我們將對(duì)線做一個(gè)簡(jiǎn)單的介紹。線程允許你的軟件有多個(gè)任務(wù),也是說可以同時(shí)可做兩件事情。
在Khalid Mugal和Rolf Rasmussen的書(A Programmer’s Guide to Java Certification)中,對(duì)線程做了下面這樣的簡(jiǎn)短描述:
一個(gè)線程是一個(gè)程序中的可執(zhí)行單元,它是被獨(dú)立執(zhí)行的。在運(yùn)行時(shí),在程序中的線程
有一個(gè)公共的內(nèi)存空間,因此,能夠共享數(shù)據(jù)和代碼;也是說,它們是輕量級(jí)的。它
也共享正在運(yùn)行程序的進(jìn)程。
Java 線程使運(yùn)行時(shí)環(huán)境異步,它允許不同的任務(wù)同時(shí)被執(zhí)行。(p.272)


在web應(yīng)用程序中,許多用戶可能同時(shí)發(fā)請(qǐng)求給你的軟件。當(dāng)你寫單元測(cè)試對(duì)你的代碼進(jìn)行壓力測(cè)試時(shí),你需要模擬許多并發(fā)事件,如果你在開發(fā)健壯的中間件,這樣做是尤其重要的。對(duì)于這些組件,使用線程測(cè)試是一個(gè)好的想法。

不幸的是,Junit在這方面是不足的。

有關(guān)Junit和多線程測(cè)試的問題

如果你想驗(yàn)證下列代碼,你需要下載并安裝Junit。按著指示去做,以便能夠在Junit的網(wǎng)站能夠找到它。不要過分追求細(xì)節(jié),我們將簡(jiǎn)要的介紹Junit是怎樣工作的。要寫一個(gè)Junit的測(cè)試,你必須首先創(chuàng)建一個(gè)擴(kuò)展于junit.framework.TestCase(Juint中的基本測(cè)試類)的測(cè)試類。
Main()方法和suite()方法被用啟動(dòng)測(cè)試。無論是從命令行還是IDE集成開發(fā)環(huán)境窗口,必須確保junit.jar在你的CLASSPATH環(huán)境變量里指定。然后為BadExampleTest.Class類編譯運(yùn)行下列代碼:
import junit.framework.*;
public class BadExampleTest extends TestCase {
    // For now, just verify that the test runs
    public void testExampleThread()
            throws Throwable {
        System.out.println("Hello, World");
    }
    public static void main (String[] args) {
        String[] name =
            { BadExampleTest.class.getName() };
        junit.textui.TestRunner.main(name);
    }
    public static Test suite() {
        return new TestSuite(
            BadExampleTest.class);
    }
}

運(yùn)行BadExampleTest來驗(yàn)證所建立的每一件事情的正確性。一旦,main()被調(diào)用,Junit框架將自動(dòng)的執(zhí)行任意一個(gè)用“test”開關(guān)命名的方法。繼續(xù)并試著運(yùn)行測(cè)試類。如果你正確的做了每一件事,它應(yīng)該在輸出窗口打印出“Hello World”。
現(xiàn)在,我們要給程序添加一個(gè)線程類。我將通過擴(kuò)展java.lang.Runnable接口來做這件事情。后,我們將改變策略,并且擴(kuò)展一個(gè)使線程自動(dòng)創(chuàng)建的類。
在DelayedHello的構(gòu)造器中,我們創(chuàng)建一個(gè)新的線程并且調(diào)用它的start()方法。
import junit.framework.*;
public class BadExampleTest extends TestCase {
    private Runnable runnable;
public class DelayedHello
        implements Runnable {
        private int count;
        private Thread worker;
        private DelayedHello(int count) {
            this.count = count;
            worker = new Thread(this);
            worker.start();
        }
        public void run() {
            try {
                Thread.sleep(count);
                System.out.println(
                "Delayed Hello World");
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void testExampleThread()
            throws Throwable {
        System.out.println("Hello, World");       //1
        runnable = new DelayedHello(5000);        //2
        System.out.println("Goodbye, World");     //3
    }
    public static void main (String[] args) {
        String[] name =
            { BadExampleTest.class.getName() };
        junit.textui.TestRunner.main(name);
    }
    public static Test suite() {
        return new TestSuite(
            BadExampleTest.class);
    }
}

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