Soft_Job 板


LINE

※ 引述《langrisser19 (lan)》之铭言: : 总之每个方式都有一些共用,或是非共用的行为 : 目前的程式像这样 : func 储值(方式){ : switch 方式{ : case 方式1: : if 符合条件1 { : if 符合条件2 { : if 呼叫api-1 成功{ : 更新介面1 : } : } : } : case 方式2: : 要符合不同的巢状条件,然後呼叫另一只api,一样根据结果更新不同的介面 : case 方式3: : 又是不同的条件跟api : } : } : 像这样的程式,不知道测试怎麽写? ㄅ是啊,你应该是先有需求才有测试, 通常是先假设已经在线上的已经经过线上考验。 如果没有这种需求,你根本就不应该整理。 我个人认为任何在没有需求的前提下情况下整理程式码, 是一个浪费自己时间又没意义的行为。 有需求,你就会相对清楚你要处理的边界在哪, 而不是在思考我要处理多宽的问题。 比方说,今天是要修方式3里面的某算式好了好了。 那就是先用重构工具把 //又是不同的条件跟 api 的部分抽出函示, 然後把 member 成员的部分都转成 input 。 (这是我的作法啦,这算是应急的第一步, 这个可以再透过重构的推跟拉来把他摊成 module, 但假设今天的情况是比较快的模式。) xxx(){ ...... switch(xxx){ ...... case 方式3: 方式3_implement(xxx,yyy,zzz); } } public static 方式3Response 方式3_implement(xxx,yyy,zzz){ //又是不同的条件跟api } Test case: public class 方式3TestCase{ public void Test方式3(){ var mockxxx="xxx", mockyyy="yyy", mockzzz="zzz"; var res = xxx.方式3_implement(mockxxx,mockyyy,mockzzz); 方式3Response.aaa.should().be(xxx); } } 通常我会先把「已经存在的案例」先写成测资, 因为老话一句,改前改後都要对的东西可以当对照组。 ======== 通常以上在有正常重构工具的情况应该是几秒钟的事情, 没有的话就是自己搬变数比较烦,应该也是十几分钟要能搞定。 这里可能会有一个例外,就是方式3 如果没有明确可验证的回传值, (也就是 void ) 这时候我自己习惯的是,自己根据重要的地方补 true/false 的 bool, 只验这个必要的 bool,这就要花点技巧处理的地方。 总之你要有「可验证点」,这是可验证性中很重要的一环。 然後考虑到可验证点,你一开始就把「所有方式」, 写成一个大 test case 讲白了只是在找自己麻烦。 你完全没有必要去做一个这麽难的 normalize,除非结构真的超级漂亮。 我会说你原文作的事情,其实是蛮 anti pattern 的, 真实世界中往往80%以上的情况是带不进去的。XD 会做到一半发现当初分开是有理由的,然後又走回起点。 我的习惯就是方式1做到写一个 方式2做到写一个, 起码当我需要测试的时候,我有一个子点。 然後不会强求展开,就是「有发生问题的补」、「怀疑会发生问题的补」, 你没有无穷的时间穷举,所以问题永远是限缩跟抽样。 必要的时候我会把我不关心的选项直接写成 if(xxx) throw new exception(); 表示此路不通,来减少子支。 ======== 再来是推进 方式3_implement 的开发。 这时候我会评估一下 方式3_implement 的复杂度, 如果很大而且很难肉眼比对的话,我会复制一个 方式3v2_implement ,内容跟方式3_implement 一样。 然後稍微调整 Test case: public class 方式3TestCase{ public void Test方式3(){ //因为是static 所以可以呼叫, //这里可能会需要 visible to internal 或暂时开成public var res = xxx.方式3_implement(mockxxx,mockyyy,mockzzz); res.aaa.should().be(xxx); var res2 = xxx.方式3v2_implement(mockxxx,mockyyy,mockzzz); res2.aaa.should().be(res.aaa); //这是为了避免自己脑残,当然这样改的前提是 input/output , //新旧一致的情况,通常都会有重叠场景,如果没有就不用这麽做。 } } 接着就开始从 方式3v2_implement 下写新的实作, 然後反覆跑 Test方式3 ,然後看状况加新的 test method ,补新的测资跟场景。 这里的前提是无副作用,有副作用的就都得透过 mock 先把副作用的影响处理掉, 大多数的时间会花在研究副作用跟子类。(其实就是读code) 就这样而已,没什麽 magic, 你想改哪,就只缩哪。 另外原本的 v1 虽然看起来是重复代码,但是过一两个周期就可以回头删除他了, 而且因为他照理说会除了 test 以外没被连结又是新增程式, 对实际的程式基本上影响为0。 然後你会问我,那你原本想干的方式1,2,3,4,5能不能整并, 施主这要看你的需求。 通常我的习惯是上面的方式3Response,我会试着带进去看看, 方式3方式2能不能共用回传值。 如果可以,那才有谈的空间,没有的话,该分歧就分歧,不要乱合。 然後至於假设在方式1,2,3,4,5 还有 token验证之类的上游问题, 那就是另外写 test ,我这个 test 只涵盖这个下游情境。 用「限缩环境」来减少你一次要看的范围, 强化你对局部开发的速度跟掌握力,也是可测试性中很重要的一环。 --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.163.94.23 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1714635947.A.D59.html ※ 编辑: TonyQ (1.163.94.23 台湾), 05/02/2024 15:48:33 ※ 编辑: TonyQ (1.163.94.23 台湾), 05/02/2024 15:50:41 ※ 编辑: TonyQ (1.163.94.23 台湾), 05/02/2024 15:51:46 ※ 编辑: TonyQ (1.163.94.23 台湾), 05/02/2024 15:53:39 ※ 编辑: TonyQ (1.163.94.23 台湾), 05/02/2024 15:54:45 ※ 编辑: TonyQ (1.163.94.23 台湾), 05/02/2024 15:56:40 ※ 编辑: TonyQ (1.163.94.23 台湾), 05/02/2024 15:57:34 ※ 编辑: TonyQ (1.163.94.23 台湾), 05/02/2024 16:18:42
1F:推 ian90911: 感谢分享 05/02 16:27
2F:推 now99: 最重要需求不要三心二意xdddd 05/02 16:56
3F:→ TonyQ: 需求三心二意就是跟着最後一次的需求走,你有写TEST也比较 05/02 16:57
4F:→ TonyQ: 理解哪些是破坏性的需求,哪些是延伸性(不破坏既有条件)y 05/02 16:57
5F:→ TonyQ: 的需求 05/02 16:58
6F:→ TonyQ: 因为不管需求如何变化,你都得确认最後的那个版本你写的是 05/02 16:58
7F:→ TonyQ: 对的 05/02 16:58
8F:→ TonyQ: 然後可测试性高的程式码,你会有比较多端点可以抽换。 05/02 17:00
9F:推 viper9709: 推这篇实际 05/02 21:14
10F:推 gmoz: 请公司多聘SDET $$$$$ QAQ 05/03 11:25
11F:推 new122851: 我的认知是整个project除了main method这个进入点不用 05/03 19:54
12F:→ new122851: 写到UT,其他的所有method都要被至少一支UT程式跑到过 05/03 19:54
13F:→ new122851: ,包含static的method 05/03 19:54
这就是追求 coverage ,但实际上没这回事啦, 多数专案自己能做到30% coverage 就很了不起了。 提这个概念只是跟自己的时间过不去而已。
14F:推 yc86209: 推一个 05/03 20:34
15F:推 wulouise: 当你一开始才0%coverage开始的时候,最重要的先做 05/03 22:52
※ 编辑: TonyQ (114.34.27.1 台湾), 05/04/2024 12:52:57







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP