• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    java單元測試篇:使用clover為java代碼的junit測試做覆蓋率分析

    發布: 2007-5-05 18:59 | 作者: seanhe | 來源: 51testing博客 | 查看: 254次 | 進入軟件測試論壇討論

    領測軟件測試網

    MILY: 宋體">本人最近在研究java單元測試技術,有點心得,這里分享給測試同行朋友!那么,今天我們研究的主題是使用cenqua公司的clover框架來分析java程序的單元測試覆蓋率!關于clover的更多信息呢,請大家去http://www.cenqua.com/clover 去查詢。我們這里,將會通過一個實例來演示如何使用junitclover一起,來分析java代碼的覆蓋率。我們將會使用ant來編譯一個junit單元測試實例項目,然后修改build.xml文件,加上clover的覆蓋率分析任務target;而且我們還要通過三部分來學習clover超級無敵的地方:current報告、歷史報告以及高級特征!

    那么最開始呢,我們要做的就是從http://www.cenqua.com/clover下載clover程序包clover.jar(它是clover的主要包)、clover.licenseclover的試用license,需要到官方網站下載一個月的試用注冊文件,否則不能使用clover。、velocity.jar(用來創建html報告的擴展包),將它們拷貝到antant你已經安裝好了,并且設置了junit.jar以及ANT_HOME之類的初始化工作;我們這里不講ant的基本使用,它都流行這么多年了,這里假設你都懂啦。┑lib目錄下,這樣下來,我們在antbuild.xml文件里才可以使用clover任務!

    當然,現在很多朋友不喜歡配置一些環境變量,想把這些jar文件放在任意的地方,例如直接放在項目文件里,那么可以通過在build.xml文件里指定這些擴展包的位置也是可以的;如果在build文件里加入擴展包的路徑,需要在build文件里這樣寫:

    1) 我們把下載來的clover.jarcenquatasks.jar拷貝到你的項目目錄的lib路徑下

    2) build.xml下添加如下代碼:

    <taskdef resource="com/cenqua/ant/antlib.xml" classpath="lib/cenquatasks.jar"/>
    <extendclasspath path="lib/clover.jar"/>
    <taskdef resource="clovertasks" classpath="lib/clover.jar"/>

    之后你就可以在ant任務里構建clover的任務啦!

    其實最簡單的辦法呢,就是把clover.jar、clover.license、velocity.jar、cenquatasks.jar、junit.jar這些包都拷貝到antlib目錄里,省得麻煩,不然將來你加入什么新功能,就會提示你找不到相應的包,你還得去網上搜,特不爽!

    我們的學習過程是:

    1) 先使用junit創建完java代碼的測試代碼,之后編譯運行,完成junitjava代碼的單元測試;

    2) 之后,我們在ant里構建測試任務,自動完成企業集的單元測試工作

    3) 然后,我們修改build文件,加入clover任務,來完整對單元測試過程的覆蓋率分析工作

    4) 之后開始重構代碼,提高代碼的單元測試覆蓋率

    一、 構建java源代碼與junit單元測試代碼

    先在你的電腦里的某個比較順眼的盤下建立一個目錄,例如叫sincky,這個就是我們的學習項目目錄,再在sincky里創建一個src文件夾,用來放置所有的代碼;之后在src里新建一個java類的源文件,名字叫做IMoney.java,代碼內容如下:

    public interface IMoney {

    /**

    * Adds a money to this money.

    */

    public abstract IMoney add(IMoney m);

    /**

    * Adds a simple Money to this money. This is a helper method for

    * implementing double dispatch

    */

    public abstract IMoney addMoney(Money m);

    /**

    * Adds a MoneyBag to this money. This is a helper method for

    * implementing double dispatch

    */

    public abstract IMoney addMoneyBag(MoneyBag s);

    /**

    * Tests whether this money is zero

    */

    public abstract boolean isZero();

    /**

    * Multiplies a money by the given factor.

    */

    public abstract IMoney multiply(int factor);

    /**

    * Negates this money.

    */

    public abstract IMoney negate();

    /**

    * Subtracts a money from this money.

    */

    public abstract IMoney subtract(IMoney m);

    /**

    * Append this to a MoneyBag m.

    */

    public abstract void appendTo(MoneyBag m);

    }

    這里我們定義一個java接口,表示了“金錢”這個神奇東西的一些美妙的抽象方法!早年有首遲志強的歌叫《鈔票》:是誰制造的鈔票,你在世上逞霸道,有人為你愁眉苦臉啊有人為你哈哈笑;姑娘為你走錯了路,小伙子為你受改造!東奔又西跑,點頭又哈腰,鈔票!人人為你離不了錢哪!你這殺人不見血的刀形象無比,不扯了,跑題啦!I am back!

    之后我們實現這個接口,在src文件夾下定義一個叫做Money.java的類:

    public class Money implements IMoney {

    private int fAmount;

    private String fCurrency;

    /**

    * Constructs a money from the given amount and currency.

    */

    public Money(int amount, String currency) {

    fAmount= amount;

    fCurrency= currency;

    }

    /**

    * Adds a money to this money. Forwards the request to the addMoney helper.

    */

    public IMoney add(IMoney m) {

    return m.addMoney(this);

    }

    public IMoney addMoney(Money m) {

    if (m.currency().equals(currency()) )

    return new Money(amount()+m.amount(), currency());

    return MoneyBag.create(this, m);

    }

    public IMoney addMoneyBag(MoneyBag s) {

    return s.addMoney(this);

    }

    public int amount() {

    return fAmount;

    }

    public String currency() {

    return fCurrency;

    }

    public boolean equals(Object anObject) {

    if (isZero())

    if (anObject instanceof IMoney)

    return ((IMoney)anObject).isZero();

    if (anObject instanceof Money) {

    Money aMoney= (Money)anObject;

    return aMoney.currency().equals(currency())

    && amount() == aMoney.amount();

    }

    return false;

    }

    public int hashCode() {

    return fCurrency.hashCode()+fAmount;

    }

    public boolean isZero() {

    return amount() == 0;

    }

    public IMoney multiply(int factor) {

    return new Money(amount()*factor, currency());

    }

    public IMoney negate() {

    return new Money(-amount(), currency());

    }

    public IMoney subtract(IMoney m) {

    return add(m.negate());

    }

    public String toString() {

    StringBuffer buffer = new StringBuffer();

    buffer.append("["+amount()+" "+currency()+"]");

    return buffer.toString();

    }

    public /*this makes no sense*/ void appendTo(MoneyBag m) {

    m.appendMoney(this);

    }

    }

    這個接口實現了IMoney接口的方法,具體語法就不講了,很簡單!之后,我們又用另一個類實現IMoney接口,為什么呢?你可以認為我貪心,但你不可以這么說,因為喜歡編程的人絕對不是為了貪婪代碼!我們在src下建立另一個類MoneyBag.java

    import java.util.*;

    class MoneyBag implements IMoney {

    private Vector fMonies= new Vector(5);

    static IMoney create(IMoney m1, IMoney m2) {

    MoneyBag result= new MoneyBag();

    m1.appendTo(result);

    m2.appendTo(result);

    return result.simplify();

    }

    public IMoney add(IMoney m) {

    return m.addMoneyBag(this);

    }

    public IMoney addMoney(Money m) {

    return MoneyBag.create(m, this);

    }

    public IMoney addMoneyBag(MoneyBag s) {

    return MoneyBag.create(s, this);

    }

    void appendBag(MoneyBag aBag) {

    for (Enumeration e= aBag.fMonies.elements(); e.hasMoreElements(); )

    appendMoney((Money)e.nextElement());

    }

    void appendMoney(Money aMoney) {

    if (aMoney.isZero()) return;

    IMoney old= findMoney(aMoney.currency());

    if (old == null) {

    fMonies.addElement(aMoney);

    return;

    }

    fMonies.removeElement(old);

    IMoney sum= old.add(aMoney);

    if (sum.isZero())

    return;

    fMonies.addElement(sum);

    }

    public boolean equals(Object anObject) {

    if (isZero())

    if (anObject instanceof IMoney)

    return ((IMoney)anObject).isZero();

    if (anObject instanceof MoneyBag) {

    MoneyBag aMoneyBag= (MoneyBag)anObject;

    if (aMoneyBag.fMonies.size() != fMonies.size())

    return false;

    for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {

    Money m= (Money) e.nextElement();

    if (!aMoneyBag.contains(m))

    return false;

    }

    return true;

    }

    return false;

    }

    private Money findMoney(String currency) {

    for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {

    Money m= (Money) e.nextElement();

    if (m.currency().equals(currency))

    return m;

    }

    return null;

    }

    private boolean contains(Money m) {

    Money found= findMoney(m.currency());

    if (found == null) return false;

    return found.amount() == m.amount();

    }

    public int hashCode() {

    int hash= 0;

    for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {

    Object m= e.nextElement();

    hash^= m.hashCode();

    }

    return hash;

    }

    public boolean isZero() {

    return fMonies.size() == 0;

    }

    public IMoney multiply(int factor) {

    MoneyBag result= new MoneyBag();

    if (factor != 0) {

    for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {

    Money m= (Money) e.nextElement();

    result.appendMoney((Money)m.multiply(factor));

    }

    }

    return result;

    }

    public IMoney negate() {

    MoneyBag result= new MoneyBag();

    for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {

    Money m= (Money) e.nextElement();

    result.appendMoney((Money)m.negate());

    }

    return result;

    }

    private IMoney simplify() {

    if (fMonies.size() == 1)

    return (IMoney)fMonies.elements().nextElement();

    return this;

    }

    public IMoney subtract(IMoney m) {

    return add(m.negate());

    }

    public String toString() {

    StringBuffer buffer = new StringBuffer();

    buffer.append("{");

    for (Enumeration e= fMonies.elements(); e.hasMoreElements(); )

    buffer.append(e.nextElement());

    buffer.append("}");

    return buffer.toString();

    }

    public void appendTo(MoneyBag m) {

    m.appendBag(this);

    }

    }


    31/3123>

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    軟件測試技術文章排行榜
    軟件測試技術分類最新內容
    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>