作者Keyword (关键字)
看板Soft_Job
标题Re: [讨论] Unit test 的撰写请益
时间Wed Nov 9 07:07:27 2022
大家都选1吗?我觉得二比较好
Google的guideline是Prefer Realism Over Isolation
详见
https://abseil.io/resources/swe-book/html/ch13.html
TotT有关fakes的讨论也提到
Fakes are useful for when you can't use the real implementation in a test
https://testing.googleblog.com/2013/06/testing-on-toilet-fake-your-way-to.html
总之能用real implementation的时候就不要用fake
※ 引述《shane87123 (阳光大肥宅)》之铭言:
: 先说我对 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), 来自: 75.172.24.41 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1667948850.A.92B.html
1F:推 bnd0327: 端看单元如何定义,如果有些类别或函式只是为了服务特定 11/09 08:49
2F:→ bnd0327: 类别或函式,那本质上相当於私有,就可以不用特地mock 11/09 08:50
3F:推 CRPKT: 它主要的考量是维护成本,fake 一样是需要维护的 11/09 09:42
5F:→ shibin: 这篇也有相关讨论,供大家参考 11/09 09:55
6F:推 lovdkkkk: 有可能估狗的员工素质与程式品质搭上测试适合那句估狗的 11/09 10:10
7F:→ lovdkkkk: guideline, 其它公司未必适用 11/09 10:10
确实,其他公司大概没有Google的monorepo还有CI infra?
※ 编辑: Keyword (75.172.24.41 美国), 11/09/2022 11:10:30
8F:推 lovdkkkk: 如果 e2e 测出问题後能被快速定位就适合,而能快速定位 11/09 12:26
9F:→ lovdkkkk: 有很多可能,可能是工程师很会找问题,或错误讯息很清楚 11/09 12:27
10F:→ lovdkkkk: 或者有很完善的 log 追踪规划等等 11/09 12:28
11F:→ lovdkkkk: 亦即这个 guideline 有效 多半也是搭配其它多个面向的条 11/09 12:30
12F:→ lovdkkkk: 件或其它 guideline,整体凑齐之後有效 11/09 12:30
13F:推 neo5277: 如果都用介面方式用1,再用套件模拟这样就最单纯其他多的 11/09 13:40
14F:→ neo5277: 再做 11/09 13:40
15F:推 CaptainH: fake 太多跟本反应不出真实情况 11/09 18:40
16F:推 s06yji3: Unit test不需要考虑真实情况,而是该单元的实作有没有 11/09 19:24
17F:→ s06yji3: 问题。 11/09 19:24
18F:推 s0914714: 反应真实情况 那不就相同code跑ut结果可能不一样 11/09 23:49
19F:推 drajan: 用整合测试 integration test来测 11/10 06:57
20F:推 arhtur945: Unit test 配合後续的e2e 11/10 12:41