Re: [讨论] 怎样算是一个合格的junior cpp programme

楼主: HZYSoft (PCMan)   2022-08-24 22:17:41
针对关于 TDD 的讨论另外回一篇好了
觉得用推文太长了 XD
: 推 stupidlove0: 朝圣!重要的真的是unit test 08/23 18:47
: → HZYSoft: 回楼上 TDD 问题,TDD 不只要测试,还要先写测试才写code 08/23 21:33
: → HZYSoft: 很多人无法习惯这种顺序,是否一定要 TDD 这有争议 08/23 21:34
补充一下,TDD 是还没有开始写任何的 code 之前,就先针对
程式写好之后 "预期应该要有的行为" 先写 test cases
接着,先跑一次测试亲眼看着他 fail
因为还没写任何 code,所以测试绝对会 fail,
如果没写 code 却 pass 那表示你的 test case 根本没有测到。
接着才开始写 code,重复跑测试直到确认 pass 为止,就是完成了。
不同于先写 code 再测试,TDD 是颠倒,先测试再写 code,所以才叫 test driven
如果程式被报 bug,也是先写一个会 fail 的 test case,确认可以重现 bug
接着才开始改 code 修正,直到测试 pass 为止,就表示修好了。
这是一个观念很特别的流派,他们的主张都是有道理的,就只是比较违反直觉不好实现。
如果你无法先写出测试,那表示你还没弄清楚要实作什么行为,
或是你原先构思的 API 接口难以使用,以至于你写不出 test case
这是强迫你厘清 spec 以及设计好接口的方法,但实在有点极端,被不少人视为邪教 XD
: 推 TeaEEE: TDD最大的阻力来自你的老板 08/24 11:40
Testing 相关的东西常常是这样,因为一开始看不到立竿见影的成果,
花掉的资源,也没有立刻转成给客户的价值,跟下水道工程一样重要但看不见。
: 推 wulouise: TDD在需求不明确的时候写会很痛苦,SPEC改testcase全改 08/24 12:43
: → wulouise: 但只有一个test, 还是可以加快开发的iteration, test编 08/24 12:46
: → wulouise: 译执行时间通 08/24 12:46
: → wulouise: 通常比跑production快很多 08/24 12:46
这个事情我觉得不是 TDD 的锅,需求不明确本身就很痛苦,TDD 只是让你提早面对它
需求不明确或是改来改去,你连 code 该怎么写,写出来该有什么行为都不知道
自然是无法写出 test case 的。但反过来说如果状况是如此,你写出的 code 会对吗?
错是错在没定义清楚程式行为,不是 TDD 的错。
TDD 只是一面镜子,让你提早发现问题,事实上这是好事。
表面上测试写得很艰难拖慢进度,实际上是反映团队沟通不良,和需求不清的问题
我们应该解决问题,而不是解决发现问题的人(跳过测试不做)
如果放弃做测试来节省时间,做出问题一堆的产品,这些时间后面也是要加倍还...
但也有情况例外,就是做 MVP 的时候。还来不及做测试,产品就被取消了,就免还债 XD
: → foreverk: TDD比较可怕的是工程师还没掌握domain,写出不合理的te 08/24 14:04
: → foreverk: st case,而且自己不知道 08/24 14:04
这或许不是 TDD 的锅,domain 掌握不足,设计出来的 API 多半也会是有问题的,
TDD 并没有让事情更糟,只是强迫问题更早浮现罢了。
说了半天整篇都在帮 TDD 护航,但我自己大多是没在用 TDD (汗颜...)
主要原因还是真的很难习惯,而且经验比较不足,有时候 API 设计也是 try & error
虽然整个软件巨观该有什么行为已经订出来了,但程式会拆成很多小模组
每个模组该有哪些行为,完全端看你怎么拆,而很多时候就是这点难以决定,
需要稍微实验不同的作法,在这个阶段强迫要先写 test 还真有点强人所难。
但如果是定义很明确的 API,例如 web 后端的 RESTful API,接口都已经订好了
这时候遵循 TDD 先写 test case 完全是可行的,有兴趣的朋友不妨一试!
作者: windclara (null)   2022-08-24 22:24:00
想问若是前端的话,该怎么TDD较适合呢?观念都理解,但在前端常常写一写又拆出子组件…
楼主: HZYSoft (PCMan)   2022-08-24 22:27:00
抱歉这个我无法回答,我自身经验也不够 XD
作者: linnom (繁星)   2022-08-24 22:31:00
笑死 “Sent from PCMan on PCMan's PC”
作者: shibin (喜饼)   2022-08-24 22:36:00
推,最近写UT也是很苦手,很高兴可以看到此类讨论
作者: iankingh (tw.chief)   2022-08-24 22:57:00
作者: wulouise (在线上!=在电脑前)   2022-08-24 23:31:00
越靠ui的通常越难写写UT...至于规格不明确的确是不该怪TDD, 只是不明确的时候应该先弄清楚再来写XD
作者: holebro (穴弟弟)   2022-08-24 23:36:00
好想进去有走TDD的公司 感觉好赞
作者: wulouise (在线上!=在电脑前)   2022-08-24 23:52:00
说真的有unit test就很好了,100%TDD执行面有困难
作者: viper9709 (阿达)   2022-08-25 00:16:00
原来是这样~感谢分享
作者: sevenHEAD (lifegoeson)   2022-08-25 01:28:00
前端大概或许用testing-library那种测法,内部你怎么拆不管
作者: foreverk (文艺青年)   2022-08-25 08:53:00
同意TDD是让问题提早浮现,尤其edge case可能是使用到其他api时才会发现的,不过通常需求会一环扣一环,团队其他人可能宁愿你先写个可以跑的东西让他可以接下去,而不是等到TDD流程都走完,要求团队都有单元测试都有点难了,还要大家都TDD实在无法想像XD
作者: Wishmaster ( )   2022-08-25 11:12:00
单元测试不是放在重点服务及重点功能上吗?真的有公司所有的程式都写UT吗? 实务可能吗?
作者: vi000246 (Vi)   2022-08-25 11:29:00
TDD很难的原因有可能是需要重构到很精简没有相依才能写出有效的测试 在开发阶段写UT就没什么时间了更何况要重构 以及担负重构衍生出的问题责任
作者: superpai (超级白)   2022-08-25 11:43:00
你写的任何程式不测试怎么知道对不对,你把写console log跟用眼睛看结果的时间拿去写 unit test就好了
作者: DrTech (竹科管理处网军研发人员)   2022-08-25 12:32:00
一般真正能落实的公司,就是考管理政策推动。线上出现Bug,不同等级,对于考绩的影响是什么,导致Unit Test,coverage,增量覆蓋率,都有规范,避免出大错。有了管理与考绩支持,TDD就变成增加效率的优势了。没靠管理支撑品质,人都说有惰性的,绝对不觉得TDD多重要。
作者: art1 (人,原来不是人)   2022-08-25 15:50:00
结果是一张图的时候应该没办法很难测吧*应该很难测
作者: testPtt (测试)   2022-08-25 16:00:00
面对随时有陨石会砸下来的情况下TDD有用吗?
作者: lovdkkkk (dk)   2022-08-25 16:18:00
其实越常变化或扩展测试的用处越大,不过跟 TDD 较无关有写就有用,不一定要 "先" 写
作者: CRPKT (crpkt)   2022-08-25 16:46:00
TDD 可以提早验证 API 的使用性有没有缺陷但并不是 API 漂亮就不会在架构上遇到问题有时候两边都要顾一下会比较平衡
作者: henry4343 (henry)   2022-08-25 21:05:00
好奇真的有办法先写好unit test在开始写程式吗?很多unit test都是在assert function 没function的话没function的话要怎么compile过呀 还是是说function先宣告但内容不写 然后先写测试这样吗?
楼主: HZYSoft (PCMan)   2022-08-25 21:11:00
极端一点没 function 直接写测试也可以,要确定他会 fail当程式有 #ifdef 的时候确实可能有些 code 根本没 build所以从头到尾测试根本没 build 到,先确定会 fail 有帮助或是像 python,没定义 function 也能跑 runtime 才失败这种也可以先跑看看确定他会 fail,确认 test 真的有执行我自己真的有遇过 test function 没跑到,结果假性 pass原因是我把 function name test_xxx 拼错成 tset_xxx于是 python 的 unit test 没抓到这个 test function怎么跑都 pass,因为根本就没测到。所以不要觉得这很多余或是先写个空的 function,跑看看确认他真的会 fail这算是 TDD 一个重要的观念
作者: wulouise (在线上!=在电脑前)   2022-08-25 21:24:00
真的要先fail才有办法确定他是有用的XD我有遇到test永远是对的 里面对不对根本不知道还有根本不存在资料被判断存在,因为跟其他资料重复XDD
作者: mmonkeyboyy (great)   2022-08-26 04:33:00
你有规格书就能先写啊 没有就只能边做边摸索
作者: CYHyen (CYHyen)   2022-08-26 09:46:00
其实想起来也没那么邪,就像刷题,也是test先写好等你
作者: zebraseven (Die walkuere)   2022-08-26 12:44:00
作者: SHANGOYANYI (彦一)   2022-08-26 21:11:00
TDD难在要想出各种案例XD
作者: bnd0327 (阿噗噗)   2022-08-30 14:38:00
TDD在做自己私人专案的时候比较好用,因为自己写的本来就比较随兴,用TDD方法一步一步做比较不会放飞自我
作者: akira01 (小吉)   2022-09-02 07:20:00
个人的经验,一堆人在等你的code才能继续下去,一个礼拜过去了,这时只说我由于用tdd只完成了测试程式,会遭人白眼,所以通常我们还是会先完成功能再补测试程式
作者: superpai (超级白)   2022-09-02 07:35:00
tdd是测试跟实作交替写,会说测试先写完就是做错了
楼主: HZYSoft (PCMan)   2022-09-02 21:47:00
测试先写是针对要改动的地方,不是整个系统都只先写测试实务上确实是交替进行没错
作者: longlongint (华哥尔)   2022-09-11 20:49:00
TDD不会升迁啦,写烂code升迁学弟接手赞赞(反串)
作者: jackhsien (jack)   2022-09-16 10:44:00
个人经验TDD 适合需求明确的开发 不然光改测资就耗掉一堆时间

Links booklink

Contact Us: admin [ a t ] ucptt.com