211614269 林凯 211601233张康凌
单元测试
一.设计思路
- 针对每个方法,对出现的可能情况进行测试,每个测试方法对应几年级。
- 最后验证是否与预期结果一样
二.部分代码
- 这段代码主要判断输入的参数是否正确,如果输入的格式错误会返回false,如果输入正确会返回true与自己预期结果对比。
@Test
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方法的作用是从用户传入的合法参数中提取出我们需要的年级及题目数。
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));
}
三.代码覆盖率
结构优化
UML类图
流程图
1.重构部分
- 原先每个出题函数中都有独立的写入文件代码,导致重复代码很多,并且让出题函数的结构很混乱。
- 故将写入文件的代码提取成一个write方法,需要的方法仅需增加一条语句调用即可。
- 提取出write方法后,代码行数缩减了100行
- 原先所有的输入参数判断合法性及拆分出需要的数据都在main方法里实现,结构混乱。
- 故拆分成checkInput及inform方法,分别负责判断输入参数的合法性及提取出程序运行需要的数据。
- main方法只需要调用这两个方法即可
2.每个模块的功能
两大类 分别负责出题和计算
- MathExam类
- mathOne,mathTwo,mathThree三个年级的出题方法;
- checkInput用来判断输入参数是否合法;在判断输入参数合法后调用inform方法提取程序运行需要的数据;
- 出题结束后用write方法写入文件
- Calculate类
- cutStr方法用来将字符串形式存储的题目按数值和符号分别拆分存放于数组
- priority方法负责判断并返回符号的优先级
- reversePolishNotation方法负责将题目转换成逆波兰式
- compute方法用于计算逆波兰式的值
- ans方法返回一个数组,两个值代表计算结果和计算结果是否合法
性能调优
1.性能瓶颈
-运行时间太长太长了
-无用的代码过多
2.优化方案
-删除多余的参数
-对多余的代码进行简化或者删除
总结
总是说测试代码比编写代码难,因为很多地方在之前写代码的时候思想不严谨,没有顾虑大局,只是想着做出结果,在运行效率与优化上没有注重,导致这次任务花了很多精力与时间,还是需要一直改善一直改进。