PTT推薦

[討論] Unit test 的撰寫請益

看板Soft_Job標題[討論] Unit test 的撰寫請益作者
shane87123
(陽光大肥宅)
時間推噓16 推:16 噓:0 →:25

先說我對 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 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.70.74 (臺灣)
PTT 網址

vi00024611/08 18:53你可以先讀重構相關的書

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

GooseLover11/08 19:12說就是Function跟Process分開測,最後再來個整合測試

GooseLover11/08 19:12。然後不要抗拒為各別Function寫Unittest

我本來預期就是為個別檔案的個別function寫unit test,不過不確定這樣做是不是有符合u nit test的特性

s06yji311/08 19:15單元測試的話1

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

foreverk11/08 19:22花時間寫BCD的test case

謝謝各位大大,那我可以放心去fake了

s06yji311/08 19:28不知道你用什麼語言,通常會有tool幫你攔截dep的function

s06yji311/08 19:28然後去呼叫對應的fake function

應是用google test,沒錯,他可以去呼叫fake function。這部分的實作應該沒什麼問題

MoonCode11/08 20:14對了 不寫這個測試會怎樣?

※ 編輯: shane87123 (114.25.70.74 臺灣), 11/08/2022 20:15:55

ssccg11/08 21:14合起來測也是種測法,只是那就不是unit test了

angusyu11/08 21:24專案如果沒有在切介面,直接硬fake會寫到懷疑人生

yamakazi11/08 22:41gmock 就是1啊

yamakazi11/08 22:42gmock gtest框架都有了,你想得到的問題大公司都想到了

yamakazi11/08 22:42,直接整套拿去用就好

drajan11/08 23:01沒切介面就趕快 refactor 沒測試的軟體能跑嗎

sniper282411/08 23:511

viper970911/08 23:57推二樓

Lipraxde11/09 00:00沒出問題的 legacy code 就別想著幫別人加 UT 了,頂多

Lipraxde11/09 00:00做做整合測試,別把自己搞到懷疑人生

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

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

leo0821091711/09 01:07介面切好 弄懂IoC、DI做mock很快 UT也方便

leo0821091711/09 01:08舊的可以用防腐層切開 弄整合測試就好

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

prag22211/09 02:21太高,相信用物件導向或設計模式都可以切乾淨的

Lipraxde11/09 07:22只會更糟吧XDDD

bnd032711/09 08:53如果BCD沒有被其他函式使用,直接用真的BCD測也無妨

wulouise11/09 12:102不算UT,但是你在refactor前可能會寫出2那樣的情況

wulouise11/09 12:12最好先用test framework測整合測試再來refactor

andy83102011/09 15:23絕對是1 最小單元去測試

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

lestibournes11/09 18:28一堆東西,還要擔心測試把程式碼綁死(因為mock/fa

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

lestibournes11/09 18:28先寫了QQ

CoNsTaR11/09 22:33切 dependency 用 mock,有測試環境的問題用 fake

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

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

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

s895288911/10 12:51很奇怪

s895288911/10 12:52不過其實在單元測試的檔案寫整合測試也是沒問題的吧