UML软件工程组织

 

 

JUnit学习笔记

2008-03-31 作者:Didizyp 来源:csdn

 

一、简介

JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人员做单元测试之用,可以从www.junit.org网站上免费获得,本文使用的版本仍然是3.8.1。获得junit3.8.1.zip文件后,解压缩,需要其中的junit.jar文件,将该文件放到特定的文件夹中备用,我放到了我机器的G:\YPJCCK\JUnit\lib文件夹中。

由于我是编码人员,很多工作都工作都在Eclipse、JBuilder这样的IDE中完成,因此对JUnit的学习也是在Eclipse和JBuilder中进行的,而没有做环境变量或是命令行之类的配置。我Eclipse用的是3.1.1加语言包,可以到www.eclipse.org网站上下载;JBuilder用的是JBuilder 2006。

二、创建项目

下面打开Eclipse或JBuilder。

如果使用的是Eclipse,那么在Eclipse打开后,点击菜单“文件”->“新建”->“项目”,打开“新建项目”对话框:

请选中“Java项目”,点击“下一步”,进入“新建Java项目”对话框:

在这个对话框中需要设置项目的名称以及项目所在目录,我为自己的项目起名为JUnitTest,目录为G:\YPJCCK\JUnit\ Eclipse\JUnitTest。由于Eclipse自带了JUnit 3.8.1,因此此时点击“完成”即可。如果想使用自己下载的类库,请点击“下一步”,进入下一窗口。在这个窗口中选择名为“库”的选项卡,然后点击“添 加外部JAR”按钮,将保存于特定文件夹中的junit.jar文件引用进来。

设置好后,点击“完成”。至此,已经在Eclipse中创建了项目。

如果使用的是JBuilder,那么同样有两个选择,一个是使用 JBuilder自带的JUnit 3.8,一个是自己配置类库。如果自己配置类库,请在JBuilder打开后,点击菜单“Tools”->“Configure Libraries”,打开“Configure Libraries”对话框:

点击“New”按钮,打开“New Library Wizard”对话框:

使用“Add”按钮将保存于特定文件夹中的junit.jar文件引用进来,并设置Name,即该类库的名字,我将Name设置为JUnit, Location选择User Home。注意,JBuilder自带了名为JUnit的库,并放在了JBuilder下。设置好后点击“OK”按钮,回到“Configure Libraries”对话框,再点击“OK”按钮,则JUnit类库已经被添加到JBuilder当中。

下面继续,在JBuilder中创建项目。点击菜单“File”->“New Project”,打开“Project Wizard”对话框:

在这个窗口中设置项目名称及存放目录,我的项目名称仍为JUnitTest,路径为G:/YPJCCK/JUnit/JBuilder/JUnitTest。点击“Next”进入下一个窗口:

如果想使用自己下载的类库,请在这个窗口中选择“Required Libraries”选项卡,点击“Add”按钮,将刚才设置的JUnit库引用进来。下面点击“Next”按钮,进入下一个窗口:

在这个窗口中用鼠标点击Encoding下拉列表框,然后按一下“G”键,选中相应选项,此时该项目的字符集就被设置成GBK了。如果做的是国内项目,这绝对是个好习惯。最后点击“Finish”,项目创建完成。

三、编写用于测试的JavaBean

用于测试的JavaBean很简单,名为Book,只有id和name两个属性,这两个属性将分别用于两个用例当中。下面开始编写该JavaBean。

如果使用的是Eclipse,请点击“文件”->“新建”->“类”,打开“新建Java类”对话框,设置包为net.zheng.junit.test,名称为Book,并确保“public static void main(String[] args)”选项没有选中;如果使用的是JBuilder,请点击“File”->“New Class”,打开“Class Wizard”对话框,设置Package为net.zheng.junit.test,Class name为Book,并确保“Generate main method”选项没有选中。设置完成后,点击“OK”,修改代码如下:
  package piv.zheng.junit.test;
  
  public class Book {
    private String id = null;
    private String name = null;

    public String getId() {
      return id;
    }
    public void setId(String id) {
      this.id = id;
    }
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
  }

至此,用于测试的JavaBean编写完成。

四、编写测试用例

这里只用了一个类进行测试,名为TestBook,该类继承自junit.framework.TestCase类。TestBook类包含两个用例, 分别对应该类的testId和testName方法,即每个方法实现了一个测试用例。注意,在JUnit中, junit.framework.TestCase的子类中每个用来实现测试用例的方法都必须以testXXX的格式来命名,这些方法在运行时会被执行。 此外,TestBook还包括setUp和tearDown这两个方法,前者在每个测试方法开始之前执行,多用来做初始化;后者在每个测试方法完成之后执 行,多用来清理资源。下面开始编写TestBook。

