浅谈Mock测试

浅谈Mock测试一、Mock测试的定义 Mock就是在测试过程中,对于一些不容易构造/获取的对象,创建一个Mock对象来模拟对象的行为 二、Mock测试的作用 1、为什么要做Mock: 在对代码进行单元测试过程中,经常会有以下的情况发生: classA依赖classB和classC classD依赖classC和classE classB依赖…..

大家好,又见面了,我是你们的朋友全栈君。

一、Mock测试的定义


Mock就是在测试过程中,对于一些不容易构造/获取的对象,创建一个Mock对象来模拟对象的行为

 

二、Mock测试的作用

1、 为什么要做Mock:

在对代码进行单元测试过程中,经常会有以下的情况发生:

 


class A 依赖 class B 和 class C

class D 依赖 class C 和 class E

class B 依赖 …

class E 依赖 …

浅谈Mock测试

1.被测对象依赖的对象构造复杂

我们想对class A进行单元测试,需要构造大量的class B、C、D等依赖对象他们的构造步骤多、耗时较长) ,这时我们可以利用mock去构造虚拟的class B、C、D 对象用于class A的测试,因为我们只是想测试class A的行为是否符合预期,我们并不需要测试依赖对象,如下图所示:

浅谈Mock测试

2.被测单元依赖的模块尚未开发完成,而被测对象需要依赖模块的返回值进行测试:

— 比如service层的代码中,包含对dao层的调用,但dao层代码尚未实现

— 比如web的前端依赖后端接口获取数据进行联调测试,但后端接口并未开发完成(主要针对前后端联调)

 

 

 

2、 Mock的好处

 

  • 团队并行工作
    团队间不需互相等待对方进度,只需约定好相互之间的数据规范(接口文档),即可使用 mock 构建出可用接口,然后尽快进行开发和自测,提前发现缺陷
  • 测试驱动开发 TDD (Test-Driven Development)
    单元测试是 TDD 实现的基石,而 TDD 经常会碰到协同模块尚未开发完成的情况,但有了 mock,当接口定义好后,测试人员就可以创建一个 Mock,把接口添加到自动化测试环境,提前创建测试。
  • 测试覆盖率
    若一个接口在不同的状态下要返回不同的值,常见做法是复现这种状态然后再去请求接口,而这种方法很可能因操作时机或方式不当导致失败,甚至污染后端存储如数据库等, 但用 mock 则不用担心
  • 隔离系统
    使用某些接口时,为避免系统数据库被污染,可以将接口调整为 Mock 模式,以保证数据库纯净。
  • 方便演示

 

 

 

 

三、Mock测试的手段

1、工具

1、使用Yapi进行Mock

YApi是去哪儿网移动架构组开发的一个开源项目,YApi的 Mock 功能可以根据用户的输入接口信息如协议、URL、接口名、请求头、请求参数、返回数据、生成 Mock 接口,这些接口会自动生成模拟数据,创建者可以自由构造需要的数据。mock模拟数据基于mock.js。

Mock.js 是一款模拟数据生成器,旨在帮助前端独立于后端进行开发,帮助编写单元测试。提供了以下模拟功能:
  • 根据数据模板生成模拟数据
  • 模拟 Ajax 请求,生成并返回模拟数据
  • 基于 HTML 模板生成模拟数据

开发在初期定义好接口规范之后,录入Yapi,这时我们就可以使用Yapi提供的“高级Mock”功能进行接口Mock,以“获取方案详情”接口为例,我们可以对接口的不同返回状态进行数据Mock,配置如下:

Normal:

模拟正常返回

 

1、 配置Yapi

浅谈Mock测试

 

 

浅谈Mock测试

2、找到Mock地址

浅谈Mock测试

 

3、使用Postman等接口工具进行模拟请求

浅谈Mock测试

 

  •  

模拟正常返回-方案不存在

1、配置Yapi

浅谈Mock测试

 

2、使用Postman等接口工具进行模拟请求

浅谈Mock测试

 

模拟服务器异常-500

 

1、配置Yapi

浅谈Mock测试

