浅谈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)
blank

相关推荐

  • Android Studio中Intel HAXM的那些坑「建议收藏」

    Android Studio中Intel HAXM的那些坑「建议收藏」最近用过两台电脑折腾AndroidStudio,都是windows的系统,不知道为什么连着踩了两个坑。第一台我结束了qemu-system-i386.exe这个倒霉的进程导致我开启模拟器的时候一直提示我没有安装IntelHAXM,没办法咯,只好再安装一遍,然后奇葩的事情就发生了,出现了以下问题。Excuseme?我CPU虚拟化是开启的呀。这是什么鬼?安装了一次,不…

  • Scala Hello 示例

    Scala Hello 示例

    2021年12月17日
  • Access denied for user ‘root‘@‘localhost‘问题的解决「建议收藏」

    Access denied for user ‘root‘@‘localhost‘问题的解决「建议收藏」问题场景在阿里云上部署了一台服务器,CentOS6.8系统环境,安装了MySql+Nginx+Git+vsftpd等软件,在本地Linux终端以非root账户SSH远程登录服务器,在将项目打包发布时遇到如题所示问题。代码中配置文件里的用户名不是“root”,密码正确,且该用户名和密码是配置在服务端数据库的用户表中的。但是在用浏览器调用跟数据库交互接口时出错:尝试解决网上搜了一堆文章,主要集中在(1…

    2022年10月28日
  • 比特币矿机哪种型号好_不考虑电费哪个矿机最好

    比特币矿机哪种型号好_不考虑电费哪个矿机最好矿机电源对于比特币矿机来说至关重要,毕竟挖矿中矿机稳定运行是非常重要的,而矿机电源就是保障比特币矿机稳定运行的重要法宝。现在矿机电源应用范围那么高,说明在技术,还有设备方面都完善了很多,而且完善之后的矿机,在做工跟加工方面都好很多,提高了很多,这是非常重要的一点,不管是在哪几个方面,在生产量方面也会越来越好,随着现在时代的不断的改变,矿机电源的应用会越来越精细化。因为比特币挖矿需要多显卡多芯片…

  • java拦截器handler_java拦截器HandlerInterceptor的preHandle、postHandle与afterCompletion三个方法…

    java拦截器handler_java拦截器HandlerInterceptor的preHandle、postHandle与afterCompletion三个方法…preHandle调用时间:Controller方法处理之前执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行若返回false,则中断执行,注意:不会进入afterCompletionpostHandle调用前提:preHandle返回true调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这…

发表回复

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

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