本文將介紹以下內容:
iOS開發中添加單元測試的方法。
如何寫單元測試用例及用例組。
介紹單元測試的一些基礎概念。
本篇作為重構的例子(想了解重構是什么,另參見他們總在說重構,不過是重寫 ),假設了一個視頻網站的電影點播系統,每次點擊播放就會收取費用,按電影種類不同,時段不同,則收費不同,最終計算出顧客的總消費,并計算積分。這個例子的類關系比較清晰易懂,用OC語言實現,iOS開發的童鞋看起來會比較親切,心急的童鞋可以跳過源碼部分,先看后面添加單元測試的部分準備測試工具,需要了解細節時再回頭看源碼。
系統包含一個電影類,顧客類,及點播類,類關系如下圖所示:
電影類
點播類:
點播類定義了點播行為,關心點播了什么電影,及點播的時段,這些都影響最終收取的費用。
顧客類
準備測試工具
這里選用的是XCTest,它是Xcode8中內置的測試框架,使用起來非常簡單,分以下兩種情況為項目添加測試:
1. 新建工程時添加單元測試:
2.為已有工程添加單元測試
Xcode8中添加的步驟與前幾代有所不同:
添加第一個測試
第一個測試是很重要的,它決定了我們后面測試的思路和方向,這里以需要什么測什么為指導原則,從結果出發,所以先來看下基本的點播需求:
工作日點播一部普通影片,收費2元,積一分。
根據以上需求描述,我們在RefactorDemoTests.m添加測試方法:
這個測試用例中,顧客“溪石”點播了一部老片《黑客帝國1》,由于是工作日,因此按原價收取,并積1分,詳細細節看Cutomer類源碼中的方法statement()。
按快捷鍵?U,運行測試,發現測試報錯了:
仔細檢查發現,statment()的實現中,總價與單位沒有空一格,斟酌后覺得還是空一格比較清晰,于是修改后,再次按快捷鍵?U運行測試,測試通過:
在單元測試中,綠色表示測試通過,紅色表示測試失敗,已經成為業界標準,XCTest遵循了這一規則。
測試用例組
通過第一個例子,我們知道了測試用例總是以test開頭,作為約定俗成,凡是test開頭的方法,都會被XCTest框架自動運行,下面我們添加對周末點播優惠的測試:
這個測試用例除了電影名稱不一樣外,只是將點播時段由工作日改為了周末,以此判斷計算規則是否正確。
這時,我們已經有兩個測試用例了,為了加快測試速度,打開Xcode左側第5項的測試導航面板,可以單獨指定一個用例運行,注意圖中標記處的圖標變化:
如此,我們可以將statement需要考慮的返回情況都寫成一個個都測試用例(這里就不一一列舉了,童鞋們可以自行實現,有問題可以評論中提出,雖然我不一定會回答),可以確保報表算法滿足全部需求。
單元測試和功能測試的差別
功能測試的目的是保證整個軟件包能正常工作,它面向的對象是客戶,保障軟件功能符合客戶的要求的質量,當然這類工作應該交由喜愛找bug的專業測試部門去處理,他們會用與開發截然不同的工具,并且不關心實現的細節(這就是你與測試人員老是話不投機的原因)。
而單元測試關注實現的細節,它的目標對象是一個類,一個方法,是我們開發人員用來驗證代碼是否有實現異常的工具,因此寫單元測試時總是尋找那些可能未處理的邊界。
測試循環
從上面的簡單用例中,我們能明顯看到以下通用步驟:
準備測試數據。
調用目標API
驗證輸出和行為
小結
本文通過一個電影點播系統的例子,演示了以下內容:
iOS開發中添加單元測試框架XCTest。
用test方法組織單元測試用例及用例組,即可統一運行,也可單獨運行。
介紹單元測試的一些基礎概念,了解單元測試的目標,及測試循環。