[討論] Unit test 的撰寫請益

看板Soft_Job作者 (陽光大肥宅)時間1年前 (2022/11/08 18:51), 1年前編輯推噓16(16025)
留言41則, 22人參與, 1年前最新討論串1/4 (看更多)
先說我對 Unit test 的看法:測試單元(可能是 function)的邏輯是否正確 好,進入正題 小弟最近剛工作,稍微讀了一下負責的 project 的程式碼後, 要開始開發 Unit test。 現況是,各個 file (.c) dependency 很重, 常常會有一份 code 內其實呼叫了很多別份 code 的 function, 舉例來說 A() { B(); C(); if (check) D(); } 族繁不及備載, 而我目前設計有兩個方向, 1. 將 B() C() D() 全部 fake ,單純去測試 A() 的邏輯是否正確 這樣做感覺上會比較單純,一個 test case 只去 test A(), 而且不需要去 include B() C() D() 的 header, 這樣一來 build 起來也比較容易,因為 include 那些 header 又會 dependency 到其他檔 情況會非常複雜 缺點是 coverage 比較差,B() C() D()要額外去寫 test case 2. 直接把他們 include 進來,build failed 就 include,直到 build 過為止 這樣的好處是不用去實作 B() C() D() 的 fake, 但就會讓整個 unit test 的 dependency 很重 個人偏向1.,畢竟 unit test 就是去測試 function 的邏輯性, 在其他 function 對測試 function 沒有 side effect 的情況下(如不會改變某變數的值? 將他們 fake 掉而只是單純的去 test 該 function 而已 但我第一次接觸,不太知道何時應該去 fake (或 mock) 一個 function QQ 我只是有這兩種想法,兩個其實天差地遠XDD -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.70.74 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1667904696.A.B26.html

11/08 18:53, 1年前 , 1F
你可以先讀重構相關的書
11/08 18:53, 1F

11/08 19:12, 1年前 , 2F
如果模組化有做好,那你1.做得是正確的事情。正常來
11/08 19:12, 2F

11/08 19:12, 1年前 , 3F
說就是Function跟Process分開測,最後再來個整合測試
11/08 19:12, 3F

11/08 19:12, 1年前 , 4F
。然後不要抗拒為各別Function寫Unittest
11/08 19:12, 4F
我本來預期就是為個別檔案的個別function寫unit test,不過不確定這樣做是不是有符合u nit test的特性

11/08 19:15, 1年前 , 5F
單元測試的話1
11/08 19:15, 5F

11/08 19:22, 1年前 , 6F
用1吧,如果要測試的function長文章那樣,那本來就應該
11/08 19:22, 6F

11/08 19:22, 1年前 , 7F
花時間寫BCD的test case
11/08 19:22, 7F
謝謝各位大大,那我可以放心去fake了

11/08 19:28, 1年前 , 8F
不知道你用什麼語言,通常會有tool幫你攔截dep的function
11/08 19:28, 8F

11/08 19:28, 1年前 , 9F
然後去呼叫對應的fake function
11/08 19:28, 9F
應是用google test,沒錯,他可以去呼叫fake function。這部分的實作應該沒什麼問題

11/08 20:14, 1年前 , 10F
對了 不寫這個測試會怎樣?
11/08 20:14, 10F
※ 編輯: shane87123 (114.25.70.74 臺灣), 11/08/2022 20:15:55

11/08 21:14, 1年前 , 11F
合起來測也是種測法,只是那就不是unit test了
11/08 21:14, 11F

11/08 21:24, 1年前 , 12F
專案如果沒有在切介面,直接硬fake會寫到懷疑人生
11/08 21:24, 12F

11/08 22:41, 1年前 , 13F
gmock 就是1啊
11/08 22:41, 13F

11/08 22:42, 1年前 , 14F
gmock gtest框架都有了,你想得到的問題大公司都想到了
11/08 22:42, 14F

11/08 22:42, 1年前 , 15F
,直接整套拿去用就好
11/08 22:42, 15F

11/08 23:01, 1年前 , 16F
沒切介面就趕快 refactor 沒測試的軟體能跑嗎
11/08 23:01, 16F

11/08 23:51, 1年前 , 17F
1
11/08 23:51, 17F

11/08 23:57, 1年前 , 18F
推二樓
11/08 23:57, 18F

11/09 00:00, 1年前 , 19F
沒出問題的 legacy code 就別想著幫別人加 UT 了,頂多
11/09 00:00, 19F

11/09 00:00, 1年前 , 20F
做做整合測試,別把自己搞到懷疑人生
11/09 00:00, 20F

11/09 00:17, 1年前 , 21F
不確定目前程式的情況, 假如目前程式很亂, 有可能需要先
11/09 00:17, 21F

11/09 00:17, 1年前 , 22F
做 2 快速加個整合測試, 重構一下, 之後再做 1
11/09 00:17, 22F

11/09 01:07, 1年前 , 23F
介面切好 弄懂IoC、DI做mock很快 UT也方便
11/09 01:07, 23F

11/09 01:08, 1年前 , 24F
舊的可以用防腐層切開 弄整合測試就好
11/09 01:08, 24F

11/09 02:21, 1年前 , 25F
雖我單元測試沒啥經驗,但說真的就是程式太鳥才依賴性
11/09 02:21, 25F

11/09 02:21, 1年前 , 26F
太高,相信用物件導向或設計模式都可以切乾淨的
11/09 02:21, 26F

11/09 07:22, 1年前 , 27F
只會更糟吧XDDD
11/09 07:22, 27F

11/09 08:53, 1年前 , 28F
如果BCD沒有被其他函式使用,直接用真的BCD測也無妨
11/09 08:53, 28F

11/09 12:10, 1年前 , 29F
2不算UT,但是你在refactor前可能會寫出2那樣的情況
11/09 12:10, 29F

11/09 12:12, 1年前 , 30F
最好先用test framework測整合測試再來refactor
11/09 12:12, 30F

11/09 15:23, 1年前 , 31F
絕對是1 最小單元去測試
11/09 15:23, 31F

11/09 18:28, 1年前 , 32F
最近也在工作上嘗試導入,覺得應該是1。但光mock就
11/09 18:28, 32F

11/09 18:28, 1年前 , 33F
一堆東西,還要擔心測試把程式碼綁死(因為mock/fa
11/09 18:28, 33F

11/09 18:28, 1年前 , 34F
ke的部分已經明確宣告在測試內),還是先硬著頭皮
11/09 18:28, 34F

11/09 18:28, 1年前 , 35F
先寫了QQ
11/09 18:28, 35F

11/09 22:33, 1年前 , 36F
切 dependency 用 mock,有測試環境的問題用 fake
11/09 22:33, 36F

11/10 01:36, 1年前 , 37F
請善用DI,然後再寫的時候儘量將ABC低耦合 確保你分開測
11/10 01:36, 37F

11/10 01:38, 1年前 , 38F
ABC的時候不需要在mock,做假資料的時候儘量是真實狀況
11/10 01:38, 38F

11/10 12:51, 1年前 , 39F
當然是1吧,如果你今天改B的程式碼結果A的單元測試錯了
11/10 12:51, 39F

11/10 12:51, 1年前 , 40F
很奇怪
11/10 12:51, 40F

11/10 12:52, 1年前 , 41F
不過其實在單元測試的檔案寫整合測試也是沒問題的吧
11/10 12:52, 41F
文章代碼(AID): #1ZQZIuic (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1ZQZIuic (Soft_Job)