服务热线:13616026886

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

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

jbuilder2005单元测试之创建测试用例


  我们先为subsection类创建测试用例。

  1.在编辑器中打开subsection.java文件,使其处理激活态。

  2.file->new...->test->在test页的对象库中双击test case图标,启动创建测试用例的向导,如下图所示:

jbuilder2005单元测试之创建测试用例(图一)
图 错误!文档
中没有指定样式的文字。指定测试的方法

  ?select class:测试的目标类,默认为当前编辑器中打开的类,也可以通过其后的…按钮选择工程中其他的类。

  ?avaiable methods:列出了测试目标类的所有public、protected和默认可视域的方法,private方法不列出。只要你测试了前三者的方法,private也被间接测试到了。这里,我们选择getvalue()和sign()方法。

  点击next到下一步。

  3.设置测试用例类的类名。

jbuilder2005单元测试之创建测试用例(图二)
图 错误!文档中没有指定样式的文字。指定测试用例类的名称

  jbuilder为测试用例类指定了一个默认的类名,即test<业务类名>,包名和业务类包名一致。接受默认的值,直接按finish创建testsubsection测试用例类。

  实战经验:

  虽然在物理上,业务类和测试用例类被放在不同目录下,但在工程窗格的资源树中,业务类和测试用例还是挤在了一起。如果一个包下有多个业务类,加上它们相应的测试用例类,将显得更加拥挤不堪。所以最好将测试用例放到不同的包中,如com.super.bdbj包中的所有业务类的测试用例放到test.super.bdbj目录下,这样将彻底解决测试用例和业务类的物理和逻辑上的分离,使工程窗格中的资源树更加整洁明了。

  testsubsection类的代码如下所示:

  代码清单 错误!文档中没有指定样式的文字。向导生成的testsubsection类

1. package chapter25;
2.
3. import junit.framework.*;
4. public class testsubsection extends testcase {
5.  private subsection subsection = null;
6.  protected void setup() throws exception {
7.   super.setup();
8.   subsection = new subsection();
9.  }
10.
11. protected void teardown() throws exception {
12.  subsection = null;
13.  super.teardown();
14. }
15.
16. public void testgetvalue() {
17.   int d = 0;
18.   int expectedreturn = 0;
19.   int actualreturn = subsection.getvalue(d);
20.   assertequals("return value", expectedreturn, actualreturn);
21.   /**@todo fill in the test code*/
22. }
23.
24. public void testsign() {
25.  double d = 0.0;
26.  int expectedreturn = 0;
27.  int actualreturn = subsection.sign(d);
28.  assertequals("return value", expectedreturn, actualreturn);
29.  /**@todo fill in the test code*/
30. }
31. }

  在第5行声明了一个subsection的成员变量,并在setup()中实例化这个变量(第7行),在teardown()中释放这个变量(第12行),其实这三部分就构成了一个测试固件。当然,由于我们的getvalue()、sign()方法都是静态方法,所以并不需要这个固件,在测试方法中直接调用方法就可以了,如subsection.getvalue(),但为了加强概念上的认识,我们特别予以保留。

  第16~22行的testgevalue()方法,和第24~30行的testsign(),就是在向导第1步所选择的需要测试的api方法对应的测试方法。jbuilder当然不可能知道我们api的逻辑规则,所以它仅提供了一个框架式的测试代码,需要我们发挥聪明才智通过assertxxx()定制覆盖性强的测试规则。

  注意:

  你也可以手工在testsubsection类中添加测试方法,测试方法必须遵照public void testxxx()样式规范。所以如果你想在测试用例类中添加一个辅助性的方法,请不要以test为前缀,在更改业已生成的测试方法名称时,也要保证不去除方法前的test前缀,测试运行器籍此查找测试用例类中的测试方法。


  下面,分别删除testgetvalue()和testsign()方法体中的代码,用以下粗体代码替换之:

  代码清单 错误!文档中没有指定样式的文字。添加测试规则后的testsubsection类

