結對編程之附加題:單元測試
201421122079 林仙平 201421122076 陳俊達
需求:
1.測試加減是否正確
2.測試加減乘除功能
3.測試計算類對各種參數的支持
4.通過增量修改的方式,改進程序
測試準備:
先建好一個項目,把原來項目的計算類導進來,(要做成GUI時也是直接拷過去的),再在計算方法的每個節點添加輸出查看測試過程中每個小模塊的數據是否正確,這樣輸出的過程就知道測試用例經過多少代碼,如:
輸入表達式為:1*15*15
去括號後:1*15*15
循環去乘號:15*15
循環去乘號:225
最後結果為:225
就表示經過一次去括號循環模塊、兩次乘法計算模塊、沒有經過加減運算
代碼截圖:
測試:
簡單加法: 簡單減法:
加減括號混合: 簡單乘除:
加減乘除括號混合:
這裏第二個測試表達式在第二步進行乘法運算時出錯了,由於方法復雜,用斷點的排錯誤太麻煩,所以在關鍵代碼段添加輸出來查看分析錯誤原因:
看結果是乘法前面的數取錯了,15只取到各位數5,更改後代碼結果:
討論照片:
小結和感受:
在第一次四則運算作業中給各個功能模塊寫在單獨的一個類裏面,所以這次把這個類拷過來就可以用了,所以給功能分詳細的模塊在以後更改項目上非常方便,添加修改模塊需要的改動比較小。
還好當時寫計算模塊時候花時間加上註釋,不然重新理一遍算法的邏輯肯定是一件相當蛋疼的事情,還有就是但是敲完計算模塊後,只是做了簡單的測試,沒有覆蓋到所有情況,所以有些小錯誤沒有及時發現,在這次測試中才發現並修改了錯誤。
關於代碼規範,這次體會不是很深,因為方法跟參數並不多,不管取名規範還是怎樣,不看名字就能知道是什麽方法或者幹嘛的,當然,這次看代碼跟上次間隔時間並不長,如果過個一兩年再重新看自己的 代碼規範取名的作用可能就會感受出來了,因為過個一兩年後看自己寫的代碼相當於看別人寫的代碼,所以規範名字還是很重要的啊,註釋也是必須的。
還有就是但是敲完計算模塊後,只是做了簡單的測試,沒有覆蓋到所有情況,所以有些小錯誤沒有及時發現,在這次測試中才發現並修改了錯誤。
PSP
coding地址
https://coding.net/u/lxp2017/p/coding/git/tree/master/ 下的CountTest是整個測試的項目
代碼展示:
public class CountExp { //計算表達式答案 public static String countAnswer(String exp) { int result = 0; int a1 = 0, a2 = 0; int b = 0;// 為0說明符號後面的數為負數,1 為正數 int bb = 0;// 符號後面的數字長度-1 int w = 0;// w用來表示符號前面打數字打位數-1 int ww = 0;// ww為0說明算術符號前面的數是正數,為1說明是負數 String exp1 = "";// 接收去括號後的表達式 String exp2 = "";// 接收去乘除號後打表達式 String exp3 = "";// 用來接收分數 //第一個模塊 // 去括號 System.out.println("輸入表達式為:"+exp); for (int i = 0; i < exp.length(); i++) { if (exp.charAt(i) == ‘(‘) { int i1 = 0; int i2 = 0; // 判斷算術符號前面的數是否多位 if (exp.charAt(i + 2) != ‘-‘ && exp.charAt(i + 2) != ‘+‘) { i1 = i1 + 1; if (exp.charAt(i + 3) != ‘-‘ && exp.charAt(i + 3) != ‘+‘) i1 = i1 + 1; } // 判斷算術符號後面的數是否多位 if (exp.charAt(i + i1 + 4) != ‘)‘) { i2 = i2 + 1; if (exp.length() > (i + i1 + 5) && exp.charAt(i + i1 + 5) != ‘)‘) i2 = i2 + 1; } a1 = Integer.parseInt(exp.substring(i + 1, i + 2 + i1)); a2 = Integer.parseInt(exp .substring(i + 3 + i1, i + 4 + i1 + i2)); if (exp.charAt(i + 2+i1) == ‘+‘) exp1 = exp1 + (a1 + a2); else exp1 = exp1 + (a1 - a2); i = i + 4 + i1 + i2; } else exp1 = exp1 + exp.charAt(i); } System.out.println("去括號後:"+exp1); //第二個小模塊 // 循環先算公式裏的乘跟除 for (int j = 0; j < exp1.length(); j++) { if (exp1.charAt(j) == ‘*‘) { w = 0;// w用來表示符號前面打數字的位數-1 ww = 0;// ww為0說明算術符號前面的數是正數,為1說明是負數 if ((j - 2) >= 0 && exp1.charAt(j - 2) != ‘-‘ && exp1.charAt(j - 2) != ‘+‘ && exp1.charAt(j - 2) != ‘*‘ && exp1.charAt(j - 2) != ‘÷‘) { w = w + 1; if ((j - 2 - w) >= 0 && exp1.charAt(j - 2 - w) != ‘-‘ && exp1.charAt(j - 2 - w) != ‘+‘ && exp1.charAt(j - 2) != ‘*‘ && exp1.charAt(j - 2) != ‘÷‘) w = w + 1; } if ((j - 2 - w) > 0 && exp1.charAt(j - 2 - w) == ‘-‘ && ((j - 3 - w) > 0 && exp1.charAt(j - 3 - w) == ‘-‘ || (exp1 .charAt(j - 3 - w) == ‘+‘))) ww = ww + 1; a1 = Integer.parseInt(exp1.substring(j - w - 1, j)); if (ww == 1) a1 = 0 - a1; b = 0;// 為0說明符號後面的數為負數,1 為正數 bb = 0;// 符號後面的數字長度-1 // 判斷算術符號後面的數是否是負數 if (exp1.charAt(j + 1) == ‘-‘) b = b + 1; // 判斷算術符號後面的數是否多余一位 if (exp1.length() > (j + 2 + b) && (exp1.charAt(j + 2 + b) != ‘-‘ && exp1.charAt(j + 2 + b) != ‘+‘ && exp1.charAt(j + 2 + b) != ‘*‘ && exp1 .charAt(j + 2 + b) != ‘÷‘)) { bb = bb + 1; if (exp1.length() > (j + 3 + b) && (exp1.charAt(j + 3 + b) != ‘-‘ && exp1.charAt(j + 3 + b) != ‘+‘ && exp1.charAt(j + 3 + b) != ‘*‘ && exp1 .charAt(j + 3 + b) != ‘÷‘)) bb = bb + 1; } a2 = Integer .parseInt(exp1.substring(j + 1 + b, j + 2 + b + bb)); if (b == 1) a2 = 0 - a2; exp2 = exp2.substring(0, j - 1 - w - ww); exp2 = exp2 + (a1 * a2); exp2 = exp2 + exp1.substring(j + 2 + b + bb, exp1.length()); exp1 = exp2; exp2 = ""; j = -1; System.out.println("循環去乘號:"+exp1); continue; } else if (exp1.charAt(j) == ‘÷‘) {// 遇到除號 ,則進行除法運算,結果為分數 w = 0;// w用來表示符號前面打數字打位數-1 ww = 0;// ww為0說明算術符號前面的數是正數,為1說明是負數 if ((j - 2) > 0 && exp1.charAt(j - 2) != ‘-‘ && exp1.charAt(j - 2) != ‘+‘) { w = w + 1; if (exp1.charAt(j - 2 - w) != ‘-‘ && exp1.charAt(j - 2 - w) != ‘+‘) w = w + 1; } if ((j - 2 - w) > 0 && exp1.charAt(j - 2 - w) == ‘-‘ && (exp1.charAt(j - 3 - w) == ‘-‘ || (exp1.charAt(j - 3 - w) == ‘+‘))) ww = ww + 1; a1 = Integer.parseInt(exp1.substring(j - w - 1, j)); b = 0;// 為0說明符號後面的數為負數,1 為正數 bb = 0;// 符號後面的數字長度-1 // 判斷算術符號後面的數是否是負數 if (exp1.charAt(j + 1) == ‘-‘) b = b + 1; // 判斷算術符號後面的數是否多余一位 if (exp1.length() > (j + 2 + b) && (exp1.charAt(j + 2 + b) != ‘-‘ && exp1.charAt(j + 2 + b) != ‘+‘ && exp1.charAt(j + 2 + b) != ‘*‘ && exp1 .charAt(j + 2 + b) != ‘÷‘)) { bb = bb + 1; if (exp1.length() > (j + 3 + b) && (exp1.charAt(j + 3 + b) != ‘-‘ && exp1.charAt(j + 3 + b) != ‘+‘ && exp1.charAt(j + 3 + b) != ‘*‘ && exp1 .charAt(j + 3 + b) != ‘÷‘)) bb = bb + 1; } a2 = Integer .parseInt(exp1.substring(j + 1 + b, j + 2 + b + bb)); if (a1 % a2 == 0) { exp2 = "" + (a1 / a2); return exp2; } else if (a1 < a2) { exp2 = "" + a1 + "/" + a2; return exp2; } else { int e1 = a1 / a2; int e2 = a1 - a2 * e1; exp2 = "" + e1 + "’" + e2 + "/" + a2; System.out.println("進行除法運算後:"+exp2); return exp2; } } else exp2 = exp2 + exp1.charAt(j); } int fs = 10;// 用來記錄表達式括號的位置 //第三個小模塊 // 進行加減運算 for (int xx = 0; xx < exp2.length(); xx++) { if (exp2.charAt(xx) == ‘/‘) fs = xx; } int aa = 0;// 用來暫a1,a2的值 if (fs == 10) { for (int fss = 1; fss < exp2.length(); fss++) { if (exp2.charAt(fss) == ‘+‘) { b = 0;// 符號後面的數字長度-1 bb = 0;// 為0說明符號後面的數為負數,1 為正數 w = 0;// w用來表示符號前面打數字打位數-1 ww = 0;// ww為0說明算術符號前面的數是正數,為1說明是負數 if (exp2.charAt(0) == ‘-‘) bb = bb + 1; b = fss - bb; a1 = Integer.parseInt(exp2.substring(0, fss)); if ((fss + 2) < exp2.length() && exp2.charAt(fss + 2) != ‘+‘ && exp2.charAt(fss + 2) != ‘-‘) { w = w + 1; if ((fss + 3) < exp2.length() && exp2.charAt(fss + 3) != ‘+‘ && exp2.charAt(fss + 3) != ‘-‘) { w = w + 1; if ((fss + 4) < exp2.length() && exp2.charAt(fss + 4) != ‘+‘ && exp2.charAt(fss + 4) != ‘-‘) { w = w + 1; } } } a2 = Integer.parseInt(exp2.substring(fss + 1, fss + 2 + ww + w)); exp2 = (a2 + a1) + exp2.substring(fss + 2 + w + ww, exp2.length()); fss = 0; System.out.println("循環一次去加減:"+exp2); if (exp.length() < 2) break; } else if (exp2.charAt(fss) == ‘-‘) { if ((fss < exp.length()) && exp2.charAt(fss) == ‘-‘) { b = 0;// 符號後面的數字長度-1 bb = 0;// 為0說明符號後面的數為負數,1 為正數 w = 0;// w用來表示符號前面打數字打位數-1 ww = 0;// ww為0說明算術符號前面的數是正數,為1說明是負數 if (exp2.charAt(0) == ‘-‘) bb = bb + 1; b = fss - bb; a1 = Integer.parseInt(exp2.substring(0, fss)); if (exp2.charAt(fss + 1) == ‘-‘) ww = ww + 1; if ((fss + 2 + ww) < exp2.length() && exp2.charAt(fss + 2 + ww) != ‘+‘ && exp2.charAt(fss + 2 + ww) != ‘-‘) { w = w + 1; if ((fss + 3 + ww) < exp2.length() && exp2.charAt(fss + 3 + ww) != ‘+‘ && exp2.charAt(fss + 3 + ww) != ‘-‘) w = w + 1; } a2 = Integer.parseInt(exp2.substring(fss + 1 + ww, fss + 2 + ww + w)); exp2 = (a1 - a2) + exp2.substring(fss + 2 + w + ww, exp2.length()); fss = 0; System.out.println("循環一次去加減:"+exp2); if (exp.length() < 2) break; } } } } return exp2; } }
結對編程之附加題:單元測試