小学生最喜欢的测试优化环节
是一个标题
211614269 林凯 211601233 张康凌
一、单元测试
- 设计思路
- 两个测试类,分别测试MathExam和Calculate类的各种方法
- 一个总的测试套件,包含以上两个测试类
- 要尽可能覆盖多的代码
- 测试代码
- 以下为 checkInput方法的测试代码,该方法的作用是从用户传入的参数是否合法。
- 测试数据的目的是验证该方法在输入合法参数时返回值是true,传入不合法参数返回值为false
public void testCheckInput() {
String[] a=new String[] {"-n","50","-grade","3"};
String[] b=new String[] {"-n","50","-grade","4"};
String[] c=new String[] {"-n","10000","-grade","3"};
String[] d=new String[] {"-nn","50","-grade","3"};
String[] e=new String[] {"-n","50","-gg","3"};
String[] f=new String[] {"-grade","3","-n","50"};
assertEquals(true, MathExam.checkInput(a));
assertEquals(false, MathExam.checkInput(b));
assertEquals(false, MathExam.checkInput(c));
assertEquals(false, MathExam.checkInput(d));
assertEquals(false, MathExam.checkInput(e));
assertEquals(true, MathExam.checkInput(f));
}
- 以下为inform方法的测试代码,inform方法的作用是从用户传入的合法参数中提取出我们需要的年级及题目数。
- 由于已经有checkInput方法检测输入参数是否合法,所以默认这里只会传入合法参数,则测试数据只需要能够体现该方法能返回正确的年级题数即可。
public void testInform() {
String[] a=new String[] {"-n","50","-grade","3"};
String[] b=new String[] {"-grade","2","-n","50"};
int[] aa=new int[] {3,50};
int[] bb=new int[] {2,50};
assertArrayEquals(aa,MathExam.inform(a));
assertArrayEquals(bb,MathExam.inform(b));
}
- 单元测试得到的测试覆盖率截图
二、结构优化
- 重构部分
- 原先每个出题函数中都有独立的写入文件代码,导致重复代码很多,并且让出题函数的结构很混乱。
- 故将写入文件的代码提取成一个write方法,需要的方法仅需增加一条语句调用即可。
- 提取出write方法后,代码行数缩减了100行
- 原先所有的输入参数判断合法性及拆分出需要的数据都在main方法里实现,结构混乱。
- 故拆分成checkInput及inform方法,分别负责判断输入参数的合法性及提取出程序运行需要的数据。
- main方法只需要调用这两个方法即可
- 原先每个出题函数中都有独立的写入文件代码,导致重复代码很多,并且让出题函数的结构很混乱。
- 重构后的模块功能
- 两大类 分别负责出题和计算
- MathExam类
- mathOne,mathTwo,mathThree三个年级的出题方法;
- checkInput用来判断输入参数是否合法;在判断输入参数合法后调用inform方法提取程序运行需要的数据;
- 出题结束后用write方法写入文件
- Calculate类
- cutStr方法用来将字符串形式存储的题目按数值和符号分别拆分存放于数组
- priority方法负责判断并返回符号的优先级
- reversePolishNotation方法负责将题目转换成逆波兰式
- compute方法用于计算逆波兰式的值
- ans方法返回一个数组,两个值代表计算结果和计算结果是否合法
- MathExam类
- 两大类 分别负责出题和计算
三、性能调优
-
优化前效能分析工具的结果截图
-
性能瓶颈
由效能分析工具分析结果可以看出,Calculate类的cutStr方法是所有方法中最消耗性能的方法。- cutStr方法的作用是将按字符串存储的题目切割成符号及数值存储于字符串数组中。
- cutStr方法在最开始时会去掉原字符串的空格,而实现这一功能使用到了replace方法,该方法消耗了大部分性能
-
优化方案
- 去掉repalce方法,遍历字符串时碰到空格直接跳过。
-
优化后效能分析工具的结果截图
- 优化cutStr方法后的截图
- 优化cutStr方法后的截图