1. …
2. public class testsubsection extends testcase
3. {
4.  …
5.  public void testgetvalue() {
6.   int d1 = -3,y1 = 3;
7.   int d2 = -2,y2 = 4;
8.   int d3 = 0 ,y3 = 100;
9.   int d4 = 2 ,y4 = 8;
10.  int d5 = 33 ,y5 = 32768;
11.  int d6 = 33 ,y6 = integer.max_value;
12.  assertequals(y1,subsection.getvalue(d1));
13.  assertequals(y2,subsection.getvalue(d2));
14.  assertequals(y3,subsection.getvalue(d3));
15.  assertequals(y4,subsection.getvalue(d4));
16.  assertequals(y5,subsection.getvalue(d5));
17.  assertequals(y6,subsection.getvalue(d6));
18. }
19.
20. public void testsign() {
21.  double d1 = -1.0, d2 = 0.0, d3 = 1.0;
22.  int y1 = 1, y2 = 0, y3 = 1;
23.  assertequals(y1, subsection.sign(d1));
24.  assertequals(y1, subsection.sign(d1));
25.  assertequals(y1, subsection.sign(d1));
26.  }
27. }

  打蛇打七寸,擒贼先擒王,抓bug还须在那些关键点上下功夫,特殊转换点是最容易出现问题的热点地区,需要给予特别的关注。所以我们为getvalue()设置了6个测试点,而为sign()方法设置了3个测试点。

  在工程窗格资源树中找到testsubsection.java文件,右击在弹出的菜单中选择run test using "testsubsection1",jbuilder利用jbtestrunner测试运行器运行这个测试用例,在信息窗格中出现如下的运行器界面:


(图片较大,请拉动滚动条观看)
图 错误!文档中没有指定样式的文字。jbtestrunner运行器界面

  jbtestrunner窗口左边为3个标签页,它们的作用在下表的说明:

  表 错误!文档中没有指定样式的文字。jbtestrunner窗口标签页说明

标签页图标说明
 jbuilder2005单元测试之创建测试用例(图四)如果测试没有错误,该标签页为默认显示的标签页。形成一棵测试套件->测试用例->测试方法3级的级联树。树中每个节点均有一个状态指示图标。 jbuilder2005单元测试之创建测试用例(图五)表示通过测试,而jbuilder2005单元测试之创建测试用例(图六) 表示未通过测试。点击未通过测试的节点,右边帧列出了错误跟踪迹,通过这个跟踪迹可以找到哪个测试规则(断言方法assertxxx())未通过。
 jbuilder2005单元测试之创建测试用例(图七)测试错误页,如果发生了测试错误,该页被默认显示。列出所有发生错误的测试,该页是jbuilder2005单元测试之创建测试用例(图四) 标签页的子集。
 jbuilder2005单元测试之创建测试用例(图八)该标签页中显示出所有输出到控制台的信息,如测试用例中有通过system.out.println()输出信息,则这些信息在此查看。

  当没有发生失败的测试时,测试进度条显示为绿色,否则显示为红色。对于测试用例很少的情况你看不到它的效果,如果成百上千的测试用例一起运行,这个进度条的作用是显而易见了。进度条右边是测试结果统计信息:包括测试方法总数和成功数,统计信息右边是测试所花费的时间。

  右帧是测试失败的引发点,单击链接,jbuilder自动定位到测试用例测试失败的地方,在本例里,jbuilder将定位到代码清单 错误!文档中没有指定样式的文字。添加测试规则后的testsubsection类的代码的第17行,即:assertequals(y5, subsection.getvalue(d5));所在的行。

  说明测试失败是由这个断言引起的,由于这个断言测试入参大于32时的函数返回值正确性,所以我们就知道程序没有考虑到返回值超过int类型范围的情况。返回到代码清单 错误!文档中没有指定样式的文字。前文分段函数代码中将第13~15行被注释的代码放出来,重新运行测试,你将发现测试全部通过了。

  这也说明,编写一个有效测试用例并非易事,程序路径100%覆盖,完美的测试用例往往很难达到。当然,你可以依照一些经验性的原则,其中最大的一条就是:关注关键点。测试用例编写的技巧,超过了本文的范围,读者可以自行参考相关的书籍。

  提示:

  有时,jbtestrunner右边的帧窗口虽然内容已经超出,但滚动条却没有显示出来,想来应该是jbuilder一个小小的bug吧。你可以在帧窗口中右击,在弹出的菜单中去除word wrap设置项,或者手工移动一下左右两帧间的分隔栏,滚动条就会显示出来了。

扫描关注微信公众号