V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Ainokiseki
V2EX  ›  Go 编程语言

如何有效提高测试覆盖率

  •  
  •   Ainokiseki · 147 天前 · 1259 次点击
    这是一个创建于 147 天前的主题,其中的信息可能已经有所发展或是发生改变。

    reviewer 要求代码测试覆盖率只能高不能低,但是有些部分的代码真的没法单测啊,依赖第三方库并且第三方也没做好 mock ,全用 interface 封装一遍又太麻烦了,好在 reviewer 只看数字,有什么方法拉高单测覆盖率吗

    10 条回复    2023-12-13 15:49:46 +08:00
    jones2000
        1
    jones2000  
       147 天前
    买付费的第 3 方库,签合同, 让第 3 放提供测试报告。这样你只需要写自己代码的测试就可以了。
    RedisMasterNode
        2
    RedisMasterNode  
       147 天前
    (背景:擅长+喜欢写测试,搞 TDD )

    要不你把你的代码形式翻出来大伙儿看看,到底是什么代码单测这么难写?
    mtzhjsnv
        3
    mtzhjsnv  
       146 天前
    gomonkey 应该适合你
    seeu2ex
        4
    seeu2ex  
       146 天前
    @RedisMasterNode 有些代码的分支测试怎么做,同一份代码写两次吗
    RedisMasterNode
        5
    RedisMasterNode  
       146 天前
    @seeu2ex 分支不如你举个例子?不同分支比如说上面某个变量得值不同,因此下面走了不同分支,测试代码里面不就是 2 个 case ,然后各自 mock 那个变量到不同得值,就能走到不同分支去了?

    按我的经验,测试代码里面执行部分基本不会改动的,改来改去都是测试用例部分,举个自己写的例子:
    https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/tailsamplingprocessor/internal/sampling/ottl_test.go

    然后也有人说业务代码没法这样简单,那我觉得其实只是本身代码组织得不够合理、每个方法目标不够明确,改改习惯就行。
    dayeye2006199
        6
    dayeye2006199  
       146 天前
    为啥 mock 要第三方做?难道不是你 mock 第三方吗?
    第三方库的覆盖率也会被算进去?
    seeu2ex
        7
    seeu2ex  
       146 天前
    @RedisMasterNode #5 前端,感觉对过个交互请求导致的网络请求做了结果分支,这样的话岂不是要将前面的交互代码复制一份,再做不同路径值的验证(感觉真正有效的就这部分)
    RedisMasterNode
        8
    RedisMasterNode  
       146 天前
    @seeu2ex 不对,可以明确你要测试的范围和手段,例如单元测试应该以方法或者精简的极小模块为“单元”,针对这个单元的功能测试,例如一个时间转换方法、一个调用后端+数据处理的方法;端到端测试是给定用户输入,触发前端逻辑->调用后端->调用 xxx->返回给用户,检查返回结果是否匹配。

    然后如果你觉得测试的时候需要写大量的重复代码,可以考虑优化测试的框架,这个框架是否帮你封装了逻辑,让你只需要管理输入参数即可?用不同输入参数走到不同分支?可以先把测试框架做扎实再写 case ,说白了,要时间的,不是哪天想搞就能简简单单搞
    seeu2ex
        9
    seeu2ex  
       145 天前
    Ainokiseki
        10
    Ainokiseki  
    OP
       139 天前
    不好意思这几天一直没看到新消息提醒,以为没有回复
    @dayeye2006199 比如我代码依赖某个第三方包的结构体,那显然是没法 mock 的,因为不是 interface ,除非我把所有第三方结构体都手动封装成 interface
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2281 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 80ms · UTC 05:11 · PVG 13:11 · LAX 22:11 · JFK 01:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.