单元测试属于白盒测试,按道理来说应该检查过程而不是结果。因为如果结果来自另一个类或方法,那么当该方法出问题时,会连累当前的单元测试失败,这就导致一个局面:当前被测试的代码是没问题的,但单元测试失败了,它没有起到应有的作用。特别是分层应用,上层代码的执行结果会受到更多因素的影响,使得单元测试几乎不可靠。反过来说,只要过程是对的,哪怕结果错误也应该测试通过,因为问题出在别的地方。
1
nanhuier 2019-06-25 16:19:01 +08:00 via iPhone
因为如果结果来自另一个类或方法,那么当该方法出问题时,会连累当前的单元测试失败
我觉得单元测试时只测一个方法,如果调用其他类或方法,应该打桩测 |
2
JokerSH 2019-06-25 16:25:58 +08:00
在 python 中,像你说的,在一个方法中需要用到另一个方法返回的结果,可以采用 mock 的方式来模拟另一个方法,得到你想要的结果,这里有介绍。https://www.jianshu.com/p/c6e13e87359b
|
3
maichael 2019-06-25 16:31:41 +08:00
"因为如果结果来自另一个类或方法,那么当该方法出问题时,会连累当前的单元测试失败",这个关测结果还是测过程什么事。单元测试,单元测试,你连要测试的单元边界在那都没有想清楚,怎么可能写的好测试。
|
4
russian 2019-06-25 19:53:05 +08:00
单元测试和其他单元没关系,只依赖与你测试的单元。一般是写一个 mock,在 python,JavaScript 和 c++里都有类似的工具。
|
5
reus 2019-06-25 20:51:23 +08:00
如果结果错误,你怎么知道过程是对的?
你怎么知道是别的地方错了,不是这个地方错了? 如果上游出错,难道不应该抛错? 上游错了,当作没事发生? |
6
testeststs 2019-06-25 21:00:49 +08:00
啥叫单元测试?
推荐先学习下测试的分类。 |
7
zjb861107 2019-06-25 21:03:45 +08:00
楼主说这种,更偏向与接口测试了。单元测试还是前面大家说的,我复议。
|
8
huskar 2019-06-25 21:03:52 +08:00
同上,先解释解释什么是“单元”测试?
|
9
luzemin 2019-06-26 09:29:34 +08:00
你说的这个单元测试它不“单元”啊
|
10
troywinter 2019-06-26 13:40:12 +08:00
楼上几位说的太过绝对,单元测试的单元如何去区分太过绝对,不是说只测一个方法或者一个类,这个没有一个绝对的准确的定义,各种讲单元测试的书诸如 Clean Code 和 The art of Unit Testing 几乎都提到了要根据具体业务来区分,有绝对第三方依赖的应该 mock,如数据库,sdk 等,我一般都是按照业务需求来测试,不然每个方法都要测试的话,工作量太大而且没有什么意义。
回到楼主的问题,也是要根据需求区分对待,有些模块对正确性有要求就应该测试结果,有些模块只是调用了一些第三方系统或者持久化依赖,那只需要测试过程就可以。 |
11
guyeu 2019-06-26 16:56:31 +08:00
单元测试一个很重要的目的是防止未来的 bug,就是防止在将来的某一天,该方法的调用链上的某个方法被修改导致该方法挂掉。所以我倾向于只 mock 掉 I/O 相关的东西,尽量让调用链保持完整。当然这是做不到的,但是只检查过程绝对有问题,单元测试如果只保护这个方法的那十来行,那还不如不写单元测试。
|