在Eclipse中,创建TestBook类有两种方法:方法一,像前边创建Book类 一样,点击“文件”->“新建”->“类”来创建;方法二,先在“包资源管理器”中选中Book类,然后点击“文件”->“新建”- >“JUnit测试用例”,打开“新建JUint测试用例”窗口:

此时你会发现,很多信息已经被Eclipse自动添加进来了。将名称改为TestBook,选中setUp()、tearDown()和 contructor(),如果想利用Eclipse自动创建测试方法,请点击“下一步”。由于本文会自行编写测试方法,因此请直接点击“完成”。

如果使用的是JBuilder,那么同样有两个方法:一个是点击“File”->“New Class”来创建;一个是确保Book.java文件被打开并选中,然后点击“File”->“New”打开“Object Gallery”对话框:

在左边的树型菜单中选中“Test”,在从右边选择“Test Case”,然后点击“OK”,打开“Test Case Wizard”对话框:

由于已选中Book.java文件,因此对话框中会出现与之相关的信息。由于本文将自行编写测试方法,因此不必进行任何选择,请直接点击“Next”,进入下一窗口:

这个窗口是用来设置测试类的,这里不需要修改,直接点击“Next”进入下一窗口:

这个窗口是用来指定测试类的超类的,这里不需要指定,点击“Next”进入下一窗口:

这个窗口时用来设置测试环境配置的,请将“Test runner”的选项由“JBuilder Test Runner”改为“JUnit SwingUI Test Runner”或“JUnit TextUI Test Runner”,否则无法看到测试效果。这里选择的是后者。其他不必修改,点击“Finish”。

创建TestBook类后,修改代码如下:
  package net.zheng.junit.test;

  import junit.framework.TestCase;
  import junit.framework.Assert;
  
  public class TestBook extends TestCase {
    Book book = null;
    
    //建议为测试类创建构造
    public TestBook(String name) {
      super(name);
    }

    protected void setUp() throws Exception {
      //调用超类的setUp(),以确保测试环境被初始化
      super.setUp();

      System.out.println("测试开始!");
      book = new Book();
      System.out.println("book对象被初始化!");
    }

    protected void tearDown() throws Exception {
      System.out.println("book对象将被清理!");
      book = null;
      System.out.println("测试结束!");

      //调用超类的tearDown(),以确保测试环境被清理
      super.tearDown();
    }

    public void testId() {
      book.setId("001"); //设置id属性的值为001
      //使用Assert查看id属性的值是否为001
      Assert.assertEquals("001", book.getId());
      System.out.println("id属性被测试!");
    }

    public void testName() {
      book.setName("ASP"); //设置name属性的值为ASP
      //使用Assert查看name属性的值是否为JSP,这是个必然出现错误的测试
      Assert.assertEquals("JSP", book.getName());
      System.out.println("name属性被测试!");
    }
  }

这里setUp和tearDown方法没什么好说的,就是执行了对book对象的初始化和清理,不过testId和testName需要说明一下。前者是在 对book的id属性进行测试,首先赋值为”001”,然后使用Assert的assertEquals方法查看id属性中存放的值是否是期待的值,由于 我的期待值也是”001”,所以执行后这个用例应该是成功的;后者则是对book的name属性进行测试,也是首先赋值为”ASP”,然后使用 Assert的assertEquals方法查看其值是否是期待的,由于我特意将期待值设定为根本不可能的”JSP”,因此这个用例执行后会出现一个错 误。但请注意,由于我是特意要让测试出现错误,所以将期待值设定成了不可能的值,如果你是测试人员,请千万不要这么做,否则如果别的地方导致了错误,很容 易给自己造成不必要的麻烦。

下面简单介绍一下上边用到的静态类junit.framework.Assert。该类主要包含8个方法:

1.assertEquals()方法,用来查看对象中存的值是否是期待的值,与字符串比较中使用的equals()方法类似;

2.assertFalse()和assertTrue()方法,用来查看变量是是否为false或true,如果assertFalse()查看的变量的值是false则测试成功,如果是true则失败,assertTrue()与之相反;

3.assertSame()和assertNotSame()方法,用来比较两个对象的引用是否相等和不相等,类似于通过“==”和“!=”比较两个对象;

4.assertNull()和assertNotNull()方法,用来查看对象是否为空和不为空;

