浅谈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/ 查看参阅

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • h2数据库的使用_h2数据库查看数据

    h2数据库的使用_h2数据库查看数据h2dh​​​​​​​ArchiveDownloads1h2数据库的下载地址2.H2软件包目录结构h2 |—bin ||—h2-1.1.116.jar  //H2数据库的jar包(驱动也在里面) ||—h2.bat  //Windows控制台启动脚本 ||—h2.sh  //Linux控制台启动脚本 ||—h2w.bat  //Windows控制台启动脚本(不带黑屏窗口) |—docs  //H2数据库的帮助文档(内有H2…

    2022年10月9日
    3
  • 算法分析与设计论文

    算法分析与设计论文1:递归算法程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。递归算法是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。它通常把一个大型复杂的问题转化为一个与原问题

    2022年8月2日
    7
  • Java开发手册之异常处理

    Java开发手册之异常处理Java开发手册之异常处理

    2022年4月22日
    299
  • vs2008 sp1怎么安装_怎么安装vs2015

    vs2008 sp1怎么安装_怎么安装vs2015转自:  http://blog.csdn.net/binbb521/article/details/5519315先从微软网站下载补丁.    下载地址1为:http://download.microsoft.com/download/6/3/c/63c69e5d-74c9-48ea-b905-30ac3831f288/VS80sp1-KB926601-X86-E

    2022年10月6日
    4
  • java 仓库管理系统源码[通俗易懂]

    java 仓库管理系统源码[通俗易懂]系统操作权限管理。系统提供基本的登入登出功能,同时系统包含两个角色:系统超级管理员和普通管理员,超级管理员具有最高的操作权限,而普通管理员仅具有最基本的操作权限,而且仅能操作自己被指派的仓库。 请求URL鉴权。对于系统使用者登陆后进行操作发送请求的URL,后台会根据当前用户的角色判断是否拥有请求该URL的权限。 基础数据信息管理。对包括:货物信息、供应商信息、客户信息、仓库信息在内的基础数据信…

    2022年9月23日
    3
  • python数组截取

    python数组截取importtensorflowastfimportnumpyasnp#one-dimentiona=np.array([0,1,2,3,4,5,6,7,8,9])print(a)b=a[:4]print(b)c=a[4:]print(c)#multi-dimentiond=np.array([[0,1,2,3,4,5,6,7,8,9],[1,2,3,4…

    2022年4月30日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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