201421123003 黄建英 201421123004 黄美海
a.需求分析:
1.把计算模块提取出来单独创建一个类
2.通过单元测试代码,测试加减乘除功能
3.通过单元测试代码,测试计算类对于各种参数的支持:
a.输入是有错误的,例如 “1 ++ 2”,
b.在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768”,
c. 或者是 “ 248 / 0” 怎么办?
b.设计测试框架, 模拟测试数:(项目以java语言进行开发,使用junit4进行测试)
1.整数的加减乘除功能测试
2.分数的加减乘除功能测试
3.输入是有错误的,例如 “1 ++ 2”
4.数值超出范围测试,在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768”(数组溢出)
5.结果除0测试,例如:“ 248 / 0” (除数为0)
6.代码覆盖率
问题及解决
Q:不知道如何使用junit4和生成代码覆盖率
A:通过查阅相关资料学习
Q:对于一些特殊情况(如数组越界、除数不为0)的解决存在困难
A:最后用if/else排除异常
代码展示
CalcFunction.java部分代码
public class CalcFunction { private String result; public void calc(String s){ if(s.indexOf("+")>-1 && s.indexOf("+")< 2){ add(s); }else if(s.indexOf("-")>-1 && s.indexOf("-")< 1){ substract(s); }else if(s.indexOf("×")>-1 && s.indexOf("×")< 1){ multiply(s); }else if(s.indexOf("÷")>-1 && s.indexOf("÷")< 1){ divide(s); }else System.out.println("error!Not allow like 1++1!"); System.out.println(getResult()); } public void add(String s) { String[] str=s.split("[+]"); if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1) { String[] str1=str[0].split("[/]"); String[] str2=str[1].split("[/]"); result =Reduction(((Integer.parseInt(str1[0])*Integer.parseInt(str1[1]))+(Integer.parseInt(str2[0])*Integer.parseInt(str1[1]))),(Integer.parseInt(str1[1])*Integer.parseInt(str2[1]))); } else{ result = Integer.parseInt(str[0])+Integer.parseInt(str[1])+""; } } public void substract(String s) { String[] str=s.split("[-]"); if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1) { String[] str1=str[0].split("[/]"); String[] str2=str[1].split("[/]"); result =Reduction(((Integer.parseInt(str1[0])*Integer.parseInt(str2[1]))-(Integer.parseInt(str2[0])*Integer.parseInt(str1[1]))),(Integer.parseInt(str1[1])*Integer.parseInt(str2[1]))); } else{ if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000) {result = Integer.parseInt(str[0])+Integer.parseInt(str[1])+"";} else System.out.println("error!overrun!");} } public void multiply(String s) { String[] str=s.split("[×]"); if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1) { String[] str1=str[0].split("[/]"); String[] str2=str[1].split("[/]"); result =Reduction(Integer.parseInt(str1[0])*Integer.parseInt(str2[0]),Integer.parseInt(str1[1])*Integer.parseInt(str2[1])); } else{result = Integer.parseInt(str[0])*Integer.parseInt(str[1])+"";} } public void divide(String s) { String[] str=s.split("[÷]"); if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1) { String[] str1=str[0].split("[/]"); String[] str2=str[1].split("[/]"); if(Integer.parseInt(str1[1]) != 0 && Integer.parseInt(str2[1]) != 0) { result =Reduction(Integer.parseInt(str1[0])*Integer.parseInt(str2[1]),Integer.parseInt(str1[1])*Integer.parseInt(str2[0])); }else System.out.println("error!Divisor cannot be zero!"); }else{ if(Integer.parseInt(str[1]) != 0) { result = Integer.parseInt(str[0])/Integer.parseInt(str[1])+""; }else System.out.println("error!Divisor cannot be zero!"); } } public String getResult() { return result; } }
c.小结与感受
1.因为之前写的代码没有模块化,而且有些计算是在主函数内进行的所以我们在进行计算模块的提取有一些难度,加之是两个星期前的代码有些忘记自己写了什么,还好有之前有注释,我们从netbeans中将代码提取到eclipse中。
2.之前代码的功能只是考虑到最基本功能的实现和极少部分的异常捕获,对于输入异常考虑的还不是很全面。
3.没有考虑到用户可以对我们应用进行一个错误的反馈的功能。
4.之前的数组等的范围都定的比较小,还没有考虑到数组溢出的问题。
d.体会
(1) 良好的设计
对与代码的功能的模块化没有分的很明确清晰,这也是写一部分改一部分,没有事先规划好模块的弊端所在。
(2) 编码规范
之前的代码格式是没有什么问题,因为有代码格式一键复原。但对于代码模块化做的不是很好,搀杂在主函数里,不易于提取与修改。
(3) 必要的注释
时隔两周对我们自己写的代码有些小陌生了,还好之前有注释,以及队友的相互指导,能加快对之前代码的理解
总的来说,一加一大于二,两个人能相互监督不拉进度,相互提出问题,相互解决问题,加快进度与效率,结对编程是很好的合作方式。
结对照片:
psp
码市链接:https://coding.net/u/hjyaaa/p/UnitTest/git/tree/master/