(譯)對于Objective-C來說 Unit Testing的價值是什么?

對于Objective-C來說 Unit Testing的價值是什么?

最大的問題是“對于Objective-C來說 Unit Testing的價值是什么?”

服務端的小伙伴會Mock整個數據庫,僅僅為了測試一條類似于“Hello World” 的SQL語句。
在iOS中,你需要如此的仔細嗎?這大概是不需要的。
你需要將單元測試覆蓋到iOS項目中的每一行代碼嗎?這毫無疑問是不需要的。

那么,讓我們來看下,你應該怎樣決定你的測試計劃。

單元測試有兩個目的:

  • 首先也是最重要的(從我的觀點來說)它可以幫你保持類的小而精。
  • 其次,它可以為你提供自動化測試,這是非常有用的。

為什么我這么說?
如果你嘗試編寫一個類去通過某個API來獲取數據,你會從對它行為的一些猜測來開始開發。
使用這個類,會依賴這些假設。假如你過了幾個月忘記這些假設是什么,那么如果你更改了關于網絡請求的代碼,你很有可能在某個地方改變了之前的邏輯。這些可能發生在你毫不知情的情況下。

你應該通過手動還是自動去測試你的App?它并不意味著你需要將單元測試覆蓋整個APP,但是在發版本之前,你應該測試一些關鍵之處,那么為什么還要通過手動做這些呢而不選擇自動測試呢?

Matt Gemmell 曾經寫過“thou shalt suffer no bugs to ship”(發版時必須不要有任何Bug),我認為他說的很對,并且我也是這樣做的 。他也說到,無論你用哪種機制去保證在發版時沒有bug,你只是需要有一種方法。Unit Tests, UI Acceptance Tests, 或者所有的測試都通過手動解決(但是這將會花費大量時間)。 Unit Test 或者UAT更加迅速。

上面說的所有都是“對于Objective-C來說Unit Testing的價值是什么?”這個話題的開場白。
讓我們來思考一個好的架構的iOS app。它被劃分為三個部分: Model,View,Controller。

426D1328D1E744999A88979FAF12C2C2.png


我有說 three parts? 我的意思是 three-ish(暫時沒搞清楚什么意思??)。 App需要API 的調用,你也需要寫網絡請求的代碼。有的時候,代碼會從Model中分離,有時候也會包含在Model中,在可避免的情況下它應該從不包含在View中,或者包含在Controller中(這應該永遠是可避免的)。

View和Controller自檢的相互作用不利于單元測試— 這些地方UAT可以幫你解決這個問題。 這篇文章并不會涉及這些。

橙色的區域是單元測試最有作用的地方。Model和網絡請求代碼中。

你可以很容易的測試網絡請求代碼,去驗證你第一次寫它的時候關于它的假設。如果你的Model比較精煉,你可能不會去測試。然而,這些models可能在任何地方被創建和修改,所以,你應該確保測試這些代碼。

綜上所述:單元測試 Models 和網絡請求代碼。如果你覺得值得,那么用UAT去測試其他的。可能手動測試Views和Controllers更加適合你的工作,特別是在比較小型的app中。

最后,無論你用哪種測試,請記錄它,并且編成文檔。這樣你就可以在發版之前手動測試它了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,188評論 4 61
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,846評論 25 708
  • 近一個星期,我看簡書比較多,一來剛到了新的工作崗位,適應之余空閑時間也比較多,二來對于半年前的選擇結果扔存在一起惋...
    未知的你閱讀 1,528評論 0 0
  • 文 | 潘俊宏 在2006年夏天的某一天,一個年輕人去街上買冰棍。平時他都是買一塊錢一根的冰棍,那天也不知道什么原...
    潘俊宏閱讀 502評論 7 10