cuckoo2010 发表于 2009-9-5 10:40:32

单元测试之JUnit 一

JUnit和单元测试入门简介之一

1 .单元测试概述

单元测试——是最小粒度的测试,以测试某个功能或代码块。一般由程序员来做,因为它需要知道内部程序设计和编码的细节。

1.1. 单元测试的好处
    A、提高开发速度——测试是以自动化方式执行的,提升了测试代码的执行效率。
    B、提高软件代码质量——它使用小版本发布至集成,便于实现人员除错。同时引入重   构概念,让代码更干净和富有弹性。
    C、提升系统的可信赖度——它是回归测试的一种。支持修复或更正后的“再测试”,可确保代码的正确性。

1.2 单元测试的针对对象
   A、面向过程的软件开发针对过程。
   B、面向对象的软件开发针对对象。
   C、可以做类测试,功能测试,接口测试(最常用于测试类中的方法)。

1.3 单元测试工具和框架
    目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为JUnit(java),   CppUnit(C ),DUnit (Delphi ),NUnit(.net),PhpUnit(Php )等等。该测试框架的第一个和最杰出的应用就是由Erich Gamma (《设计模式》的作者)和Kent Beck(XP(Extreme Programming)的创始人 )提供的开放源代码的JUnit。


2. 什么是JUnit及其特性

如果您要对编写的程序进行测试,应该如何进行呢?传统的测试方式是通过信赖人工对输出结果的判断,缺少效率且通常难以组织,且针对单一程序通常要设计专门的测试程序,如果您是在编写Java,您可以使用JUnit来为你提供有效的测试。

2.1. 什么是JUnit?

在这里引述一下JUnit FAQ中的解释。
JUnit是一个开放原始码的Java测试框架(testing framwork),它用来编写与执行重复性的测试,它是用在单元测试框架的xUnit架构的贯例。


2.2. JUnit的好处

A、可以使测试代码与产品代码分开。
B、针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试。
C、易于集成到测试人员的构建过程中,JUnit和Ant的结合可以实施增量开发。
D、JUnit是公开源代码的,可以进行二次开发。
C、可以方便地对JUnit进行扩展。

2.3 JUnit单元测试编写原则:
A、是简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写。
B、是使测试单元保持持久性。
C、是可以利用既有的测试来编写相关的测试。

2.4JUnit包括以下的特性:

A. 对预期结果的断言
B. 对相同共享资料的测试组装
C. 易于组织与执行测试的测试套件
D 图形与文字界面的测试器

3. JUnit 的使用入门

现在很多Java开发工具都集成了JUnit,如MyEclipse,Netbean,JBuilder等等,你可以直接使用。当然你也可以在JUnit的官方网站上下载,网址是http://junit.org

我自己用的是MyEclipse6.6版本的java开发工具,JUnit是4.5版本。现在我们来写一个java类,也就是被测试的类,然后用JUnit来进行单元测试。

首先,在MyEclipse中建一个java工程,我这里的工程名为javaproject2,引入JUnit4.5相关的jar文件,把环境搭建好。然后建立相应的包。这里应当注意,为了方便管理,我们的源代码和测试代码最好不要放在同一个代码文件夹中的同一个包中。我们可以再建一个代码文件夹test,并在其中建一个与源代码文件夹(src)中的包名一致的包。这样做的好处是源代码和测试代码虽然不在同一个文件夹,但它们的.class文件都在同一个文件夹中,实现了源代码和测试代码的分离,方便管理。
如图1.0所示:
         
               (图1.0)
搭建好测试环境后,就可以进行相关类的编写了。这里我设计了一个税收类Revenue.java,放在src中的com.cuckoo2010包中。该类包含一个税费计算的方法revenuemethod(double mymoney),方法具体的实现逻辑为:当个人收小于或等于800则不征税,当个人收入大于800底于2000元时,征收百分之七的税,当个人收入大于2000且底于5000元时,征收百分之十五的税,当个人收入超过5000时,征收百分之二十五的税。设定一个异常状态,当输入值等于或小于零时抛出一个异常。代码如下:
package com.cuckoo2010;

/**
* 被测试的类 Revenue.java
* @author 松子煮茶
*/
public class Revenue {

    private double money;
    public double revenuemethod(double mymoney) throws Exception {
      
      //个人收小于或等于800则不征税
      if (mymoney <= 800) {
            return this.money = mymoney;
      }
      //个人收入大于800底于2000元时,征收百分之七的税
      else if (mymoney <= 2000) {
            return this.money = mymoney - mymoney * 0.07;
      }
      //个人收入大于2000且底于5000元时,征收百分之十五的税
      else if (mymoney > 2000 && mymoney <= 5000) {
            return this.money = mymoney - mymoney * 0.15;
      }
      //个人收入超过5000时,征收百分之二十五的税
      else if (mymoney > 5000) {
            return this.money = mymoney - mymoney * 0.25;
      }
      else if (mymoney <= 0) {
            /**
             * 自定义异常
             * 当金额小于或等于0时,系统抛出异常
             */
            throw new Exception("金额不符合要求,必须大于零!");
      }
      return this.money;
    }
}

写完这个类后,我们可以根据这个类设计一个测试用例,也就是各种输入值,预期值及实际值。
如表1.1所示:

表1.1

输入值
预期值
实际值



正常测试数据
1.0
1.0
1.0
500.0
500.0
500.0
799.0
799.0
799.0
1999.0
1859.07
1859.07
2999.0
2549.15
2549.15
4999.0
4249.15

附件:
http://bbs.51testing.com/images/attachicons/common.gif JUnit和单元测试入门简介之一.rar
[时间:2009-9-5 10:44 - 下载次数:0]

puchonghui 发表于 2009-9-5 23:04:00

误导
浮点数能这么用么??
去试试看如果输入数据带小数会是什么情况
很多时候出来的结果都是有误差的
比如说你输入1000.01
按照代码的逻辑应该输出930.0093
jdk1.6实际会输出930.0092999999999

不知道lz这篇文章是转贴的还是原创的
如果是原创的建议好好看下计算机原理里关于浮点数的表示法以及java里为啥要引入BigDecimal类……

ym_wei 发表于 2011-5-25 15:28:58

刚开始学,结合实例讲,很清楚。谢谢
页: [1]
查看完整版本: 单元测试之JUnit 一