對于Objective-C來說 Unit Testing的價值是什么?
最大的問題是“對于Objective-C來說 Unit Testing的價值是什么比原?”
服務(wù)端的小伙伴會Mock整個數(shù)據(jù)庫仲义,僅僅為了測試一條類似于“Hello World” 的SQL語句踱葛。
在iOS中,你需要如此的仔細嗎光坝?這大概是不需要的尸诽。
你需要將單元測試覆蓋到iOS項目中的每一行代碼嗎?這毫無疑問是不需要的盯另。
那么性含,讓我們來看下,你應(yīng)該怎樣決定你的測試計劃鸳惯。
單元測試有兩個目的:
- 首先也是最重要的(從我的觀點來說)它可以幫你保持類的小而精商蕴。
- 其次,它可以為你提供自動化測試芝发,這是非常有用的绪商。
為什么我這么說?
如果你嘗試編寫一個類去通過某個API來獲取數(shù)據(jù)辅鲸,你會從對它行為的一些猜測來開始開發(fā)格郁。
使用這個類,會依賴這些假設(shè)独悴。假如你過了幾個月忘記這些假設(shè)是什么例书,那么如果你更改了關(guān)于網(wǎng)絡(luò)請求的代碼,你很有可能在某個地方改變了之前的邏輯刻炒。這些可能發(fā)生在你毫不知情的情況下决采。
你應(yīng)該通過手動還是自動去測試你的App?它并不意味著你需要將單元測試覆蓋整個APP坟奥,但是在發(fā)版本之前树瞭,你應(yīng)該測試一些關(guān)鍵之處,那么為什么還要通過手動做這些呢而不選擇自動測試呢爱谁?
Matt Gemmell 曾經(jīng)寫過“thou shalt suffer no bugs to ship”(發(fā)版時必須不要有任何Bug)晒喷,我認為他說的很對,并且我也是這樣做的 管行。他也說到厨埋,無論你用哪種機制去保證在發(fā)版時沒有bug,你只是需要有一種方法。Unit Tests荡陷, UI Acceptance Tests, 或者所有的測試都通過手動解決(但是這將會花費大量時間)雨效。 Unit Test 或者UAT更加迅速。
上面說的所有都是“對于Objective-C來說Unit Testing的價值是什么废赞?”這個話題的開場白徽龟。
讓我們來思考一個好的架構(gòu)的iOS app。它被劃分為三個部分: Model唉地,View据悔,Controller。
我有說 three parts耘沼? 我的意思是 three-ish(暫時沒搞清楚什么意思??)极颓。 App需要API 的調(diào)用,你也需要寫網(wǎng)絡(luò)請求的代碼群嗤。有的時候菠隆,代碼會從Model中分離,有時候也會包含在Model中狂秘,在可避免的情況下它應(yīng)該從不包含在View中骇径,或者包含在Controller中(這應(yīng)該永遠是可避免的)。
View和Controller自檢的相互作用不利于單元測試— 這些地方UAT可以幫你解決這個問題者春。 這篇文章并不會涉及這些破衔。
橙色的區(qū)域是單元測試最有作用的地方。Model和網(wǎng)絡(luò)請求代碼中钱烟。
你可以很容易的測試網(wǎng)絡(luò)請求代碼晰筛,去驗證你第一次寫它的時候關(guān)于它的假設(shè)。如果你的Model比較精煉忠售,你可能不會去測試传惠。然而,這些models可能在任何地方被創(chuàng)建和修改稻扬,所以,你應(yīng)該確保測試這些代碼羊瘩。
綜上所述:單元測試 Models 和網(wǎng)絡(luò)請求代碼泰佳。如果你覺得值得,那么用UAT去測試其他的尘吗∈潘可能手動測試Views和Controllers更加適合你的工作,特別是在比較小型的app中睬捶。
最后黔宛,無論你用哪種測試,請記錄它擒贸,并且編成文檔臀晃。這樣你就可以在發(fā)版之前手動測試它了觉渴。