`

隐藏在mock之后的‘快感’

阅读更多
原帖地址:http://www.cnblogs.com/whitewolf/archive/2013/05/29/3107019.html

      最近某同事抱怨他们的测试难写,经常花费在测试的时间比产品代码更多,而且每次重构后都必须修改一大堆的测试。和同事闲谈后得知,在其项目中大量的使用了mock,或者说对mock的使用过度极端对所谓的单元测试“快速”,“独立“的过度。 在前边转载过《软件开发中没有所谓正确的方法》,当你把某一种方法论作为银弹使用的时候,早晚魔鬼会伴随在你身边。

     Mock给我带来了感知,剥离了类与类之间的依赖,有助于我们更好的工作在当前的关注点 .但同时由于太多的对场景的假设,导致这块代码成为了信息的孤岛,甚至很多时候不得不用mock的第二特性verify,order,以至于你的测试关心的不再是代码存在的business逻辑,而倾向代码层面的设计实现,这就把你单元测试推向了“白盒测试“的位置,导致测试变为脆弱的测试。每当简单的重构导致内部的变化,你的测试也必须随着改变。

     鄙人认为作为一个好的测试而言,在一次合法的简单重构之下,是不需要修改测试的,因为你修改的只是内部实现,而不是business的改变,如果你边改测试边重构或者重构后挂到一大堆测试,这意味这你的测试不是一个稳定的测试或者你不是一次合法的重构(也许redesign,override)。

     在同事的项目中对mock的极端到了对简单的View Object 也采用builder模式,可是内部却全是mock given。在我看来而言View Object只是一个简单的数据载体,不存在行为逻辑,我们毫无必要去做mock,mock该是针对假设,而应该尽量避免对状态mock。在同事的项目中导致需要写一个测试之前,作为测试的准备given ,必须理解存在代码的实现,因为你需要一堆given,比如对于person对象,如果你在实现中需要得到account则:

given(person.getAccount()).willReturn(some account);

     导致我需要了解实现需要什么property,如果我需要新的的property也许只是简单的把某个“依恋情结”放入了object,测试也需要被修改,导致重构者对自己的重构并不那么自信,这将影响重构成为日常行为,随着堆积的”坏味道“这将一点一点的侵蚀你的代码,项目慢慢的也许会不能的不可控。

     Mock并不是一个坏的东西,结果的好坏在于使用的人,团队 的意识,如果是mock anywhere或者杜绝mock走向两个任意的极端都将是一个错误的抉择。

     Mock更多的使用场景为对外界资源解依赖增强感知能力,以及对无响应的重要business的验证,后者长体现于一个没有返回子void的method,但是method比如增加用户积分,记录用户信息等的。然而对于有响应的business,我需要的不是mock而应该是assert,对于测试来说对于business来说应试是我的输入应该得到我预期的响应,而非我verify某个行为发生了,那么其结果一定就正确,当然对于实现来说这是成立的,但是从测试的价值来说这厮无意义的,这将是一个脆弱的测试,我认为一个好的测试将是“黑盒测试“,是一个business的描述,对一份约定,契约的阐述。

      附言,如果你因为测试的速度,独立性来为自己的mock证明,那将是无意义的,不是每一个测试都必须在黄金法则内(0.1s),如果你对外部依赖,耗时依赖的分离,这我相信将不再是问题所在,测试的优化将是另一个有趣的话题,将不是本问内容之列。

 

 

本文链接

分享到:
评论

相关推荐

    mockServer,mock服务端

    MockServer 是一个强大的工具,主要用于在开发过程中模拟服务器行为,特别是在接口开发和测试阶段。它允许开发者在没有实际后端服务的情况下,创建模拟的HTTP和HTTPS服务器,以便于快速验证前端代码或者自动化测试。...

    Mock

    Mock技术在软件开发中扮演着重要的角色,尤其是在测试领域。它允许开发者在不依赖实际环境或第三方服务的情况下,创建模拟对象来代替真实组件,以便进行单元测试和集成测试。这样可以提高测试效率,减少测试复杂性,...

    Mock是一个零侵入的服务端Mock平台,底层基于JVM Sandbox。相比于Fiddler、-mock-fe.zip

    Mock是一个强大的服务端模拟工具,它的核心特性是零侵入性,这意味着在你的实际项目代码中无需进行任何修改,即可实现服务的模拟。这极大地提高了开发效率,特别是在进行集成测试或者依赖于其他服务但又无法实时访问...

    基于python的mock测试数据练习

    Python 提供了一个强大的库——`unittest.mock`,用于模拟(mock)对象、方法和类,以便在测试中隔离依赖关系,专注于测试目标代码的功能。本练习主要关注如何使用 `unittest.mock` 进行mock测试数据。 一、Mock...

    mock在ut中的使用

    mock

    mock

    Mock技术在软件开发中扮演着重要的角色,尤其是在测试阶段。它允许开发者在真实环境尚未准备好或不可用时,创建模拟对象来替代实际依赖,以便进行功能验证和性能测试。本项目涉及的内容是关于如何在Windows或Linux...

    spring-mock.jar

    Classes contained in spring-mock.jar: org.springframework.mock.jndi.ExpectedLookupTemplate.class org.springframework.mock.jndi.SimpleNamingContext.class org.springframework.mock.jndi....

    模拟mock.zip

    在IT行业中,Mock技术是一种非常重要的测试方法,特别是在前端开发中。它允许开发者在不依赖实际后端服务的情况下,对应用程序进行单元测试和集成测试。`模拟mock.zip`这个压缩包文件显然与Mock技术相关,其中包含的...

    Centos7下mock安装rpm

    在Linux系统管理中,`Mock`是一个非常有用的工具,尤其对于开发者和打包人员而言,它能够在隔离环境中构建RPM软件包。在CentOS 7环境下,`Mock`可以帮助我们在不干扰系统其他组件的情况下测试和构建RPM包。下面将...

    mock数据.doc

    在使用 Mock.js 之前,需要创建一个单独的文件夹来存放 Mock.js 的模拟数据。然后,在 main.js 文件中引入 Mock.js 并定义模拟数据。例如: ```javascript // 引入 Mock.js const Mock = require('mockjs'); // ...

    mockserver1.zip

    在软件开发中,尤其是在测试阶段,MockServer可以替代真实的后端服务,允许开发者在没有实际依赖的情况下进行单元测试和集成测试。这个“mockserver1.zip”文件包含了启动和使用MockServer所需的一些基本组件和配置...

    Django_mock.rar

    Mock系统在软件开发中起着至关重要的作用,特别是在测试阶段,它可以模拟真实的服务,帮助开发者在不依赖外部接口或者数据库的情况下进行单元测试和集成测试。现在我们来详细探讨一下如何使用Django来搭建一个Mock...

    0积分:Mock对象教程

    ### 使用Mock对象在Java单元测试中的重要性及实践 #### 引言 在软件开发过程中,单元测试作为确保代码质量的重要环节,其有效性往往受到多种因素的影响,尤其是当待测方法依赖于外部资源如网络、数据库或其他复杂...

    Mock搭建资源

    在IT行业中,Mock技术是一种非常重要的工具,尤其在软件开发的早期阶段,它能帮助团队在后端服务未完成时就开始进行前端或移动端的开发工作。"Mock搭建资源"这个主题,主要是关于如何创建和使用Mock服务器来模拟实际...

    mock 测试.pptx

    在测试过程中,Mock 对象可以帮助开发者更好地测试单元测试、集成测试和系统测试。下面是 Mock 测试的详细介绍和 Fiddler AutoResponder 面板的使用方法。 什么是 Mock 测试? -------------------- Mock 测试是一...

    mock学习资料

    Mock技术在软件开发中扮演着至关重要的角色,尤其是在单元测试和集成测试中。Mocking允许开发者模拟复杂的系统组件,如数据库、网络接口或第三方服务,以便在不依赖真实环境的情况下测试代码。以下是对"mock学习资料...

    服务端Mock测试基础原理讲解

    服务端Mock测试是一种在软件开发中广泛应用的技术,它允许测试工程师在没有依赖服务端的真实环境或者服务尚未完成时进行测试工作。Mock技术通过模拟真实的服务端行为,使得测试人员能够在本地模拟各种网络交互,从而...

    googlemock

    在本文中,我们将深入探讨GoogleMock的基本概念、用途、安装过程以及如何在项目中使用它。 1. **GoogleMock基础** GoogleMock基于GoogleTest框架,允许开发者模拟复杂对象的行为,以便在测试中隔离被测试代码。它...

Global site tag (gtag.js) - Google Analytics