mock技术在测试中的应用

2023-09-12 15:13:16

技术简介

mock技术又叫测试桩、挡板

在软件测试中,对于一些不容易构造、获取的对象,用一个虚拟的对象来代替它,以达到相同的效果,这个虚拟的对象就是mock。

mock技术并不是只有测试领域用,最早是在开发领域应用,典型例子:前后端联调。比如一个功能,前端功能写完了,但是后端还没做好,前端可以使用mock技术模拟后端发过来的数据,查看效果。

测试行业中的应用场景

1.某个新需求,开发未完成,测试人员使用mock技术,把新增的业务使用mock技术模拟出来,进行初步测试,等开发人员开发完成,再进行真实环境测试。

2.在项目中,经常会用到很多第三方接口,比如充值、防沉迷验证。第三方接口返回效率低、环境搭建麻烦,可以使用mock技术,先测试整体流程。

怎么用mock?

1.测试团队开发–技术要求高,使用django、flask等

2.使用现成工具 postman、fiddler等

3.不写代码,使用框架(moco)去创建mock moco.jar+xxx.json (简单)

mock服务

实现mock的技术有很多,这些技术中,可以分为两类–mock数据和mock服务。

mock数据:即mock一个对象,写入一些想要的数据,通过它进行自己想要的测试,常用的有:EasyMock、WireMock等,多用于单元测试。
mock服务:即mock一个sever,构造一个依赖服务并给予他预期的服务返回值,适用范围广,更加适合集成测试,如moco框架。
本文主要介绍测试中常用的moco框架。

moco可以理解为一个mock的工具框架,一个简单搭建模拟服务器的工具,下载下来是一个jar包。

特点:

1.只需要简单地配置request、response等即可满足需求

2.支持http、https、socket协议,非常灵活

3.支持在request中设置Headers、Cookies、StatusCode等

4.支持get、post、put、delete等请求方式

5.无需环境配置,有Java环境即可

6.支持热更新,修改配置后,立即生效,只需要维护接口即可

7.支持多种数据格式,如json、text、xml、file等

8.可与其他工具集成,如Junit、Maven等

mock服务环境搭建

mock服务搭建很简单,moco框架是用java开发的,所以启动moco前,需要安装java环境–jdk。

1.下载moco

github下载地址:GitHub - dreamhead/moco: Easy Setup Stub Server
在这里插入图片描述
点击这个直接下载即可。如果打不开网址,也可以在公众号后台回复‘moco’直接获取jar包

2.写一个简单的配置文件

我们在刚才下载的jar包目录下写一个最简单的json配置文件
在这里插入图片描述

我们写2组数据,根据url返回相应的数据。

url是‘xpzc’则返回‘Hello,自动化测试研习社’

url是‘dah’则返回‘奥运健儿加油!!!’

注意:json里的url要写成‘uri’
在这里插入图片描述

json里面的key名是有规则的,不能随意写,否则jar包读取不到会报错的。

description:注释/描述
request:请求数据
uri:即url,接口的统一资源标识符,可根据接口自定义
method:请求方式,默认为get请求

response:返回的数据
text:返回text格式

3.启动moco

有了jar包和json数据,就可以启动moco了。

打开cmd,切到jar包所在的路径,执行指令:

java -jar jar包名 请求方式 -p 端口号 -c json文件

例如:java -jar moco-runner-1.3.0-standalone.jar http -p 9999 -c test1.json

jar包名称对应自己下载的jar包名
请求方式包括http、https、scoket协议等
-p 端口号,就是我们自己定义的端口号,避开8080、3360这些常用的即可

-c json文件,就是我们前边写的json文件名
在这里插入图片描述
出现如图信息就启动成功了。

4.验证

这时候就可以打开浏览器验证下了。
在这里插入图片描述
这样,我们自己模拟的后端就设置完成了。

5.解决中文乱码问题

在调试过程中,我们发现当响应数据里有中文时,浏览器会显示乱码。
在这里插入图片描述
解决办法:

在配置文件response中添加设置编码格式为GBK

在这里插入图片描述

mock技术构建请求

moco还可以通过在json文件中添加header、重定向、指定返回数据类型等参数,模拟实际工作中各种情况下的请求和返回值。

1.完善配置文件

先把json文件完善下,配置一些常用的请求。

[ 
{
    "description":"约定URI",
    "request":{
        "uri":"/xpzc"
        },
    "response":{
  "headers":{
                "Content-Type":"text/html;charset=gbk"
            },
        "text":"Hello,自动化测试研习社"
    }
},
{
    "description":"约定URI",
    "request":{
        "uri":"/dah"
        },
    "response":{
  "headers":{
                "Content-Type":"text/html;charset=gbk"
            },
        "text":"奥运健儿加油!!!" 
 }
},
{
    "description":"demo3-约定请求体参数form",
    "request":{
        "uri":"/demo3",
        "forms":{
            "key1":"abc"
            }
        },
    "response":{
        "text":"Hello,demo3"
    }
},
{
    "description":"demo4-约定请求体参数json",
    "request":{
        "uri":"/demo4",
        "json":{
                "key1":"abc",
                "key2":"def"
            }
        },
    "response":{
        "text":"Hello,demo4"
    }
},
{
    "description":"demo5-uri-startsWith匹配",
    "request":{ 
        "uri":{
                "startsWith":"/demo5"
            }
        },
    "response":{
        "text":"这是demo5"
    }
},
{
    "description":"demo6-返回json格式的数据",
    "request":{
        "uri":"/demo6"
     }, 
    "response":{
        "json":{"key1":"hello","key2":"world"}
    }
},
{
    "description":"demo7-重定向",
    "request":{
        "uri":"/demo7"
    },  
    "redirectTo":"https://www.baidu.com/"
}
]