5.fail ()方法,意为失败,用来抛出错误。我个人认为有两个用途:首先是在测试驱动开发中,由于测试用例都是在被测试的类之前编写,而写成时又不清楚其正确与 否,此时就可以使用fail方法抛出错误进行模拟;其次是抛出意外的错误,比如要测试的内容是从数据库中读取的数据是否正确,而导致错误的原因却是数据库 连接失败

五、运行TestBook

编写好TestBook后,就可以运行了。如果用的是Eclipse,那么您可以点击运行按钮旁边的倒三角,选择“运行为”->“1 JUnit测试”,此时运行效果如下图:

在图片的左侧可以看到“JUnit”一栏,而且里边还有一个错误。不过这个错误是预计之内的,如果不想看到,可以将testName()方法中的”JSP”改成”ASP”,此时的运行效果如下图:

此时您会看到,“JUnit”栏中的进度条已不是红色,而是绿色的,这说明已经没有错误了。

如果用的是JBuilder,那么在TestBook类的选项卡上点击鼠标右键,选择“Run Test using “TestBook.java””,测试信息会从Message窗口输出:

六、测试套件

当有多个测试类需要一次性进行测试时,可以使用测试套件来完成这项工作。 在Eclipse中,点击“文件”->“新建”->“其它”,打开“新建”对话框:

在“向导”中选择Java\JUnit\JUnit测试套件,然后点击下一步,进入“信件JUnit测试套件”窗口:

此时会发现,测试类已由Eclipse自动加载进来了。点击“完成”。

如果使用的是JBuilder,请点击“File”->“New”打开“Object Gallery”对话框:

在左边的树型菜单中选中“Test”,在从右边选择“Test Case”,然后点击“OK”,打开“Test Suite Wizard”对话框:

JBuilder会自动将测试类加载进来,请直接点击“Next”,进入下一窗口:

这个窗口是用来设置测试套件的,将Class name改为AllTests。由于这里使用了之前的测试环境配置,直接点击“Finish”即可。如果想另外进行设置,请点击“Next”进入下一窗口:

“Create a runtime configuration”默认没有选中,请选中然后进行设置。最后点击“Finish”。

由 于这里直接使用了Eclipse和JBuilder所创建的代码,因此就不展示了。运行方法与之前运行测试类一样。不过若是对测试环境进行过配置,此时 JBuilder与之前相比会稍有变化,应在快捷菜单中选择“Run Test”下的“Use “AllTests””。

七、更多运行方法

JUnit自身也提供有运行环境。在Eclipse中新建一个带有main()方法的类,我建的类名称为Test,代码如下:
  package net.zheng.junit.test;

  import junit.framework.*;

  public class Test {
    public static void main(String[] args) {
      //使用TestSuite组装测试类
      TestSuite ts = new TestSuite();
      ts.addTestSuite(TestBook.class);
      //textui,命令行方式
      junit.textui.TestRunner.run(ts);
      //swingui,Swing方式
      //junit.swingui.TestRunner.run(ts.getClass());
      //awtui,AWT方式
      //junit.awtui.TestRunner.run(ts.getClass());
    }
  }

其 中TestSuite是用来组织测试类的,通过其addTestSuite()方法将测试类添加到ts对象中,凡是添加到ts中的测试类都将在 junit.textui.TestRunner.run()时被执行。如果您创建了之前的测试套件,应该会看到类似的代码。此外,您也可以在定义ts对 象时利用其构造函数将测试类添加给ts对象,例如:
 TestSuite ts = new TestSuite(TestBook.class);

这 并不会影响到后续使用addTestSuite()方法。再有,JUnit提供了三种运行方式,junit.textui.TestRunner是命令行 方式的,junit.swingui.TestRunner和junit.awtui.TestRunner是可视化方式的,后两个这里已经注释掉了,如 果您想查看效果,可以将注释去掉。

如果您在使用JBuilder,也请建立一个Test类。编写好后,在Test类的选项卡上点击鼠标右键,在调出的快捷菜单中点击“Run using defaults”,稍等片刻,就会看到运行效果了。

八、小结

其实JUnit上手很容易,远比想象的要简单的多,但我觉得如何编写测试类是很需要经验的,因为许多时候,测试一个用例,但涉及到可能不止一个类;而有 些时候,一个类可能是做为工具使用,里边涉及很多内容,那么测试时是否还是只编写一个测试类呢?关于这个话题,我想应该是仁者见仁、智者见智的,其实这才 是测试的难题所在。

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号