结对编程2——单元测试
201421123003 黄建英 201421123004 黄美海
码市链接:https://coding.net/u/hmhhh/p/UnitTest/git/tree/master
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.小结与感受
虽然这次的作业是在前次的代码上继续改进,从而增加功能,但是难度的增加还是让我们在实现的过程中倍觉艰难。比如:因为之前写的代码没有模块化,而且有些计算是在主函数内进行的所以我们在进行计算模块的提取有一些难度、对于输入异常考虑的不够全面、数组溢出的问题也没有考虑到。但是两个人商量着,也查询了一些资料,最终解决了这些问题。有一个合作伙伴,确实比自己独自思考效率来的高。
d.体会
(1) 良好的设计
对于代码的功能事先要做好明确清晰的模块化设计。
(2) 编码规范
之前的代码对于代码模块化做的不是很好,搀杂在主函数里,不易于提取与修改。
(3) 必要的注释
之前有注释,以及队友的相互指导,能加快对之前代码的理解
总的来说,一加一大于二,两个人能相互监督不拉进度,相互提出问题,相互解决问题,加快进度与效率,结对编程是很好的合作方式。
结对照片:
psp