2.通过代码构建请求

1.模拟重定向

import requests
host = 'http://127.0.0.1:9999'
def mock():
    url = f'{host}/demo7'
    resp = requests.get(url=url)
    print(resp.url)
    return resp

if __name__ == '__main__':
    mock()

 返回
在这里插入图片描述
2.模拟返回json格式的数据

import requests
host = 'http://127.0.0.1:9999'
def mock():
    url = f'{host}/demo6'
    resp = requests.get(url=url)
    print(resp.text)
    return resp

if __name__ == '__main__':
    mock()

 返回
在这里插入图片描述
总结

掌握了mock测试的技术,可以让我们在开发没有完成对应接口的时候,有接口文档就提前进入到测试状态(也就是大家常说的‘测试左移’),是现在敏捷模式下不可或缺的技术,也是持续集成中一个重要的组成部分。

Moco是热更新的,所以启动了jar包的服务之后,即使修改了json文件中的内容,也不需要重启服务就生效。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

更多推荐

持安科技孙维伯:零信任理念下的实战攻防:ISC2023数字小镇演讲

近日,在ISC2023第十一届互联网安全大会上,持安科技联合创始人孙维伯作为零信任办公安全赛道代表,亮相数字小镇New50,并发表《全方位防御:零信任理念下的实战攻防》主题演讲。以下是本次演讲实录:这几年,网络安全已经从监管合规趋向于实战化,网络诈骗、黑产越发猖獗,企业面临的安全挑战愈加严峻。在实战攻防的场景下,攻防双

Nginx 服务器 SSL 证书安装部署

操作场景本文档指导您如何在Nginx服务器中安装SSL证书。说明本文档以证书名称xxx为例。Nginx版本以nginx/1.18.0为例。当前服务器的操作系统为CentOS7,由于操作系统的版本不同,详细操作步骤略有区别。安装SSL证书前,请您在Nginx服务器上开启HTTPS默认端口443,避免证书安装后无法启用HT

2、从“键鼠套装”到“全键盘游戏化”审核

1、风行内容仓的增效之路-前言内容仓成立初期,安全审核组是规模最大的小组,占到部门人数的半壁江山,因此增效工作首先就从安全审核开始。早期安全审核每天的达标值在800条左右,每天的总审核量不到1万,距离业务部门期望的数量差距较大。我找到相关同事,讨论如何提高每天的审核产出,同事反馈说,感觉没有什么方法,部门内部已经做过测

孙宇晨出席米尔肯研究院亚洲峰会:持续推动行业破圈 亚洲将成重要加密中心

9月14日,波场TRON创始人、火币HTX全球顾问委员会成员孙宇晨受邀出席2023米尔肯研究院亚洲峰会(2023MilkenInstituteAsiaSummit),与前美国驻新加坡大使、WagarGlobalAdvisors咨询公司主席KirkWagar就加密行业未来趋势相关问题进行了深度对话。孙宇晨在对谈中表示,稳

DETR 系列 Mask Frozen-DETR: High Quality Instance Segmentation with One GPU 论文阅读笔记

DETR系列MaskFrozen-DETR:HighQualityInstanceSegmentationwithOneGPU论文阅读笔记一、Abstract二、引言三、相关工作目标检测实例分割讨论四、本文的方法4.1Baseline设置结果实验设置4.2图像特征编码器DeformableencoderblockSwi

AI实战营第二期 第九节 《底层视觉与MMEditing》——笔记10

文章目录AI实战营第二期第九节《底层视觉与MMEditing》什么是超分辨率图像分辨率的目标应用方向超分的类型单图超分的解决思路深度学习时代的超分辨率算法SRCNNFastSRCNNSRResNet感知损失VS.均方误差均方误差感知损失对抗生成网络GAN应用于超分辨率如何学习生成器网络对抗训练GAN优化目标DCGANS

基于SpringBoot+Vue的餐饮管理系统设计与实现

前言💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗👇🏻精彩专栏推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选

Spring Cloud 负载平衡的意义什么?

目录一、什么是负载平衡二、为什么需要负载平衡三、SpringCloud如何实现负载平衡四、负载平衡的nginx配置一、什么是负载平衡负载平衡是指将网络流量在多个服务器之间分布,以达到提高系统性能、增强可靠性和提供更好用户体验的目的。在负载平衡的架构中,多个服务器被组织成一个集群,共同处理用户的请求。负载平衡的主要作用有

Hive的基本SQL操作(DDL篇)

目录​编辑一、数据库的基本操作1.1展示所有数据库1.2切换数据库1.3创建数据库1.4删除数据库1.5显示数据库信息1.5.1显示数据库信息1.5.2显示数据库详情二、数据库表的基本操作2.1创建表的操作2.1.1创建普通hive表(不包含行定义格式)2.1.2创建自定义行格式的hive表2.1.3创建默认分隔符的h

FPGA原理与结构(16)——时钟IP核的使用与测试

系列文章目录:FPGA原理与结构(0)——目录与传送门一、前言本文介绍xilinx的时钟IP核ClockingWizardv6.0的具体使用与测试过程,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考:FPGA原理与结构——时钟IP核原理学习https://blog.csdn

做题(1)

1.fileinclude打开发现提示flag在flag.php里边查看页面源代码$lan=$_COOKIE['language'];这句话是关键变量lan是用cookie传参的@include("english.php");这句话表明了文件包含include函数用php伪协议filer绕过@include($lan.

热文推荐