关于单元测试:我什么时候应该嘲笑?
When should I mock?我对模拟和伪造对象有基本的了解,但是我不确定我对何时/何处使用模拟有一种感觉-尤其是在这里适用于这种情况。 当您要测试被测类和特定接口之间的交互时,模拟对象很有用。 好。
例如,我们要测试方法 好。
使用模拟对象,而不是传递真实的 好。 从理论上讲,这听起来不错,但也有一些缺点。 好。 模拟缺点 如果您有一个模拟框架,那么每次需要将接口传递给被测类时,您都倾向于使用模拟对象。这样,即使没有必要,您也可以测试交互。不幸的是,不需要的(偶然的)交互测试是不好的,因为然后您正在测试以特定的方式实现了特定的需求,而不是实现产生了所需的结果。 好。
这是伪代码示例。假设我们已经创建了一个 好。
(在此示例中,我们假设它不是要测试的特定排序算法,例如快速排序;在这种情况下,后者测试实际上是有效的。) 好。
在这样一个极端的例子中,很明显为什么后一个例子是错误的。当我们更改 好。 嘲弄存根 模拟框架通常也允许不太严格的用法,在这种情况下,我们不必确切指定应调用方法的次数和期望的参数。它们允许创建用作存根的模拟对象。 好。
假设我们有一个要测试的方法 好。
在此示例中,我们并不真正在意 好。
但是,当我们更改 好。 而且,测试的可读性非常糟糕,因为有我们想要的代码,所以我们没有编写很多代码,但是因为我们不得不这样做。不是我们想要在那里的代码。使用模拟对象的测试看起来非常复杂,通常很难阅读。测试应该帮助读者理解,应该如何使用测试中的类,因此它们应该简单明了。如果它们不可读,那么没人会去维护它们。实际上,删除它们比维护它们容易。 好。 如何解决?容易: 好。 好。 总而言之,模拟对象有其用途,但如果使用不当,它们通常会鼓励不良做法,测试实现细节,阻碍重构并产生难以阅读和难以维护的测试。 好。 有关模拟缺点的更多详细信息,另请参见模拟对象:缺点和用例。 好。 好。 单元测试应通过单一方法测试单一代码路径。当一个方法的执行从该方法的外部传递到另一个对象,然后又返回时,您就具有了依赖性。 当您使用实际的依赖关系测试该代码路径时,就不是单元测试;您正在进行集成测试。尽管这是很好且必要的,但这不是单元测试。 如果您的依赖项存在错误,则可能会以返回假阳性的方式影响您的测试。例如,您可能将依赖项传递给意外的null,并且依赖项可能不会像记录中所述那样抛出null。您的测试不会发出应有的空参数异常,并且测试通过。 此外,您可能会发现,即使不是不可能,也很难可靠地使相关对象返回测试期间想要的值。这还包括在测试中引发预期的异常。 模拟代替了该依赖关系。您可以设置对依赖对象的调用的期望值,设置应该给您的确切返回值,以执行所需的测试,和/或抛出什么异常,以便可以测试异常处理代码。这样,您可以轻松测试所涉及的单元。 TL; DR:模拟单元测试所涉及的每个依赖项。 经验法则: 如果要测试的函数需要一个复杂的对象作为参数,并且简单地实例化该对象(例如,如果它尝试建立TCP连接)将很痛苦,请使用模拟。 当您尝试测试的代码单元中具有依赖性时,应该模拟一个对象,该对象必须"正好如此"。 例如,当您尝试在代码单元中测试某些逻辑但您需要从另一个对象获取某些东西时,从此依赖项返回的内容可能会影响您要测试的内容-模拟该对象。 可以在这里找到有关该主题的出色播客 |
相关内容
-
Android手机模拟器的安装方法_模拟器安装教程在
Android手机模拟器的安装方法_模拟器安装教程在计算机技能,,核...
-
miui模拟器电脑版|MIUI模拟器
miui模拟器电脑版|MIUI模拟器,,1. MIUI模拟器笔记本电脑没有办...
-
逍遥部落冲突模拟器电脑版|逍遥部落冲突模拟器
逍遥部落冲突模拟器电脑版|逍遥部落冲突模拟器电脑版下载教...
-
电脑模拟器玩吃鸡太卡怎么办|吃鸡模拟器很卡
电脑模拟器玩吃鸡太卡怎么办|吃鸡模拟器很卡,,1. 吃鸡模拟器很...
-
拍拍模拟器电脑版|拍拍猴模拟器
拍拍模拟器电脑版|拍拍猴模拟器,,1. 拍拍猴模拟器爬猴,5173,淘宝...
-
模拟器设置vt|模拟器设置VT
模拟器设置vt|模拟器设置VT,,模拟器设置vtwin7安卓模拟器vt开...
-
ps模拟器电脑版推荐|最好用的ps模拟器
ps模拟器电脑版推荐|最好用的ps模拟器,,1. 最好用的ps模拟器夜...
-
ps2模拟器设置|ps2模拟器设置画质卡顿怎么解决
ps2模拟器设置|ps2模拟器设置画质卡顿怎么解决,,ps2模拟器设置...
-
Python之可迭代对象、迭代器、生成器
Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描...
-
模拟器按键设置|明日之后模拟器按键设置
模拟器按键设置|明日之后模拟器按键设置,,明日之后模拟器按键...
-
应用程序对象
应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用...
-
电脑配置搭配模拟器|低配电脑模拟器怎么设置
电脑配置搭配模拟器|低配电脑模拟器怎么设置,,低配电脑模拟器...
-
对象路径连接的快捷键|查找路径快捷键
对象路径连接的快捷键|查找路径快捷键,,1. 查找路径快捷键电脑...
-
模拟电脑系统有哪些|什么叫电脑模拟器
模拟电脑系统有哪些|什么叫电脑模拟器,,1. 什么叫电脑模拟器直...
-
ps2模拟器平板电脑|电脑版ps2模拟器
ps2模拟器平板电脑|电脑版ps2模拟器,,1. 电脑版ps2模拟器psp没...