站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Eclipse 专题使用clover为java代码的junit测试做覆盖率分析(一)

使用clover为java代码的junit测试做覆盖率分析(一)

摘要: 使用clover为java代码的junit测试做覆盖率分析(一)
本人最近在研究java单元测试技术,有点心得,这里分享给测试同行朋友!那么,今天我们研究的主题是使用cenqua公司的clover框架来分析java程序的单元测试覆盖率!关于clover的更多信息呢,请大家去http://www.cenqua.com/clover 去查询。我们这里,将会通过一个实例来演示如何使用junit和clover一起,来分析java代码的覆盖率。我们将会使用ant来编译一个junit单元测试实例项目,然后修改build.xml文件,加上clover的覆盖率分析任务target;而且我们还要通过三部分来学习clover超级无敌的地方:current报告、历史报告以及高级特征! 那么最开始呢,我们要做的就是从http://www.cenqua.com/clover下载clover程序包clover.jar(它是clover的主要包)、clover.license(clover的试用license,需要到官方网站下载一个月的试用注册文件,否则不能使用clover!)、velocity.jar(用来创建html报告的扩展包),将它们拷贝到ant(ant你已经安装好了,并且设置了junit.jar以及ANT_HOME之类的初始化工作;我们这里不讲ant的基本使用,它都流行这么多年了,这里假设你都懂啦!)的lib目录下,这样下来,我们在ant的build.xml文件里才可以使用clover任务! 当然,现在很多朋友不喜欢配置一些环境变量,想把这些jar文件放在任意的地方,例如直接放在项目文件里,那么可以通过在build.xml文件里指定这些扩展包的位置也是可以的;如果在build文件里加入扩展包的路径,需要在build文件里这样写: 1) 我们把下载来的clover.jar和cenquatasks.jar拷贝到你的项目目录的lib路径下 2) 在build.xml下添加如下代码: 之后你就可以在ant任务里构建clover的任务啦! 其实最简单的办法呢,就是把clover.jar、clover.license、velocity.jar、cenquatasks.jar、junit.jar这些包都拷贝到ant的lib目录里,省得麻烦,不然将来你加入什么新功能,就会提示你找不到相应的包,你还得去网上搜,特不爽! 我们的学习过程是: 1) 先使用junit创建完java代码的测试代码,之后编译运行,完成junit对java代码的单元测试; 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); } }
↑返回目录
前一篇: 怎样改变myeclipse默认的jsp 打开方式
后一篇: 关于用eclipse做jar的问题