單元測試快速Q&A
單元測試各種疑難雜症簡單解答:
按我以閱讀全文>>
Q1:單元測試是個怎樣的測試
A1:確認測試方法使用到的程式碼是否可以在預期內運作的測試
Q2:單元測試最大好處是什麼?
A2:加速開發(你絕對沒有看錯)
Q3:單元測試第二大好處是什麼?
A3:想確認某特定小元件是否有正確執行
Q4:單元測試是種自動檢測執行結果回傳資料對錯的程式嗎?
A4:絕對不是,你把不回傳的函數放哪了
Q5:單元測試的覆蓋率100%真正含意是什麼?
A5:把所有不該是單元測試的全部ignore掉,其他都有被確實執行到,即覆蓋率100%
Q6:PHPUnit就是單元測試嗎?
A6:毫無關係,不過是個輔助小工具
Q7:傳說中先寫單元測試才開始開發,並且途中將逐漸增加覆蓋度,這是真的嗎?
A7:假的,我就不信你開發遇到障礙時不改架構,不改function,不改運作機制
A7-1:還有好多好多,合作開發需調整的部分,還有好多好多no return function
Q8:那麼什麼時候才該開始單元測試呢?
A8:做完一個小元件,而且這蠻重要,我想知道他是否能run
Q9:是否該斷言嚴格回傳格式以確保回傳資料符合預期?
A9:當你發現開發這玩意遠比開發原程式還要多上好幾倍CODE和時間時,就該醒醒了
Q10:為什麼不檢查外部呼叫,反而該設成ignore?
A10:因為如果出問題,應該是那個外部呼叫自身的unit test出現問題(極重要)
Q11:沒外部呼叫根本測不下去,可是好像很多依賴,該怎麼辦?
A11:Mock Object(前面文章有說明)
Q12:Mock了一小時多還是湊不出想要的結果怎辦?
A12:你瘋了嗎?趕快去開發其他專案吧
Q13:Private functoin不能測試怎辦?
A13:invoke
Q14:我該改寫原程式使其適合做單元測試嗎?
A14:這絕非單元測試的範圍
(註:如果是函數處理不夠獨立,偶合性太高,那確實該優化優化,可是這跟單元測試無關)
Q15:複雜邏輯和整合測試好難寫
A15:這該設成ignore的你居然會想去寫他
Q16:開發最有用的單元測試怎麼做?
A16:assert以後print_r
Q17:上線最有用的單元測試是什麼?
A17:assert Exception
Q18:剛才說主要是在測試"有沒有正確執行",是否可以舉個例子?
A18:單元測試精隨就在這裡,他看的是有沒有執行到你寫的Code
假設有一個用關鍵字搜尋資料的程式,且"找不到資料,會回傳空陣列"算正常
那麼,你只需要斷言一次任意關鍵字讓他執行,這樣就足夠了
絕不需要再分有結果的關鍵字和回傳空值的關鍵字,然後assert兩次
因為單元測試管的是有沒有執行到那行CODE,根本不管回傳值應該是多少
咳,怎麼還是紅字,因為還沒完
如果程式開頭直接寫"如果輸入是空關鍵字,則回傳空陣列"
那麼這還是要測兩次的,很明顯的這以下的行數都會全部沒測到,這點請自行看程式變通
結語:
在下認為unit test是必要的,也非常重要
但應該是要符合需求才去做的unit test
而不是按規定說什麼這東西應該要有幾款unit test否則等於缺陷之類的
尤其是合作開發的部分,有些東西啊就是常常會變動,這種還要硬塞unit test,根本無用
為什麼敢說上面這些,因為在下自己就是愛用者
其他不說,就這點我還是要說一下
"真覺得很簡單,請自己挑一個自認最複雜的案例開發個完整版單元測試看看"
如果可以短時間內搞出來,那我這篇Q&A隨時歡迎你幫忙改(自己改的才算,找別人案例我都可以找給你了)
如果不行,也不想做,請試著去理解這樣的經驗產生的結論
如果並非時間不足,卻有人對單元測試反感
我認為應該先看看是否理解不足,或作法本身就不對
因為,單元測試不過是拿來協助加速開發用的小流程,不應該本末倒置喧賓奪主
沒有留言:
張貼留言