使用JUnit对规则进行单元测试(上)

发表于:2009-2-27 14:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:贾少亮    来源:IBM

  对”规则”做单元测试

  从“JVM initial heap size rating algorithm”以及 WPA 中其他基于“规则”的性能调优算法,我们总结出对“规则”做单元测试的特点有:

  一、为了覆盖所有的阀值 (threshold value )和等价类 (equivalent class ),我们需要大量测试数据。单元测试的通常做法是,把所有的测试数据写入测试代码中。对比以格式化的形式(XML,Excel 等)来保存测试数据,这样做使得这些数据不容易维护和复用。

  二、由于对”规则”的测试涉及到变量,这些变量来自运行时的输入,我们在单元测试之前就需要构建运行时环境,这种工作可能非常复杂。如果一套”规则”中包含更多的条件和输入参数,以上两个问题会更加严重

  三、在一个基于”规则”的系统里,”规则”之间有很多共性,我们没有必要对每一个”规则”都写一个测试类。

  本文将给出解决以上问题的一种做法。本文的组织结构如下:

  ● 编写 Mock 类:利用 Mock 对象来代替实时运行环境;

  ● 将测试数据保存到配置文件中:利用格式化文档实现测试数据的复用性和可维护性;

  ● 编写 SettersMap 类:这个类保存了配置文件中的数据并提供了获取这些数据的接口;

  ● 编写可复用的 TestCase 类:创建 JUnit 的扩展类以适应对“规则”做单元测试的需求;

  ● 用 TestSuite 组织测试用例:用 TestSuite 把测试用例组织起来;

  ● 以下内容中,我们将拿“ JVM initial heap size rating algorithm ”做例子。

  编写 Mock 类

  为了测试” JVM initial heap size rating algorithm ”,我们需要获得三个输入参数。然而,获取这三个参数并不是那么容易。

  为了简化测试环境,我们利用 Mock 对象来设置这些参数。

  Mock 对象是单元测试经常用到的一种技术,Mock 对象能模拟实际对象的行为,并且提供了额外的行为控制接口。还有一个常用到的词是 Dummy 对象。 Mock 和 Dummy 的含义经常被混淆。在这里,我们认为 Dummy 对象没有提供额外的行为控制接口。

  对于” JVM initial heap size rating algorithm ”,我们需要一个 Mock 类,它的行为与“ InitialHeapSize.java ”相同(“ InitialHeapSize.java ”是 “ JVM initial heap size rating algorithm ”的 Java 代码)。我们把这个 Mock 类命名为“ MockInitialHeapSize.java ”。一个 Client 类可以把“ initialHeapSize ” , “ currentMemoryPoolSize ” , 和“ overallMemoryOnPartition ” 直接设置到“ MockInitialHeapSize ”对象中。参见清单 2

  清单 2. MockInitialHeapSize.java

  view plaincopy to clipboardprint?

  1. public class MockInitialHeapSize extends InitialHeapSize {

  2.     // 设置 InitialHeapSize

  3.     public void setInitialValue(String initialValue){

  4.         this.initialValue = initialValue;

  5.     }

  6.     // 设置 MemoryPoolSize

  7.     public void mockSetMemoryPoolSize(String size) {

  8.         try{

  9.             this.currentSettingOfMemoryPoolSize=Float.parseFloat(size);

  10.         }catch(NumberFormatException ne){

  11.             Advisor.getLogger().severe("size: "+size+" are not an float value.");

  12.         }

  13.     }

  14.     // 设置 OverallMemory

  15.     public void mockSetOverallMemory(String size) {

  16.         try{

  17.             this.overallMemoryOnPartition=Float.parseFloat(size);

  18.         }catch(NumberFormatException ne){

  19.             Advisor.getLogger().severe("size: "+size+" are not an float value.");

  20.         }

  21.     }

  22.     ……

  23.  }

42/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号