服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

junit学习笔记之netbeans篇

一、简介
  本文与之前的《junit学习笔记》所记述的内容是一致的,只不过ide换成了最近开始试用的netbeans。netbeans是新近流行的一款堪与eclipse媲美的ide,有sun的支持,最新版本5.0rc2,本文使用的是4.1中文版,可以从www.netbeans.org下载。
  junit是一款由erich gamma(《设计模式》的作者)和kent beck(极限编程的提出者)编写的开源的回归测试框架,供java编码人员做单元测试之用,可以从www.junit.org网站上免费获得。本文使用的是netbeans自带的junit 3.8.1。
二、创建项目
  下面打开netbeans,然后点击菜单“文件”->“新建项目”,打开“新建项目”对话框:

junit学习笔记之netbeans篇(图一)

请在“类别”中选择“常规”,再从“项目”中选择“java应用程序”,然后点击“下一步”,进入“新建java应用程序”对话框: 

junit学习笔记之netbeans篇(图二)

在这个对话框中需要设置项目的名称以及项目所在目录,我为自己的项目起名为junittest,“项目位置”为g:/ypjcck/junit/netbeans,此外,请将“创建主类”前的对号去掉。项目创建好后,已经自带了junit 3.8.1。
三、编写用于测试的javabean
  用于测试的javabean很简单,名为book,只有id和name两个属性,这两个属性将分别用于两个用例当中。下面开始编写该javabean。
  请点击“文件”->“新建文件”,打开“新建文件”对话框:

junit学习笔记之netbeans篇(图三)

确保“项目”选择的是junittest,然后在“类别”中选中java类,在“文件类型”中选中java类,点击“下一个”,进入下一窗口:

junit学习笔记之netbeans篇(图四)

设置类名为book,包为net.zheng.junit.test,设置完成后点击“完成”,修改代码如下:
  package net.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编写完成。
四、编写测试用例
  这里只用了一个类进行测试,名为booktest,该类继承自junit.framework.testcase类。booktest类包含两个用例,分别对应该类的testid和testname方法,即每个方法实现了一个测试用例。注意,在junit中,junit.framework.testcase的子类中每个用来实现测试用例的方法都必须以testxxx的格式来命名,这些方法在运行时会被执行。此外,booktest还包括setup和teardown这两个方法,前者在每个测试方法开始之前执行,多用来做初始化;后者在每个测试方法完成之后执行,多用来清理资源。下面开始编写booktest。
  请点击“文件”->“新建文件”,打开“新建文件”对话框:

junit学习笔记之netbeans篇(图五)

确保“项目”选择的是junittest,然后在“类别”中选中junit类,在“文件类型”中选中现有类的测试,点击“下一个”,进入下一窗口:

junit学习笔记之netbeans篇(图六)

选择要测试的类,点击“完成”,修改代码如下:
  package net.zheng.junit.test;

  import junit.framework.testcase;
  import junit.framework.assert;

  public class booktest extends testcase {
    book book = null;

    //建议为测试类创建构造
    public booktest(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方法抛出错误进行模拟;其次是抛出意外的错误,比如要测试的内容是从数据库中读取的数据是否正确,而导致错误的原因却是数据库连接失败。
五、运行booktest
  编写好booktest后,就可以运行了。请在“项目”栏中选中booktest,点击鼠标右键,选择“运行文件”,测试信息会从“输出”窗口输出:

junit学习笔记之netbeans篇(图七)

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

junit学习笔记之netbeans篇(图八)

确保“项目”选择的是junittest,然后在“类别”中选中junit类,在“文件类型”中选中测试套件,点击“下一个”,进入下一窗口:

junit学习笔记之netbeans篇(图九)

修改“类名”为alltests,点击“完成”,然后修改代码如下:
  package net.zheng.junit.test;

  import junit.framework.*;

  public class alltests extends testcase {
    public alltests(string testname) {
      super(testname);
    }

    public static test suite() {
      testsuite ts= new testsuite("alltests");
      ts.addtestsuite(booktest.class);
      return ts;
    }
  }
其中testsuite是用来组织测试类的,通过其addtestsuite()方法将测试类添加到ts对象中,凡是添加到ts中的测试类都将在运行文件时被执行。此外,您也可以在定义ts对象时利用其构造函数将测试类添加给ts对象,例如:
  testsuite ts = new testsuite(booktest.class);
这并不会影响到后续使用addtestsuite()方法。测试套件的运行方法与之前一样。
  此外,junit自身也提供了运行测试的环境,但需要在netbeans中做一些改动,所以就不作详细介绍了,这里只将代码给出:
  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());
    }
  }
七、小结
  其实junit上手很容易,远比想象的要简单的多,但我觉得如何编写测试类是很需要经验的,因为许多时候,测试一个用例,但涉及到可能不止一个类;而有些时候,一个类可能是做为工具使用,里边涉及很多内容,那么测试时是否还是只编写一个测试类呢?关于这个话题,我想应该是仁者见仁、智者见智的,其实这才是测试的难题所在。

扫描关注微信公众号