V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yidinghe
V2EX  ›  程序员

你们写单元测试的时候是检查过程还是检查结果

  •  
  •   yidinghe · 2019-06-25 15:30:10 +08:00 via Android · 2693 次点击
    这是一个创建于 2014 天前的主题,其中的信息可能已经有所发展或是发生改变。

    单元测试属于白盒测试,按道理来说应该检查过程而不是结果。因为如果结果来自另一个类或方法,那么当该方法出问题时,会连累当前的单元测试失败,这就导致一个局面:当前被测试的代码是没问题的,但单元测试失败了,它没有起到应有的作用。特别是分层应用,上层代码的执行结果会受到更多因素的影响,使得单元测试几乎不可靠。反过来说,只要过程是对的,哪怕结果错误也应该测试通过,因为问题出在别的地方。

    11 条回复    2019-06-26 16:56:31 +08:00
    nanhuier
        1
    nanhuier  
       2019-06-25 16:19:01 +08:00 via iPhone
    因为如果结果来自另一个类或方法,那么当该方法出问题时,会连累当前的单元测试失败

    我觉得单元测试时只测一个方法,如果调用其他类或方法,应该打桩测
    JokerSH
        2
    JokerSH  
       2019-06-25 16:25:58 +08:00
    在 python 中,像你说的,在一个方法中需要用到另一个方法返回的结果,可以采用 mock 的方式来模拟另一个方法,得到你想要的结果,这里有介绍。https://www.jianshu.com/p/c6e13e87359b
    maichael
        3
    maichael  
       2019-06-25 16:31:41 +08:00
    "因为如果结果来自另一个类或方法,那么当该方法出问题时,会连累当前的单元测试失败",这个关测结果还是测过程什么事。单元测试,单元测试,你连要测试的单元边界在那都没有想清楚,怎么可能写的好测试。
    russian
        4
    russian  
       2019-06-25 19:53:05 +08:00
    单元测试和其他单元没关系,只依赖与你测试的单元。一般是写一个 mock,在 python,JavaScript 和 c++里都有类似的工具。
    reus
        5
    reus  
       2019-06-25 20:51:23 +08:00
    如果结果错误,你怎么知道过程是对的?
    你怎么知道是别的地方错了,不是这个地方错了?
    如果上游出错,难道不应该抛错?
    上游错了,当作没事发生?
    testeststs
        6
    testeststs  
       2019-06-25 21:00:49 +08:00
    啥叫单元测试?
    推荐先学习下测试的分类。
    zjb861107
        7
    zjb861107  
       2019-06-25 21:03:45 +08:00
    楼主说这种,更偏向与接口测试了。单元测试还是前面大家说的,我复议。
    huskar
        8
    huskar  
       2019-06-25 21:03:52 +08:00
    同上,先解释解释什么是“单元”测试?
    luzemin
        9
    luzemin  
       2019-06-26 09:29:34 +08:00
    你说的这个单元测试它不“单元”啊
    troywinter
        10
    troywinter  
       2019-06-26 13:40:12 +08:00
    楼上几位说的太过绝对,单元测试的单元如何去区分太过绝对,不是说只测一个方法或者一个类,这个没有一个绝对的准确的定义,各种讲单元测试的书诸如 Clean Code 和 The art of Unit Testing 几乎都提到了要根据具体业务来区分,有绝对第三方依赖的应该 mock,如数据库,sdk 等,我一般都是按照业务需求来测试,不然每个方法都要测试的话,工作量太大而且没有什么意义。

    回到楼主的问题,也是要根据需求区分对待,有些模块对正确性有要求就应该测试结果,有些模块只是调用了一些第三方系统或者持久化依赖,那只需要测试过程就可以。
    guyeu
        11
    guyeu  
       2019-06-26 16:56:31 +08:00
    单元测试一个很重要的目的是防止未来的 bug,就是防止在将来的某一天,该方法的调用链上的某个方法被修改导致该方法挂掉。所以我倾向于只 mock 掉 I/O 相关的东西,尽量让调用链保持完整。当然这是做不到的,但是只检查过程绝对有问题,单元测试如果只保护这个方法的那十来行,那还不如不写单元测试。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1246 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:36 · PVG 01:36 · LAX 09:36 · JFK 12:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.