String strText = "910"; String strTextResult = "._.|_|..|.....|..|._.|.||_|";String strOutput = digitalSegment.DisplaySegmentDigital(strText);assertEquals(strOutput , strTextResult);
public String DisplaySegmentDigital(String strText) {return "._.|_|..|.....|..|._.|.||_|";}
String strText = "3456"; String strTextResult = "????????";git
問題接着出來了:這串問號該填什麼?這樣測試真的有意義麼?幾乎全部的人都直以爲發現這裏有問題。簡短的討論後,結論是應該測試每一個數字的顯示,而非一個字符串。因而,測試變爲:算法
String strText = "9"; String strTextResult = "._.|_|..|"; 框架
String strOutput = digitalSegment.DisplaySegmentDigital(strText); 函數
assertEquals(strOutput , strTextResult);單元測試
實現變爲:學習
public String DisplaySegmentDigital(String strText) {測試
if(strText == "9")spa
return "._.|_|..|";設計
else開發
return null;
}
實現後,接着測試:
strText = "1"; strTextResult = ".....|..|";
strOutput = digitalSegment.DisplaySegmentDigital(strText);
assertEquals(strOutput , strTextResult);
實現也變爲:
public String DisplaySegmentDigital(String strText) {
String[] strResult=new String[10];
strResult[0]="._.|.||_|";
strResult[1]=".....|..|";
strResult[9]="._.|_|..|";
return strResult[Integer.parseInt(strText)];
}
至此,很顯然咱們的算法也就天然而然的誕生了。可能與不少人本身開始的算法設計不太同樣,但也不該該差到哪裏:)。這就是TDD演進式設計。
但有個問題,._.|_|..|是什麼東東?我怎麼知道最終輸出是正確的。所以,咱們稍微改變了一下寫法:
String strText = "9"; String strTextResult = "._." +
"|_|" +
"..|";String strOutput = digitalSegment.DisplaySegmentDigital(strText);
assertEquals(strOutput , strTextResult);
strText = "1";
strTextResult = "..." +
"..|" +
"..|";
strOutput = digitalSegment.DisplaySegmentDigital(strText);
assertEquals(strOutput , strTextResult);
實現變爲:
public String DisplaySegmentDigital(String strText) {
String[] strResult=new String[10];
strResult[0]="._." +
"|.|" +
"|_|";
strResult[1]="..." +
"..|" +
"..|";
strResult[9]="._." +
"|_|" +
"..|";
return strResult[Integer.parseInt(strText)];
}
如今直觀多了。
爲何必定要變得直觀,其目的不單純是爲了程序的易讀性,更重要的是:測試不該該抄實現的代碼,實現也不要抄測試的代碼,不然後果很嚴重。寫測試代碼時,必須是含着測試的心態,含着使用者的心態去寫測試代碼,而非一門心思去想實現。若是這樣,TDD就失敗了。這也是爲何TDD要求先寫測試代碼,再寫實現代碼的緣由。由於咱們一旦先想到了實現,那麼接下來的測試,必然會跟着實現的邏輯走,從而違背「測試獨立性」的原則。實現發生錯誤,測試也沒法發現。
接下來須要整理一下代碼,顯然DisplaySegmentDigital這個函數名不是那麼準確,後來議論了一番,得出的名字是:GetDigitalDisplayContent。結束後,我想GetDigitalFont可能更好。
好了,有關第一次道場就寫到這裏,留一個小小的問題:到目前爲止咱們尚未設計顯示的算法。爲了便於輸出,目前的設計如何改進?