Eclipse中使用Junit插件进行单元测试

转自:http://hi.baidu.com/nboy/blog/item/3b61b3de71dc0b5cccbf1aa8.html

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

一、什么是单元测试

单元测试指的是使用编写好的测试代码来检验需要被测试的代码。我们通常给要测试的方法传入一些参数值,然后检测方法的返回值跟预期是否一致。一般情况下我们会传入一些容易引发错误的数据,例如给计算除法的方法传入除数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、代码可以反复被测试用例测试

四、你的第一个测试用例

创建一个Java类Calculation,完成加减乘除四则运算。

在新创建的类“Calculation”上右键——New——Other,弹出New对话框,选择JUnit Test Case,如下图:

Next,点击“Click here”导入JUnit包,如下图:

点“OK”后,警告解除,点“Next”

勾选刚才创建的加、减、乘、除方法,然后点“Finished”。

可以看到JUnit在当前包下创建了一个名叫“CalculationTest”的测试类:

下面可以写测试方法了:

右键Run As——JUnit Test,没有任何错误和失败,方法add通过单元测试。

 

可以修改一下代码,让assertEquals方法的两个参数不相等,再执行单元测试,就会看下面的错误提示:

只有打有“@Test”标识的测试方法才在单元测试时执行。JUnit窗口可以通过Window——Show View里选择,如图示:

五、JUnit 4语法结构

最新JUnit 4版本语法和从前相比语法异常简单,初学者10分钟就能全部掌握。

1、任意给Junit测试用例起类名,但需要符合正常的Java类命名规范。

2、测试用例类不用继承超类以及实现接口

public class CalculationTest{}

3、如果希望在执行测试之前运行某些代码,例如连接数据库、创建工厂类对象和初始化变量等等,我们可以将这样的代码写到一个方法之中,方法名字自己任意定义。但是需要在方法之前添加元数据“@Before”

@Before public void setUp() throws Exception { calc = new Calculation(); // 在测试开始前首先实例化一个Calculation对象 }

上面的例子看到,在执行测试之前对calc引用进行实例化。这样的代码应该被放在测试之前执行,否则在测试过程中calc没有被初始化,它的值只能是null。

4、如果那些代码需要在测试执行之后运行,例如关闭数据库连接、关闭线程池以及关闭数据库连接池等等,我们还是将他们写道一个方法中,在方法前加入“@After”。

@After public void setDown() throws Exception { // 这里写入代码 }

5、定义测试方法。 1) 方法名任意起 2) 方法前面加上“@Test” 3) 方法中可以定义测试的代码

6、测试上传异常

@Test(expected= IllegalArgumentException.Class) 方法前的这句元数据意思是期待抛出IllegalArgumentException类型的异常

7、测试时间

测试时间指的是当超过指定的时间,测试仍然没有结束,则判定测试失败。 @Test(timeout=500) public void testGetConnection() {         //写入测试代码 }

上面的代码意味着当500毫秒之后,测试没有结束测试就失败。

单元测试框架TestNG的eclipse插件安装说明: 本资源包含org.jtester.plugin_0.2.2.jar和org.testng.eclipse_6.1.1.20110713_1401.7z。将org.testng.eclipse_6.1.1.20110713_1401.7z解压缩后得到的文件org.testng.eclipse_6.1.1.20110713_1401和org.jtester.plugin_0.2.2.jar一起复制到eclipse安装目录下的plugins目录下,重启eclipse,Window->Show view->Other...->Java,看到TestNG图标,证明安装成功! 关于TestNG的使用可以参考文档《Step By Step写测试(书签版).pdf》,介绍的很详细,下载地址:http://download.csdn.net/detail/defonds/4095644。 单元测试框架TestNG介绍: JUnit 框架是 Java 语言单元测试当前的一站式解决方案。这个框架值得称赞,因为它把测试驱动的开发思想介绍给 Java 开发人员并教给他们如何有效地编写单元测试。但是,在过去的几年JUnit 的改进不大;所以,为当今复杂的环境编写测试已经变成一个越来越困难的任务,即 JUnit 必须与其他一些补充性测试框架集成起来。而 TestNG 是一个测试 Java 应用程序的新框架。TestNG 不仅确实强大、创新、可扩展、灵活,它还展示了 Java Annotations(JDK 5.0 的重大新特性)的有趣应用。 TestNG 的创造者是 Cedric Beust,他在 Java 编程领域非常出名,是 EJB 3 专家组的成员,也是其他一些流行的开源项目(例如 EJBGen 和 Doclipse)的创造者。 示例测试代码: package example1; import org.testng.annotations.*; public class SimpleTest { @BeforeClass public void setUp() { // code that will be invoked when this test is instantiated } @Test(groups = { "fast" }) public void aFastTest() { System.out.println("Fast test"); } @Test(groups = { "slow" }) public void aSlowTest() { System.out.println("Slow test"); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值