结对编程2——单元测试
成员:201421123005 谢晓萍 201421123030 陈宇杰
代码地址:https://coding.net/u/cococok2/p/TeamWork-2/git
1.需求分析
(1)通过单元测试代码,测试加法是否能正确工作;
(2)通过单元测试代码,测试加减乘除功能。
(3)通过单元测试代码,测试计算类对于各种参数的支持:
a. 输入是有错误的,例如 “1 ++ 2”,
b. 在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768”,
c. 或者是 “ 248 / 0” 怎么办?
d. 怎么告诉函数的调用者 “你错了”? 把返回的字符串定义为 “-1” 来表示?
e. 那么如果真的计算结果是 “-1” 又怎么处理呢?
2.设计测试框架, 模拟测试数据
加减测试:
乘除测试:
混合运算测试(带括号):
括号的嵌套:
括号输入不完整:
输入错误:(如输入1++2)
除0的情况:(结果定义为无穷)
以下是运算模块的代码:
1 package package1; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 public class autoCalculate { 6 7 8 public List<String> list; 9 public autoCalculate(String input) { 10 char[] ins = input.toCharArray(); 11 list = new ArrayList<String>(); 12 String str = ""; 13 14 for (int i = 0; i < ins.length; i++) { 15 16 if (ins[i] == '-' && ins[i + 1] >= '0' && ins[i + 1] <= '9' 17 && (i == 0 || ins[i - 1] == '(')) { 18 str += ins[i]; 19 continue; 20 } 21 22 if (ins[i] == '-' && ins[i + 1] == '('&&(i==0||ins[i-1]!=')')) { 23 list.add("0"); 24 list.add("-"); 25 list.add("1"); 26 list.add("*"); 27 continue; 28 } 29 if (!checkFuhao(ins[i])) { 30 str += ins[i]; 31 if (i == ins.length - 1) { 32 list.add(str); 33 } 34 } else { 35 if (!"".equals(str)) { 36 list.add(str); 37 str = ""; 38 } 39 list.add(ins[i] + ""); 40 } 41 42 if (i>0&&ins[i]=='('&&ins[i-1]>='0'&&ins[i-1]<='9') { 43 list.add(list.size()-1,"*"); 44 } 45 } 46 47 } 48 49 String yunsuan(List<String> list) { 50 try { 51 int zuo = haveZuoKuoHao(list); 52 if (zuo != -1) { 53 int you = lastYouKuohao(list, zuo); 54 List<String> l = removeKuohao(list, zuo, you); 55 addKuohao(list, yunsuan(l), zuo); 56 yunsuan(list); 57 } 58 int chengchu = haveChengChu(list); 59 if (chengchu != -1) { 60 chengchuYunsuan(list, chengchu); 61 } else { 62 jiajianYunsuan(list); 63 } 64 if (list.size() == 1) { 65 return list.get(0); 66 } 67 } catch (Exception e) { 68 System.out.println("error"); 69 System.exit(0); 70 } 71 return yunsuan(list); 72 } 73 74 public void jiajianYunsuan(List<String> list) { 75 for (int i = 0; i < list.size(); i++) { 76 if (list.get(i).equals("+")) { 77 double last = Double.parseDouble(list.remove(i + 1)); 78 list.remove(i); 79 double first = Double.parseDouble(list.get(i - 1)); 80 list.set(i - 1, last + first + ""); 81 i--; 82 } 83 if (list.get(i).equals("-")) { 84 double last = Double.parseDouble(list.remove(i + 1)); 85 list.remove(i); 86 double first = Double.parseDouble(list.get(i - 1)); 87 list.set(i - 1, first - last + ""); 88 i--; 89 } 90 } 91 92 } 93 94 public void chengchuYunsuan(List<String> list, int chengchu) { 95 double last = Double.parseDouble(list.remove(chengchu + 1)); 96 String fuhao = list.remove(chengchu); 97 double first = Double.parseDouble(list.get(chengchu - 1)); 98 if (fuhao.equals("*")) { 99 list.set(chengchu - 1, first * last + ""); 100 } 101 if (fuhao.equals("/")) { 102 list.set(chengchu - 1, first / last + ""); 103 } 104 105 } 106 public int haveChengChu(List<String> list) { 107 for (int i = 0; i < list.size(); i++) { 108 if (list.get(i).equals("*") || list.get(i).equals("/")) { 109 return i; 110 } 111 } 112 return -1; 113 } 114 115 public List<String> removeKuohao(List<String> list, int zuo, int you) { 116 List<String> l = new ArrayList<String>(); 117 list.remove(you); 118 list.remove(zuo); 119 for (int i = zuo; i <= you - 2; i++) { 120 l.add(list.remove(i)); 121 i--; 122 you--; 123 } 124 return l; 125 } 126 127 public int haveZuoKuoHao(List<String> list) { 128 for (int i = 0; i < list.size(); i++) { 129 if (list.get(i).equals("(")) { 130 return i; 131 } 132 } 133 return -1; 134 } 135 public int lastYouKuohao(List<String> list, int zuo) { 136 int zuoIndex = 1; 137 int youIndex = 0; 138 for (int i = zuo + 1; i < list.size(); i++) { 139 if (list.get(i).equals("(")) { 140 zuoIndex++; 141 } 142 if (list.get(i).equals(")")) { 143 youIndex++; 144 } 145 if (zuoIndex == youIndex) { 146 return i; 147 } 148 } 149 return -1; 150 } 151 public boolean checkFuhao(char a) { 152 if (a == '+' || a == '-' || a == '*' || a == '/' || a == '(' 153 || a == ')') { 154 return true; 155 } 156 return false; 157 } 158 159 public void addKuohao(List<String> list, String yunsuan, int zuo) { 160 list.add(zuo, yunsuan); 161 162 } 163 164 }
代码覆盖率:
结队照片:
psp:
PSP2.1 |
Personal Software Process Stages |
Estimated time(min) |
actual time(min) |
Planning |
计划 |
11 |
6 |
· Estimate |
估计这个任务需要多少时间 |
120 |
125 |
Development |
开发 |
70 |
90 |
· Analysis |
需求分析 (包括学习新技术) |
20 |
30 |
· Design Spec |
生成设计文档 |
4 |
5 |
· Design Review |
设计复审 |
10 |
5 |
· Coding Standard |
代码规范 |
4 |
5 |
· Design |
具体设计 |
20 |
25 |
· Coding |
具体编码 |
40 |
50 |
· Code Review |
代码复审 |
10 |
15 |
· Test |
测试(自我测试,修改代码,提交修改) |
10 |
15 |
Reporting |
报告 |
10 |
12 |
· |
测试报告 |
5 |
5 |
· |
计算工作量 |
3 |
5 |
· |
并提出过程改进计划 |
4 |
4 |
小结:
1.谢晓萍同学很耐心,遇到不会的问题会愿意花时间去自己百度并学习(例如,如何在eclipse上安装使用eclemma来测试代码覆盖率)。这点是我所欠缺的,两人结队编程起到了1+1>2的效果。
2.之前的java规范意识太弱,导致这次花了一些时间在重新模块化上,拖慢了整体进度。不过这也增加了我们的契合度,让我们合作更加顺利。