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

2019-06-25 15:30:10 +08:00
 yidinghe

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

2643 次点击
所在节点    程序员
11 条回复
nanhuier
2019-06-25 16:19:01 +08:00
因为如果结果来自另一个类或方法,那么当该方法出问题时,会连累当前的单元测试失败

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

回到楼主的问题,也是要根据需求区分对待,有些模块对正确性有要求就应该测试结果,有些模块只是调用了一些第三方系统或者持久化依赖,那只需要测试过程就可以。
guyeu
2019-06-26 16:56:31 +08:00
单元测试一个很重要的目的是防止未来的 bug,就是防止在将来的某一天,该方法的调用链上的某个方法被修改导致该方法挂掉。所以我倾向于只 mock 掉 I/O 相关的东西,尽量让调用链保持完整。当然这是做不到的,但是只检查过程绝对有问题,单元测试如果只保护这个方法的那十来行,那还不如不写单元测试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577296

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX