201421123003 黃建英 201421123004 黃美海
a.需求分析:
1.把計算子產品提取出來單獨建立一個類
2.通過單元測試代碼,測試加減乘除功能
3.通過單元測試代碼,測試計算類對于各種參數的支援:
a.輸入是有錯誤的,例如 “1 ++ 2”,
b.在數值範圍是 -1000 .. 1000 的時候,傳進去 “10000 + 32768”,
c. 或者是 “ 248 / 0” 怎麼辦?
b.設計測試架構, 模拟測試數:(項目以java語言進行開發,使用junit4進行測試)
1.整數的加減乘除功能測試

問題及解決
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/