首页 / 知识
关于单元测试:我什么时候应该嘲笑?
2023-04-13 20:25:00

When should I mock?我对模拟和伪造对象有基本的了解,但是我不确定我对何时/何处使用模拟有一种感觉-尤其是在这里适用于这种情况。 当您要测试被测类和特定接口之间的交互时,模拟对象很有用。 好。
例如,我们要测试方法 好。
使用模拟对象,而不是传递真实的 好。 从理论上讲,这听起来不错,但也有一些缺点。 好。 模拟缺点 如果您有一个模拟框架,那么每次需要将接口传递给被测类时,您都倾向于使用模拟对象。这样,即使没有必要,您也可以测试交互。不幸的是,不需要的(偶然的)交互测试是不好的,因为然后您正在测试以特定的方式实现了特定的需求,而不是实现产生了所需的结果。 好。
这是伪代码示例。假设我们已经创建了一个 好。
(在此示例中,我们假设它不是要测试的特定排序算法,例如快速排序;在这种情况下,后者测试实际上是有效的。) 好。
在这样一个极端的例子中,很明显为什么后一个例子是错误的。当我们更改 好。 嘲弄存根 模拟框架通常也允许不太严格的用法,在这种情况下,我们不必确切指定应调用方法的次数和期望的参数。它们允许创建用作存根的模拟对象。 好。
假设我们有一个要测试的方法 好。
在此示例中,我们并不真正在意 好。
但是,当我们更改 好。 而且,测试的可读性非常糟糕,因为有我们想要的代码,所以我们没有编写很多代码,但是因为我们不得不这样做。不是我们想要在那里的代码。使用模拟对象的测试看起来非常复杂,通常很难阅读。测试应该帮助读者理解,应该如何使用测试中的类,因此它们应该简单明了。如果它们不可读,那么没人会去维护它们。实际上,删除它们比维护它们容易。 好。 如何解决?容易: 好。 好。 总而言之,模拟对象有其用途,但如果使用不当,它们通常会鼓励不良做法,测试实现细节,阻碍重构并产生难以阅读和难以维护的测试。 好。 有关模拟缺点的更多详细信息,另请参见模拟对象:缺点和用例。 好。 好。 单元测试应通过单一方法测试单一代码路径。当一个方法的执行从该方法的外部传递到另一个对象,然后又返回时,您就具有了依赖性。 当您使用实际的依赖关系测试该代码路径时,就不是单元测试;您正在进行集成测试。尽管这是很好且必要的,但这不是单元测试。 如果您的依赖项存在错误,则可能会以返回假阳性的方式影响您的测试。例如,您可能将依赖项传递给意外的null,并且依赖项可能不会像记录中所述那样抛出null。您的测试不会发出应有的空参数异常,并且测试通过。 此外,您可能会发现,即使不是不可能,也很难可靠地使相关对象返回测试期间想要的值。这还包括在测试中引发预期的异常。 模拟代替了该依赖关系。您可以设置对依赖对象的调用的期望值,设置应该给您的确切返回值,以执行所需的测试,和/或抛出什么异常,以便可以测试异常处理代码。这样,您可以轻松测试所涉及的单元。 TL; DR:模拟单元测试所涉及的每个依赖项。 经验法则: 如果要测试的函数需要一个复杂的对象作为参数,并且简单地实例化该对象(例如,如果它尝试建立TCP连接)将很痛苦,请使用模拟。 当您尝试测试的代码单元中具有依赖性时,应该模拟一个对象,该对象必须"正好如此"。 例如,当您尝试在代码单元中测试某些逻辑但您需要从另一个对象获取某些东西时,从此依赖项返回的内容可能会影响您要测试的内容-模拟该对象。 可以在这里找到有关该主题的出色播客 |
最新内容
相关内容
linux命令非交互式?
linux命令非交互式?,系统,基础,命令,状态,底部,软件,网络,管理,暂停,代码,什么是非交互式进程?1、互式模式就是shell等待你的输入,并且执行你提linux模拟命令ls?
linux模拟命令ls?,系统,地址,工作,命令,时间,基础,标准,信息,文件,目录,LS(LINUX中ls命令)详细资料大全ls命令是linux下最常用的命令之一,ls跟dlinux在线模拟器命令?
linux在线模拟器命令?,系统,设备,管理,命令,软件,数据,在线,网络,环境,盘中,linux必学的60个命令_linux必学的60个命令怎么读起来简单安装和登linux命令模拟软件?
linux命令模拟软件?,软件,系统,地址,平台,电脑,环境,网上,工具,名字,名称,windows环境下的linux模拟软件1、首先需要打开电脑里的VirualBox软pythonPandas Series对象有哪些属
pythonPandas Series对象有哪些属性?,工具,数据,数字,分析,培训,属性,数据类型,数组,对象,索引,想必大家都知道pandas,它是基于Numpy的一种工具python是面向对象还是面向过程的
python是面向对象还是面向过程的,数据,代码,基础,形态,培训,术语,设计,对象,过程,语言,Python虽然是解释型语言,但从设计之初就已经是一门面向实现Python对象的持久化存储
实现Python对象的持久化存储,数据,对象,系统,函数,培训,标准,环境,管理,参数,文件,Python中有个序列化过程叫作pickle,它能够实现任意对象与文python之访问对象的元数据
python之访问对象的元数据,数据,异常,培训,属性,模块,对象,类型,定义,文档,实例,当你对一个你构造的对象使用dir()时,可能会发现列表中的很多python之执行对象
python之执行对象,代码,数据,信息,概念,培训,通用,对象,属性,方法,赋值,有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的Python的Unittest单元测试使用详解
Python的Unittest单元测试使用详解,地址,位置,网站,信息,分析,工具,培训,系统,例子,目标,PytheM是一个Python渗透测试框架。它只能在osnGNU/LPython之数据库游标对象详解
Python之数据库游标对象详解,软件,代码,一致,培训,数据库,游标,对象,方法,事务,操作,常用数据库:MySQL、Oracle、SQLite但是包嵌入到Python中python的单元测试框架
python的单元测试框架,代码,生态,信息,标准,测试,分析,工具,环境,条款,活跃,1、AutotestAutotest是Google、Redhat、IBM公司联合开发的分布式