文章出處

5.2

一、完善5.1。因為趕放假,有同學反映作業5.1的提交時間比較緊張,所以這周大家首先完善5.1即第一階段,必須要有測試用例。

二、本周完成第二三四階段(見虛線下描述)。整個作業5是要求更換結對對友的。

三、在作業2 結對四則運算(http://www.cnblogs.com/MissDu/p/4384230.html)中,要求每對學生選取 8 個可擴展方向中的 4個加以實現。

現在各組可以另選兩個沒有實現的方向,嘗試TDD測試驅動開發。

資料參考:

測試驅動開發的寶典-TTD http://wenku.baidu.com/view/eba583a1284ac850ad024267.html?re=view  

測試驅動開發——多幣種示例 http://wenku.baidu.com/link?url=h0UwhA6bnNDBPQfcg7cv7soWd2gfZH-vmKvgSBWvV25LEjjRioZn-25gg1GZ7m7HXACDK6Njj-KN-rozjdL-1hznqdYgJ0PlvQSr841eAN_

測試驅動開發(TDD)實戰 視頻 http://www.infoq.com/cn/presentations/zxq-tdd/

 

四、截止時間:2015年5月8日晚七點。

 

 

 

 

雖然作業有點難,但死活都要做。

當我們跨越了一座高山 也就跨越了一個真實的自己。

                                           ——汪國真

讓我們應用軟件工程的一個重要思想來做作業——“分而治之”。

這周大家先完成:

1.第一階段目標 - 把計算的功能封裝成類。(具體要求見虛線下)

   助教的作業提示:http://www.cnblogs.com/greyzeng/p/4465197.html

2.設計測試用例:用白盒與黑盒測試設計技術,為計算核心設計測試用例。

   白盒法黑盒法參見課件。

3.在實驗環境中(如MyEclipse集成開發環境+Junit測試框架)運行測試用例,分析測試結果,找出程序問題,給出改進前后的代碼對照。

單元測試參見:

http://www.cnblogs.com/greyzeng/p/4439080.html

http://www.cnblogs.com/greyzeng/p/4443160.html

Junit教程參見:http://pan.baidu.com/s/1qWsaMVM

 

提交博客時標題注明5.1。

截止時間:2015年4月30晚7點。

溫馨提醒:“注意交作業的時候與質量。”——鄒老師

 

------------------------------------------------------------------------------------

 

大家寫了不少四則運算的練習,這些代碼都各有特色,大家寫的 “軟件” 也有一定的用處。 如果我們要把這個功能放到不同的環境中去 (例如,命令行,windows 圖形界面程序,網頁程序,手機App), 就會碰到困難, 因為目前代碼的普遍問題是代碼都散落在main() 函數或者其他子函數中,我們很難把這些功能完整地剝離出來,作為一個獨立的模塊滿足不同的需求。

我們看到,不同的代碼解決不同層面的問題,有些是內部數據的計算 (例如四則運算);有些是和用戶輸入相關的 (例如 scanf,cin,圖形界面的輸入字段),有些是和數據的展現相關的 (例如 printf ,cout,println),有些是和程序所在平臺的架構相關的(例如 main 函數,并不是所有的程序都需要某個特定格式的main)。 這就需要我們對軟件的架構做一些整理和優化。

所以,接下來我們要做的是:

在我們第三次練習中,還是采用結對編程的方式 ,但是大家必須換一個隊友,我們會了解到模塊化編程,信息隱藏,接口設計,TDD,等。

大家把四則運算的計算功能包裝在一個模塊中 (這個模塊可以是一個類 Class, 一個DLL,等等), 為了方便起見,我們叫它 “計算核心” 模塊, 這個模塊至少在兩個地方可以使用:

  • 測試程序,這個可以是一個命令行的程序,或者是JUnit 的框架,或者是Visual Studio 單元測試的框架。這樣,我們在算法層級保證了這個模塊的正確性。

  • 實際的軟件,這是交付給最終用戶的軟件,有一定的界面和必要的輔助功能。

那么這個“計算核心”模塊和使用它的其他模塊之間是什么關系呢? 它們要通過一定的API (Application Programming Interface) 來和其他模塊交流。 這個API 接口應該怎么設計呢(有經驗和實力的童鞋可以考慮一下)? 為了簡單,我們可以從下面的最簡單的接口開始:

        Calc()

這個Calc 函數接受字符串的輸入(字符串里就是運算式子,例如 “ 5+3.5“, “7/8 – 3/8 ”, “3 + 90 * (-0.3)“ 等等),這個模塊的返回值是一個字符串,例如,前面幾個例子的結果就是 ( ”17.5“, “ 1/2”, “-24“).

假設我們用的是類,我們的測試程序剛開始可以是非常簡單的測試例子: (用偽代碼表示)

        String  result  = Core.Calc(“1 + 1”) ;

        Assert ( result == “2”);  //我們斷言 1 + 1 的結果一定是 2.

然后同學們實現自己 Core 的這個功能。

第一階段目標 - 能把計算的功能封裝起來,通過測試程序和API 接口測試其簡單的加法功能。

加法成功之后,然后我們再做減法, 乘法,除法,我們假設目前為止都是兩個操作數的運算,還是很容易實現的。 由于同學們已經在自己以前的程序中實現了各種算法,這時候只要把實現的算法搬過來就好了。 大家可以不斷增加測試的數量,在每實現一個新的功能的時候,要保證以前運行正確的例子繼續是正確的, 通過這樣的 “回歸測試“, 來保證自己實現的函數一直是正確的。 (請看書中關于單元測試,回歸測試的內容)

第二階段目標 - 通過測試程序和API 接口測試其簡單的加減乘除功能。并能看到代碼覆蓋率。

對于多個運算符的運算,帶負數的運算,我們這個模塊有一些參數要設置,例如,最多幾個運算符,數據范圍是多少,還要設置計算的精度(保留幾位小數,等等), 這是由什么API 來決定呢? 我們可以擴展 Calc() 的定義,讓它接受一個新的參數 “precision”, 或者我們可以啟用一個新的函數 Setting()。如果我想表示:

  • 最多4 個運算符

  • 數值范圍是 -1000 到 1000

  • 精度是小數點后兩位

怎么通過API 告訴我們的模塊呢? 我們當然可以用函數的參數直接傳遞,但是參數的組合很多,怎么定義好參數的規范呢? 建議大家考慮用 XML 來傳遞這些參數(實際就是在XML定義好規則,然后程序讀取XML規則來執行計算)。

增加了新的Setting() 函數之后,我們要讓模塊支持這樣的參數,同時,還要保證原來的各個測試用例繼續正確地工作。

第三階段目標 - 通過測試程序和API 接口測試對于各種參數的支持。并能看到代碼覆蓋率。

這個時候,如果輸入是有錯誤的,例如 “1 ++ 2”, 在數值范圍是 -1000 .. 1000 的時候,傳進去 “10000 + 32768”, 或者是 “ 248 / 0” 怎么辦? 怎么告訴函數的調用者 “你錯了”? 把返回的字符串定義為 “-1” 來表示? 那么如果真的計算結果是 “-1” 又怎么處理呢?

建議這個時候,我們要定義各種異常 (Exception), 讓 Core 在碰到各種異常情況的時候,能告訴調用者 - 你錯了! 當然,這個時候,我們同樣要進行下面的增量修改:

  • 定義要增加什么功能 - 例如:支持 “運算式子格式錯誤” 異常

  • 寫好測試用例,傳進去一個錯誤的式子,期望能捕獲這個 異常。 如果沒有,那測試就報錯。

  • 在 Core 模塊中實現這個功能

  • 測試這個功能

  • 同時測試所有以前的功能,保證以前的功能還能繼續工作 (沒有 regression)

  • 確認功能完成,繼續下一個功能

第四階段目標 - 通過增量修改改進程序, 完成對各種錯誤情況的處理。

參考資料:

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()