[讨论] Unit test 的撰写请益

楼主: shane87123 (阳光大肥宅)   2022-11-08 18:51:34
先说我对 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
作者: vi000246 (Vi)   2022-11-08 18:53:00
你可以先读重构相关的书
作者: GooseLover (凯因哈特利)   2022-11-08 19:12:00
如果模组化有做好,那你1.做得是正确的事情。正常来说就是Function跟Process分开测,最后再来个整合测试。然后不要抗拒为各别Function写Unittest
作者: s06yji3 (阿南)   2022-11-08 19:15:00
单元测试的话1
作者: foreverk (文艺青年)   2022-11-08 19:22:00
用1吧,如果要测试的function长文章那样,那本来就应该花时间写BCD的test case
作者: s06yji3 (阿南)   2022-11-08 19:28:00
不知道你用什么语言,通常会有tool帮你拦截dep的function然后去呼叫对应的fake function
作者: MoonCode (MoonCode)   2022-11-08 20:14:00
对了 不写这个测试会怎样?
作者: ssccg (23)   2022-11-08 21:14:00
合起来测也是种测法,只是那就不是unit test了
作者: angusyu (〒△〒)   2022-11-08 21:24:00
专案如果没有在切接口,直接硬fake会写到怀疑人生
作者: yamakazi (大安吴彦祖)   2022-11-08 22:41:00
gmock 就是1啊gmock gtest框架都有了,你想得到的问题大公司都想到了,直接整套拿去用就好
作者: drajan (EasoN)   2022-11-08 23:01:00
没切接口就赶快 refactor 没测试的软件能跑吗
作者: sniper2824 (月夜)   2022-11-08 23:51:00
1
作者: viper9709 (阿达)   2022-11-08 23:57:00
推二楼
作者: Lipraxde (Lipraxde)   2022-11-09 00:00:00
没出问题的 legacy code 就别想着帮别人加 UT 了,顶多做做整合测试,别把自己搞到怀疑人生
作者: lovdkkkk (dk)   2022-11-09 00:17:00
不确定目前程式的情况, 假如目前程式很乱, 有可能需要先做 2 快速加个整合测试, 重构一下, 之后再做 1
作者: leo08210917 (leo)   2022-11-09 01:07:00
接口切好 弄懂IoC、DI做mock很快 UT也方便旧的可以用防腐层切开 弄整合测试就好
作者: prag222 (prag)   2022-11-09 02:21:00
虽我单元测试没啥经验,但说真的就是程式太鸟才依赖性太高,相信用物件导向或设计模式都可以切干净的
作者: Lipraxde (Lipraxde)   2022-11-09 07:22:00
只会更糟吧XDDD
作者: bnd0327 (阿噗噗)   2022-11-09 08:53:00
如果BCD没有被其他函式使用,直接用真的BCD测也无妨
作者: wulouise (在线上!=在电脑前)   2022-11-09 12:10:00
2不算UT,但是你在refactor前可能会写出2那样的情况最好先用test framework测整合测试再来refactor
作者: andy831020 (Liszt1020)   2022-11-09 15:23:00
绝对是1 最小单元去测试
作者: lestibournes (Hello World)   2022-11-09 18:28:00
最近也在工作上尝试导入,觉得应该是1。但光mock就一堆东西,还要担心测试把程式码绑死(因为mock/fake的部分已经明确宣告在测试内),还是先硬著头皮先写了QQ
作者: CoNsTaR ((const *))   2022-11-09 22:33:00
切 dependency 用 mock,有测试环境的问题用 fake
作者: acgotaku (otaku)   2022-11-10 01:36:00
请善用DI,然后再写的时候尽量将ABC低耦合 确保你分开测ABC的时候不需要在mock,做假资料的时候尽量是真实状况
作者: s8952889 (s8952889)   2022-11-10 12:51:00
当然是1吧,如果你今天改B的程式码结果A的单元测试错了很奇怪不过其实在单元测试的档案写整合测试也是没问题的吧

Links booklink

Contact Us: admin [ a t ] ucptt.com