本人最近在研究 java 單元測試 技術,有點心得,這里分享給測試同行朋友!那么,今天我們研究的主題是使用 cenqua 公司的 clover 框架來分析 java 程序的單元測試覆蓋率!關于 clover 的更多信息呢,請大家去 http://www.cenqua.com/clover 去" name="description" />

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

發表于:2007-05-05來源:作者:點擊數: 標簽:代碼java測試單元clover
MI LY: 宋體">本人最近在研究 java 單元測試 技術,有點心得,這里分享給測試同行朋友!那么,今天我們研究的主題是使用 cenqua 公司的 clover 框架來分析 java 程序的單元測試覆蓋率!關于 clover 的更多信息呢,請大家去 http://www.cenqua.com/clover 去

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的基本使用,它都流行這么多年了,這里假設你都懂啦?。┑?/SPAN>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.anti-gravitydesign.com

...

熱門標簽

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97