当前位置:51VIP源码软件音乐小游戏下载联盟网络学院程序开发java教程 → JUnit单元测试(1)

JUnit单元测试(1)

减小字体 增大字体 作者:葫芦娃  来源:本站整理  发布时间:2008-5-30 2:13:14 我要发布文章

深入浅出JUnit单元测试

测试是软件开发的重要环节之一。按照软件开发的过程测试可分为:单元测试、集成测试、系统测试、域测试等。我们这里将讨论面向程序员的单元测试。

一、什么是单元测试

单元测试指的是使用编写好的测试代码来检验需要被测试的代码。我们通常给要测试的方法传入一些参数值,然后检测方法的返回值跟预期是否一致。一般情况下我们会传入一些容易引发错误的数据,例如给计算除法的方法传入除数0,并且测试的参数也会传入许多组,这样才能保证测试效果。

二、为什么要使用单元测试

每当别人提起“单元测试”都会让william的内心难受上好长一阵子,往往他的好心情也会一扫而光。这又是为什么呢?

5年前William软件公司很顺利的拿到美国ADC电讯公司 (ADC Telecommunications )的一单软件开发的生意,总价值1500万美元,利润在32%上下。面对着几百万的收益,William兴奋地对自己的妻子说:“Catherine,不久我们的银行户头上就会多出几百万美元。做完这笔生意,你老爸再也不会抱怨他的女儿嫁给了一个贫困街区出生并且没受过高等教育的乡巴佬。还真想不到你老爸再见到我的时候会是什么样的表情……”。

作为同William生活了12年的Catherine很清楚的知道,William这个人实际的本事没多少,然而大话却说了不少。当初她正因为轻信了William的许诺才嫁给他,然而当年的承诺从来就没兑现过。虽说William这个人没什么本事,可是他却有着令别人羡慕的“狗屎运”。

高中毕业之后,他参了军,在越南战争中他所在的小队中了越南人的埋伏,却唯独William一个人活着回来。(William牢记美军士兵手册其中一条训令:永远不要和比你作战勇敢的战友躲在同一个散兵坑,因为他会给你们招来致命炮火打击。)William回来后向自己的上司编造了谎言,因而被提升为中尉,授予紫心勋章

 退役后有幸运结识底特律市长的千金——Catherine,并且让这位市长千金以身相许。William的岳父虽说从来就没看上过这位贫穷、没教养还时常夸夸其谈的女婿,可最终还是出资给William创办公司。William的运气不得不让人羡慕,可是这回软件开发他还会这么幸运么?

翌日,William一大早就来到公司,他第一件事情就是要和项目经理谈话。

“嘿!John。我们的项目要立即投入人力着手开发,别让那些程序员慢吞吞的。”William认真的说。

“先生,我们的项目还不能立即开发,因为我们还没有做项目需求。”项目经理John提醒着。

William不耐烦的说:“John,先别管需求那东西,我要最快看到产品。还有别搞那些耽误时间的单元测试,我希望你们以最快速拿出产品。”

John很无奈的接受了William的指示。

William真不愧是一个没大脑的人,为了能缩短开发时间,节省开发成本,从而达到提高利润率的目的,不惜进行需求分析、单元测试。最终的结果完全符合预料,项目失败了,William失去了400万美元的项目抵押金和300万美元的开发成本。

William的例子中看到,缺少单元测试的项目很难达保证程序质量。我们编写代码时,一定会反复调试保证它能够编译通过。如果是编译没有通过的代码,没有任何人会愿意交付给自己的老板。但代码通过编译,只是说明了它的语法正确;我们却无法保证它的语义也一定正确,没有任何人可以轻易承诺这段代码的行为一定是正确的。幸运的是单元测试会为我们的承诺做保证。编写单元测试就是用来验证这段代码的行为是否与我们期望的一致。有了单元测试,我们可以自信的交付自己的代码,而没有任何的后顾之忧。

三、单元测试的优点

1、单元测试是一种验证行为

当针对一个Java类的测试用例写好之后,日后再向这个Java类添加新的方法并不影响存在的测试用例,由于测试用例是对以前的方法测试,因此不会映像到测试用例,我们只需向测试用例加入对新方法的测试即可。

2、从旁观者的角度编写测试用例

程序设计者讲UML类图画好之后,程序就有了类结构,这时对这个类中的方法编写测试用例,然后程序员开始讲类的具体内容实现。写好之后让测试用例测试。编写的顺序是先写测试用例再写程序具体代码,单元测试可以保证测试用例绝对客观、公正。因为他是在具体程序之前编写的。

3、代码可以反复被测试用例测试

四、你的第一个测试用例

创建一个JavaCalculation,完成加减乘除四则运算

/*

 * 这是一个实现计算功能的Java

 */

public class Calculation {

    /*

     * 加法

     */

    public int add(int a, int b) {

        return a + b;

    }

 

    /*

     * 减法

     */

    public int subtration(int a, int b) {

        return a - b;

    }

 

    /*

     * 乘法

     */

    public int multiplication(int a, int b) {

        return a * b;

    }

 

    /*

     * 除法

     */

    public int division(int a, int b) {

        if (b == 0) {

            throw new IllegalArgumentException("参数不正确,除数不能为0");

        }

        return a / b;

    }

}