首页 / 知识
关于单元测试:模拟比存根更好吗?
2023-04-14 10:38:00

Are mocks better than stubs?不久前,我阅读了Martin Fowler的Mocks Are n't Stubs文章,我必须承认我对增加复杂性方面的外部依赖有些担心,所以我想问一下: 单元测试时使用的最佳方法是什么? 始终使用模拟框架自动模拟被测试方法的依赖关系会更好吗?还是您希望使用更简单的机制,例如测试存根? 正如口头禅所说的:"去做可能可行的最简单的事情。"
始终避免使用模拟程序,因为它们会使测试变脆。现在,如果模拟的接口或您的实现发生更改,您的测试将对实现所调用的方法有复杂的了解...测试将中断。这很糟糕,您将花费更多的时间来运行测试,而不仅仅是运行SUT。测试不应与实施不恰当地紧密联系。
更新结尾/讨论:
由于期望,我通常更喜欢使用模拟。当您在存根上调用返回值的方法时,它通常只会为您提供一个值。但是,当您在模拟对象上调用方法时,它不仅会返回值,而且还使您期望将方法设置为首先被调用。换句话说,如果您设置了期望,然后不调用该方法,则会引发异常。当您设定期望值时,您实际上是在说:"如果未调用此方法,则说明出现问题。"相反,如果您在模拟对象上调用方法但未设置期望,则它将引发异常,本质上说:"嘿,当您不期望它时,您在做什么?" 有时,您不希望对正在调用的每个方法都抱有期望,因此某些模拟框架将允许像"模拟/存根混合"之类的"部分"模拟,因为只有您设置的期望被强制执行,而其他所有方法调用都被处理更像是存根,它只是返回一个值。 不过,我可以想到的一个有效的使用存根的地方就是将测试引入旧代码时。有时,通过子类化正在测试的类来进行存根比重构所有内容以简化或什至使模拟变得容易。 对此...
...我说如果我的界面发生变化,则最好中断测试。因为单元测试的全部要点是它们可以准确地测试我现在存在的代码。 没关系,Statist vs. Interaction。考虑一下角色和关系。如果对象与邻居协作以完成其工作,则该关系(在接口中表示)将成为使用模拟进行测试的候选对象。如果对象是具有某些行为的简单值对象,则直接对其进行测试。我看不到手工编写模拟(甚至存根)的意义。这就是我们所有人从此开始并重构的方式。 对于更长的讨论,请考虑看看http://www.mockobjects.com/book 最好使用组合,并且您必须使用自己的判断。这是我使用的准则:
第二种模拟是一种必要的邪恶。真正发生的事情是,无论您使用存根还是模拟,在某些情况下,您必须比自己想要的更多地耦合到代码。发生这种情况时,最好只使用模拟而不是存根,因为您将知道这种耦合何时断开并且您的代码不再按照测试的方式编写。最好在执行此操作时在测试中留下评论,以便任何人破解它都知道他们的代码没有错,测试就是。 再说一遍,这是代码的味道,也是不得已的方法。如果发现需要经常执行此操作,请尝试重新考虑编写测试的方式。 这仅取决于您正在执行的测试类型。如果您正在进行基于行为的测试,则可能需要动态模拟,以便可以验证是否发生了与您的依存关系的交互。但是,如果您要进行基于状态的测试,则可能需要存根,以便验证值/ etc 例如,在以下测试中,您注意到我对视图进行了存根,因此可以验证是否设置了属性值(基于状态的测试)。然后,我将创建服务类的动态模拟,以便确保在测试(基于交互/行为的测试)期间调用特定方法。
在这篇博客文章中阅读Luke Kanies对这个问题的讨论。他引用了Jay Fields的一篇文章,该文章甚至建议使用[相当于ruby / mocha的] stub_everything可以使测试更健壮。引用菲尔兹的最后一句话:" Mocha使定义模拟与定义存根一样容易,但这并不意味着您应该始终喜欢模拟。实际上,我通常更喜欢存根,并在必要时使用模拟。" |
最新内容
相关内容
linux模拟命令ls?
linux模拟命令ls?,系统,地址,工作,命令,时间,基础,标准,信息,文件,目录,LS(LINUX中ls命令)详细资料大全ls命令是linux下最常用的命令之一,ls跟dlinux基本命令框架?
linux基本命令框架?,系统,基础,网络,设备,管理,基础知识,环境,管理系统,概念,技术,新手如何自学linux安装linux系统,把自己喜欢的linux发行版安linux在线模拟器命令?
linux在线模拟器命令?,系统,设备,管理,命令,软件,数据,在线,网络,环境,盘中,linux必学的60个命令_linux必学的60个命令怎么读起来简单安装和登linux命令模拟软件?
linux命令模拟软件?,软件,系统,地址,平台,电脑,环境,网上,工具,名字,名称,windows环境下的linux模拟软件1、首先需要打开电脑里的VirualBox软靠谱的Python爬虫框架都有哪几个?
靠谱的Python爬虫框架都有哪几个?,官网,培训,爬虫,专文,框架,统计数据,辅助工具,网页,程序,以下内容,一些同学普遍认为仅剩Python才能够顺利实Python的Unittest单元测试使用详解
Python的Unittest单元测试使用详解,地址,位置,网站,信息,分析,工具,培训,系统,例子,目标,PytheM是一个Python渗透测试框架。它只能在osnGNU/LPython图形应用GUI开发框架
Python图形应用GUI开发框架,平台,代码,工具,做好,成都,行业,第三,图片,设备,数据,作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发十个Python Web应用开发框架
十个Python Web应用开发框架,系统,工具,项目,设计,技术,支柱,软件,网站,信息,标准,python是一门动态、面向对象语言。其最初就是作为一门面向python的单元测试框架
python的单元测试框架,代码,生态,信息,标准,测试,分析,工具,环境,条款,活跃,1、AutotestAutotest是Google、Redhat、IBM公司联合开发的分布式python 的异步框架模型
python 的异步框架模型,暂停,流程,状态,地方,概念,培训,时间,任务,队列,框架,python提供了asyncio模块来支持异步编程,其中涉及到coroutines、Python数据结构的时间复杂性
Python数据结构的时间复杂性,时间,项目,情况,平均,复杂度,培训,术语,数据,状态,操作,1.让我们了解大O符号的含义是什么?在算法中执行许多操作优秀的GUI Python框架
优秀的GUI Python框架,平台,代码,网站,包装,设备,系统,项目,软件,技术,工具,由于Python越来越受欢迎,并得到广泛采用,它将成为2020年流行起来的