对”规则”做单元测试
从“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. } |