Soft_Job 板


LINE

※ 引述《shane87123 (陽光大肥宅)》之銘言: 先說在前面 雖然聽起來很幹話,但很多東西沒有標準答案 有時是合適度的問題,也可能是喜好(品味?)的問題 同一個題目,實際的 code 長得不一樣,可能也會用不同的方法處理 另外,除了資源豐富到人力充沛到不行的專案,以及幾乎沒有時程壓力 的專案(很多開源專案屬於後者),少有專案能把測試能做到真正完整 很多時候是取捨,花時間寫多少測試,能 cover 到最大的範圍 剩下的部分靠整合測試(包含自動與手動)來抓 經驗能讓人能更快做出效益更好的取捨 : 先說我對 Unit test 的看法:測試單元(可能是 function)的邏輯是否正確 : 常常會有一份 code 內其實呼叫了很多別份 code 的 function, : 舉例來說 : A() { : B(); : C(); : if (check) : D(); : } 在「unit test」的前提之下,A() 這個「單元」要怎麼被定義? - B() C() D() 的集合體? - 負責分派邏輯前往 B() C() D() 的 router? - A() 本身就做了一大堆事情,BCD 只是輔助? - 其他? 在不同的狀況下,該測的單元功能會完全不一樣 適合的可能做法也完全不同 例如說對於狀況1 - 也許該把那個 if 檢查丟進 D(),讓 A() 就只是依序呼叫三個其他人的傳聲筒 接著不測 A() 但認真測 B() C() D() - 沒有副作用可以,有副作用的話怎麼驗證副作用? 例如說對於狀況2 - 是不是該把 B / C / D 弄成變數傳進 A? - 沒在寫 C 不知道 C 能怎麼做,function pointer? - 或是有某種類似 router 定義的東西,然後測 router 功能? 例如說對於狀況3 - 全部 fake 是不是比較快? - 是不是該把這個 function 拆掉? - 誒,看到七層的 if else,真的覺得拆的掉嗎? - 誒,看到七層的 if else,真的覺得要伴他一生一世嗎? 其實「重構」是個很常該被考慮的選項。 但當然,重構有時是個繁重的工作,也不見得是最常被選擇的選項 這也是 TDD 曾經風行一時的一部分原因,因為腦袋正常的工程師走 TDD 會避免自己寫出「啊,這要能測會把測試寫的有夠屎」的 code 但走 TDD 也可能寫出「看得懂想測什麼,但邏輯怎麼會這樣切」的東西 另外自己經驗是通常測試難寫是跟資料有關 「某些時候」如果非常辛苦的把資料 IO 全部 mock 一層,後面會好做一點 例如之前看過 api 專案平常線上是戳 MySQL 拿資料 在跑測試的時候直接開一個 in memory 的 sqlite 來當後端 測試邏輯會先把資料塞好好再來跑測試 於是就可以測「拿文章的時候會把內文特定 tag 換成其他 table 的資料」 之類資料連結度高的東西 走這條路的話不 fake 直接把邏輯跑完也是個好選項了 或者不用全部 fake,可以只 fake 幾個 這大概不算是「單元」測試吧 但該測的有測到,而且在艱苦的工程之後可以輕鬆往上疊一堆其他測試 (但..如果沒有那麼多東西要測,這會不會太厚工?) 另外不同程式語言(或不同輔助函式庫?)的狀況會天差地北 例如上面的 A(),如果是 python 的話可能可以不改 code 直接用 patch() 把 B() C() D() 變成 mocker,會回傳需要的值 測試就直接檢查 B/C 是不是每次都被呼叫到 D() 是不是條件對的時候有呼叫到 因為 mock 容易寫,全部 fake 掉會變成更有吸引力的選項 所以回到原本的題目: 全部 fake 跟全部不要 fake,選哪邊? 我的回答是: 這兩個都是選項,但不是只有這兩個選項。 例如重構,例如在其他地方準備抽象資料層,也都是選擇。 甚至手上的專案也可能變出不同的把戲。 這些都是能打的牌,要看場上環境怎樣,再來取捨該打哪幾張。 -- 莉~娜~在~我~們~之~間~有~名~嗎~? 打倒了魔王大人,被那位大人附體之後平安無事地打倒了冥王大人 擊退了霸王大人,然後又打倒了魔王大人。 這種傢伙還不有名?魔族有那麼粗神經嗎?有那麼沒危機意識嗎? --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.166.60.66 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1667974776.A.0BC.html
1F:→ hackfox: 靠金燕,a.k.a姊姊 11/09 14:50
2F:推 FatFatPig: 推推 11/09 16:49
3F:推 t64141: 推,滿全面的分析 11/09 16:56
4F:推 Burwei: 推 11/09 19:41
5F:推 k7ji91ab5m: 推 說得很好 11/09 19:58
6F:推 markbex: 推 敝單位也是視情況測"服務"或是測"單一元件" 11/09 21:21
7F:推 viper9709: 推這篇 11/09 23:56
8F:推 sssyoyo: 推 11/10 08:48
9F:推 devilkool: 推這篇 11/10 09:18
※ 編輯: GALINE (218.166.49.121 臺灣), 11/10/2022 11:02:45
10F:推 strlen: 我一直認為當初業界一堆在洗風向要寫測試的主因之一 就是 11/10 14:14
11F:→ strlen: 要利用測試來強迫大家做好封裝與架構分離 11/10 14:15
12F:→ GALINE: 也許喔,但 TDD 最大問題是寫測試的人通常不控制 spec... 11/10 14:31
13F:推 NDark: 就跟 product owner 其實不是真正能決定事情的人一樣 11/10 17:23
14F:推 scottxxx666: 推 11/10 21:55
15F:→ akitoex: 推 11/10 22:58
16F:推 claymath: 推一下 11/11 00:20
17F:推 nec1002: 找本專業書籍k一下 11/15 15:12







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP