浅谈Mock测试

一、Mock测试的定义


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

 

二、Mock测试的作用

1、 为什么要做Mock:

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

 


class A 依赖 class B 和 class C

class D 依赖 class C 和 class E

class B 依赖 ...

class E 依赖 ...

浅谈Mock测试_第1张图片

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

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

浅谈Mock测试_第2张图片

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测试_第3张图片

 

 

浅谈Mock测试_第4张图片

2、找到Mock地址

浅谈Mock测试_第5张图片

 

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

浅谈Mock测试_第6张图片

 

  •  

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

1、配置Yapi

浅谈Mock测试_第7张图片

 

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

浅谈Mock测试_第8张图片

 

模拟服务器异常-500

 

1、配置Yapi

浅谈Mock测试_第9张图片

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

浅谈Mock测试_第10张图片

 

 

 

 

公司也有自己的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测试_第11张图片

服务端提供的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

  • Download Standalone Moco Runner

 

配置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":"servier error"
             }
         }
]

模拟正常返回-方案存在

浅谈Mock测试_第12张图片

 

模拟服务端错误

浅谈Mock测试_第13张图片

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

 

3、客户端Mock

客户端mock:

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

浅谈Mock测试_第14张图片

 

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

 

你可能感兴趣的:(测试,mock,测试开发,软件测试)