Re: [討論] Unit test 的撰寫請益
※ 引述《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,選哪邊?
我的回答是:
這兩個都是選項,但不是只有這兩個選項。
例如重構,例如在其他地方準備抽象資料層,也都是選擇。
甚至手上的專案也可能變出不同的把戲。
這些都是能打的牌,要看場上環境怎樣,再來取捨該打哪幾張。
--
莉~娜~在~我~們~之~間~有~名~嗎~?
打倒了魔王大人,被那位大人附體之後平安無事地打倒了冥王大人
擊退了霸王大人,然後又打倒了魔王大人。
這種傢伙還不有名?魔族有那麼粗神經嗎?有那麼沒危機意識嗎?
--
靠金燕,a.k.a姊姊
推推
推,滿全面的分析
推
推 說得很好
推 敝單位也是視情況測"服務"或是測"單一元件"
推這篇
推
推這篇
我一直認為當初業界一堆在洗風向要寫測試的主因之一 就是
要利用測試來強迫大家做好封裝與架構分離
也許喔,但 TDD 最大問題是寫測試的人通常不控制 spec...
就跟 product owner 其實不是真正能決定事情的人一樣
推
推
推一下
找本專業書籍k一下
33
先說結論,先都不要寫。 Legacy system 要先補大範圍的 integration test,確定整體的行為是對的。 如果 code 沒有要再改,不用補細部 unit tests。 原因是因為,原本 API 可能因為設計不良,導致無法寫 unit test 得先 refactor 才有辦法讓它變成 testable,這情況就要先 refactor 再補 UT11
大家都選1嗎?我覺得二比較好 Google的guideline是Prefer Realism Over Isolation 詳見 TotT有關fakes的討論也提到16
首Po先說我對 Unit test 的看法:測試單元(可能是 function)的邏輯是否正確 好,進入正題 小弟最近剛工作,稍微讀了一下負責的 project 的程式碼後, 要開始開發 Unit test。 現況是,各個 file (.c) dependency 很重,
爆
Re: [閒聊] 日本大學迎新都這麼淫亂的嗎= =(原文按錯發成新的,這裡重發) (原文恕刪,手機排版請見諒) (這件事算不算迎新...當時邀請的人說的是「新入生歓迎会」, 所以雖然我覺得實際不是,但姑且算符合主題) 三年前來日本讀書,但因為台日學期是相反的(日本四月才是第一學期),我大二才參加爆
[Vtub] 「我是前VT事務所工作人員 有想問的嗎?」「我是前VT事務所工作人員 有想問的嗎?」 基本上這篇就5CH轉錄,把他當八卦看待就可以了,其中幾分真幾分假就請自行判斷。 Q:感覺這種受歡迎的新興產業就很黑心企業的樣子 A:真的很黑心,然後經紀人的待遇比我們工作人員更黑心爆
Re: [無言] 你會寫慎重的慎嗎?不只茴香豆的茴有四種寫法,很多人名裡常見的字也有各種不同的寫法 曾經在支付公司審過客戶資料的忍不住想分享一下 真的有很多很讓人困擾的異體字,我工作之前從來不知道 但話要先說在前面,異體字雖然意思相同,但既然叫異體了就是不同的字,不論是在商業 上核對客戶個資還是行政上的戶籍資料等,不同字就真的是不同字,是真的不能通過,這爆
Re: [討論] 「遊戲翻譯」是怎樣的工作啊?原文恕刪 大家好,我是遊戲翻譯資歷大概8年,不算資淺但也不敢說資深的譯者。 先前在西洽PO過幾次文,但主要是和配音有關,但其實遊戲文本翻譯才是主要收入。 之前在台灣暴雪待過快五年,做過在地化、配音和發行的職務,現在自己出來開公司 「牛灣娛樂」,主要也是接遊戲在地化的工作,然後有用在地化賺來的錢開發獨立遊戲爆
Re: [分享] 俄軍空軍作戰失利的可能原因這篇有幾個切入點還滿有趣的,就文中的概念幫您補充,也算是拋出一個小小的概念讓板友 們思考: 策劃甚或執行一個大規模空對面/對空的作戰計畫,能讓人從一些眉角窺視到這支空中武力 是不是真的有能力在一個時段內將他毀滅性的空中武力付諸打擊。 一整個OCA(Offensive Counter Air)的架構基本上圍繞著Sweep/escort/surface attack/S67
Re: [請益] 接手外包商的code沒交接也沒人可以問我的第一份跟第二份工作都是這個樣子,一開始你會像麻痺的人,給你幾個建議 1. 掌握啟動前的入口 - 大部分程式語言都會有一個從作業系統下命令開始執行 的進入點,可能會載入 config、環境變數、命令參數這些東西,你要先清楚 這些東西的配置意義是什麼。 2. 掌握啟動後的入口 - 如果是 server 或常駐程式,在執行階段就會有監聽行為。27
Re: [討論] 怎麼跟自以為是的同事相處提供一點不一樣的看法 ※ 引述《leo5916267 (封膜獵人)》之銘言: : 也許在軟體也蠻容易遇到類似個性的同事 : 我們是新創公司,我進去前已就有一個前端工程師,他從0建構了整個產品A 代表他能力不算差21
Re: [討論] 重構跟kpi的考量如果 A, B 都沒有任何 tests,建議不要動他。 幫 C 實做這個功能的時候,把 unit test 寫好寫滿,確保 C 是對的 行有餘力,針對 A, B 的使用情境也加上 test case,確保未來在 A, B 確實能重用 (這點很重要,否則很容易程式長得很像你以為可以重用,實際上根本不能) 就先做到這樣就好,確保 C 的品質,同時你獲得了高品質的 reusable 模組