2、使用Postman等接口工具进行模拟请求

浅谈Mock测试

 

 

 

 

公司也有自己的Mock平台,操作和Yapi类似,这边就不展开陈述

2、使用RAP进行Mock

RAP是阿里团队出的一款接口管理工具,帮助开发人员有效的管理接口文档。包括阿里集团在内的三百五十多个企业都在使用RAP管理重要的接口文档。

  • Web接口管理工具,接口自动化,MOCK数据自动生成,自动化测试

  • 能够通过分析接口结构自动生成Mock数据、校验真实接口的正确性

  • 阿里产品,功能完善、结合了文档、Mock.js、可视化、Rest、接口过渡、文档修改提醒、支持本地部署

3、使用Moco进行Mock

Moco 是一个简单搭建 stub 的框架,主要用于测试和集成。

Moco本身支持API和独立运行两种方式。通过使用API,开发人员可以在JUnit、JBehave等测试测试框架里使用Moco,极大程度地降低了集成点测试的复杂度

Moco可以提供以下服务:

  • HTTP APIs

  • Socket APIs

  • REST API

这个在下面的服务端Mock中会讲到

4、工具对比

接口测试Mock工具对比

 

Yapi

Rap

Moco

方便集成 ×
Mock简便性
文档管理 × ×
开源程度
部署难度
可视化界面 ×

 

 

2、服务端Mock

服务端mock:

  • 1. 提供真正mock-http服务
  • 2. 拦截request请求,判断请求的分支(通过程序或配置文件)
  • 3. 返回response,由mock-http服务提供响应数据
  • 4. 或者forward,跳到其他服务url

浅谈Mock测试

服务端提供的Mock方式有很多种,主要分为单测级别(如easymock、jMock、Mockito、Unitils Mock、PowerMock等),接口测试级别(如Mockserver、Moco等),本次分享主要以Moco为例,讲解服务端Mock的基本使用:

Moco技术文档:https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md

1、通过Moco模拟接口测试mock数据

moco的优点:

1.只需要简单的配置request、response等即可满足要求,支持http、https、socket。可以说是非常的灵活性。
2.支持在request 中设置 Headers , Cookies , StatusCode等。
3.对GET、POST、PUT、DELETE等请求方式均支持,很适合web开发。
4.无需环境配置,有java环境即可。
5.修改配置后,立刻生效。只需要维护接口,也就是契约即可。
6.对可能用到的数据格式都支持,如json、text、xml、file等。
7.还能与其他工具集成,如Junit、Maven、Gradle等。

获取Moco

 

配置Moco

  1. 配置json文件;
  2. 通过配置文件 mocoTest.json 运行Moco HTTP服务
[
  {
    "description": "mockDemo",
    "request": {
      "uri": "/demo"
    },
    "response": {
      "headers":{
        "Content-Type":"application/json;charset=UTF-8"
      },
      "text": "mocoresponse"
    }
  }
]

执行Moco

java -jar moco-runner-1.2.0-standalone.jar http -p 8888 -c mocoDemo.json

 

 

 

moco还有一个好处,就是json配置是热加载的,可以通过更改json文件进行实时的数据配置更新。

mock一个“获取方案详情”的例子

代码如下:

[
    {
        "request": {
            "uri": "/saas-design/api/design/plan/test/detail",
            "method": "get",
            "headers": {
                "content-type": "application/json;charset=UTF-8"
            }
        },
        "response": {
            "json": {
                "c": "enim dolore ut elit Ut",
                "m": "consequat elit ve",
                "d": {
                    "designId": "test",
                    "planId": "test",
                    "designName": "test",
                    "planType": "tempor irure Excepteur non",
                    "planCity": "ut occaecat commodo et ex",
                    "communityName": "amet ",
                    "coverPicId": "in",
                    "userId": "consequat id aute",
                    "area": -98167778.83367354,
                    "srcArea": 78365468.30601966,
                    "desc": "consequat in",
                    "formatModifiedTime": null,
                    "privateStatus": true,
                    "floorPlanAddress": "dolor eu",
                    "isHouse": false,
                    "isPlanOwner": false,
                    "isReplicable": false,
                    "tags": [
                        "proid"
                    ],
                    "brandPackage": {
                        "packageName": "laboris Excepteur"
                    },
                    "coverPic": "anim laboris est",
                    "modifiedTime": -46789762.621906884,
                    "privateAttributeStatus": -10654500.438538507
                }
            }
        }
    },{
        "request": {
            "uri": "/saas-design/api/design/plan/test1/detail",
            "method": "get",

            "headers": {
                "content-type": "application/json;charset=UTF-8"
            }
        },
        "response": {
            "json": {
                "c": "-1",
                "m": "amet",
                "d": "design not exist!"
            }
        }
    },{
             "request": {
                 "uri": "/saas-design/api/design/plan/test2/detail",
                 "method": "get",
                 "headers": {
                     "content-type": "application/json;charset=UTF-8"
                 }
             },
             "response": {
                 "status": 500,
                 "text":"<html>servier error</html>"
             }
         }
]

模拟正常返回-方案存在

浅谈Mock测试

 

模拟服务端错误

浅谈Mock测试

此外,moco还有很多功能,如重定向,延时,接收异步请求等,请移步技术文档进行查阅~

 

3、客户端Mock

客户端mock:

  • 1. 浏览器客户端Js-URL拦截
  • 2. 模拟数据

浅谈Mock测试

 

客户端mock常用的是axios类,使用方法与客户端mock类似,请移步技术文档:http://www.axios-js.com/zh-cn/docs/ 查看参阅

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151398.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • MySQL修改表名注释「建议收藏」

    MySQL修改表名注释「建议收藏」MySQL修改表名注释altertabletest1comment’修改后的表的注释’;

  • JAVA外文参考文献_java参考文献近五年

    JAVA外文参考文献_java参考文献近五年java论文英文的参考文献相关内容:欢迎浏览,小编为你提供的一篇关于英文毕业论文提纲的毕业论文提纲!1Introduction1.1Significanceoftheresearch1.2Organizationofthethesis2LiteratureReview2.1Researchesonmonolingualmentallexicon2.1…..

  • PyYAML中文文档「建议收藏」

    PyYAML中文文档「建议收藏」PyYAML文档PyYAML现在维护在https://github.com/yaml/pyyaml。此页面仅用于历史目的。英文文档链接:http://pyyaml.org/wiki/PyYAMLDocumentation安装下载源码包PyYAML-3.12.tar.gz并解压缩。转到目录PyYAML-3.12并运行$pythonsetup….

  • JAVA客户端功能的实现QQ_java实现QQ聊天(JFrame客户端+服务器)

    JAVA客户端功能的实现QQ_java实现QQ聊天(JFrame客户端+服务器)【实例简介】用java实现简易QQ聊天工具,具有JFrame客户端和服务器,可以体验登陆、多人之间聊天、服务器后台管理等功能。【实例截图】【核心代码】QQ聊天工具└──简易版QQ聊天工具├──QQClient│├──QQClient.cfg│├──QQClient.exe│├──QQClient.jar│├──id││└──id.txt│└─…

  • java typereference_Java泛型 | Jackson TypeReference获取泛型类型信息「建议收藏」

    java typereference_Java泛型 | Jackson TypeReference获取泛型类型信息「建议收藏」前言Jackson是一个比较流行的Json序列化和反序列化框架。本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理。对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案。实例JacksonObjectMapper的readValue可以将Json字符串反序列化为Java对象。如下例中将[{“id”:n…

  • [Pycharm] 远程连接服务器「建议收藏」

    [Pycharm] 远程连接服务器「建议收藏」1.选择远程python解释器File->Settings->Project->PythonInterpreter点击+号其中Host是服务器的固定IPUsername是服务器上创建的自己的用户名(注意在服务器上创建用户的时候,记住用户名和密码)Next,Next,因为服务器中会安装多个Python环境,在Interpreter中可以指定不同的虚拟环境。在Linux中,通常在/data和/home中都会创建自己用户名的文件夹,虚拟环境由于占内存较多,通常存储在/d

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号