大家的开发团队是否有单元测试编写规范?可否分享一下思路呢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leonardyang
V2EX    Java

大家的开发团队是否有单元测试编写规范?可否分享一下思路呢

  •  
  •   leonardyang 2020-04-03 15:48:40 +08:00 3952 次点击
    这是一个创建于 2067 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从差不多正式接触编程开始就一直被灌输要养成编写单元测试的习惯,但是很遗憾目前工作的团队一直没有真正落地的单元测试编写规范,领导就硬性布置了一个 sonar 检测覆盖率达标任务,团队也一直没有投入精力设计制定一套规范或者约定,不知道大家的团队或者自己平时是怎么进行这个事的?

    16 条回复    2020-04-04 02:32:42 +08:00
    williamfzc
        1
    williamfzc  
       2020-04-03 16:01:35 +08:00
    国内这个鬼环境,一推单测别人就会拿延期来威胁你,太绝望了..
    tabris17
        2
    tabris17  
       2020-04-03 16:02:52 +08:00
    @williamfzc 简单啊,你把 unit test 计入 KPI 就行啦(啥?不算 KPI,那还写个屁
    guyeu
        3
    guyeu  
       2020-04-03 16:19:37 +08:00   1
    主要问题还是需求三天一遍,代码推倒重来,单测的收益不够吧。。。像框架和工具类是应该覆盖单元测试的,业务代码我觉得没必要硬性要求,往往接口测试就足够了。
    justfortest
        4
    justfortest  
       2020-04-03 16:26:49 +08:00 via Android
    主要是时间问题,时间充足肯定写测试,免去很多 bug
    index90
        5
    index90  
       2020-04-03 16:29:06 +08:00
    单元测试覆盖率不达到 100%,无法合并到主干,我们已经做到了。
    RedisMasterNode
        6
    RedisMasterNode  
       2020-04-03 16:42:26 +08:00
    @index90 单元测试覆盖率达到 100%印象中好像并不是什么推荐的实践?不过不太记得出处了,大意就是强制要求 100%实际上好像,比如说其实说明业务代码可能有一些 edge case 没有覆盖到的情况下就容易测试覆盖率 100%,当业务代码对各种边界条件处理都很完善的时候,想要 100%就很难了
    cwjokaka
        7
    cwjokaka  
       2020-04-03 16:44:28 +08:00
    Postman 一把梭
    mitu9527
        8
    mitu9527  
       2020-04-03 16:50:55 +08:00
    单元测试还有规范么,顶一下,看看大家怎么说,学习一下。
    aviator
        9
    aviator  
       2020-04-03 16:53:21 +08:00 via Android
    目前我们公司没有做单元测试,都只是自己测一下接口。
    mitu9527
        10
    mitu9527  
       2020-04-03 16:56:28 +08:00
    最近我看了一点 TDD 和分层测试的文章,觉得这两个地方是单元测试落地的难点和重点。
    leonardyang
        11
    leonardyang  
    OP
       2020-04-03 17:02:01 +08:00
    @mitu9527 我之前也看了一些关于单元测试的论点,似乎良好的落地确实是需要测试先行的开发模式基础上
    index90
        12
    index90  
       2020-04-03 17:12:53 +08:00   1
    @RedisMasterNode 我也向领导提过,当我的代码里出现“防御性代码”时,要覆盖它就变得非常困难,实际操作中,我可能为了避免写单元测试,把防御性代码撤销掉。
    但 100%覆盖是“政治性”要求,没有商量的余地,而实际执行中,的确挺恶心。但也驱使着大家在写代码的时候,同时也思考着如何写出可测试的代码,间接地也提高了代码质量。实际上,我真的遇到了上面提到的“防御性代码”问题,但良心驱使我不能把这行代码删掉,解决的办法就是利用函数变量,在单元测试的时候把一些函数 mock 掉。

    当然我们无法评价 100%覆盖所带来的价值,毕竟无法控制所有时空变量来比较,简单说,带来的价值无法量化,所以无法比较。

    但从逻辑推理上说,还是有价值的,例如实施单元测试肯定对代码质量有所提升,我们重构的时候更加容易,合并主干的时候心里更有底气。

    但我必须说,100%单元测试覆盖是一种倒逼行为,我们还需要正向的研发指导和程序架构设计,否者这个过程会很痛苦和很漫长。
    mitu9527
        13
    mitu9527  
       2020-04-03 17:17:05 +08:00
    @index90 不敢想象真的有人在追求 100%,你的领导是做技术出身的么?很好奇是什么驱使他作出 100%这个决策的。
    index90
        14
    index90  
       2020-04-03 17:25:02 +08:00 via iPhone
    @mitu9527 我领导是技术出身的。我们经历了差不多两年的软件质量问题,我们尝试过各种方法去改善,我们还实施过 100%接口覆盖测试,但收效甚微。可能是因为走投无路了,什么方法都试一下,所以才决定试试单元测试这条路。
    index90
        15
    index90  
       2020-04-03 17:40:06 +08:00
    @RedisMasterNode 我想补充一下,关于”100%印象中好像并不是什么推荐的实践?“

    的确,如果你站在研发人员的角度上看。当如果站在研发管理角度上看,情况会变得不一样。
    如果你是个人开发者,或者几个人的开发小组,你信任你的成员职业素质都很高,那么你是可以相信研发人员都在必要的地方加上了单元测试。
    但是如果你管理的是几十人的研发团队,你会确信他们的职业素质都足够高么?他们中就没有一个人会因为偷懒,没有在必要的地方加上单元测试?如果你不要求 100%覆盖,那么就有了讨价还价的余地,90%? 95%? 99%?哪个才合适?无法拍脑袋定一个数。

    那些”防御性代码“问题,只是极少概率事件,而且研发上也能用技术解决。但管理上可选择的余地并不比技术上多。
    b00tyhunt3r
        16
    b00tyhunt3r  
       2020-04-04 02:32:42 +08:00
    推荐 rust
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5573 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 03:28 PVG 11:28 LAX 19:28 JFK 22:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86