百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

走进Java接口测试之Mock(概念篇)

lipiwang 2024-12-01 00:42 5 浏览 0 评论

一、引言

实际工作中,测试人员可能会遇到如下情况:

  • 场景一:依赖接口不通,甲开发A模块,乙开发B模块,甲的进度比乙快,但A模块的方法依赖于B模块,要测试A模块接口怎么办?
  • 场景二:异常数据难模拟,当需要测试接口一些异常数据,接口正常情况是否无法提供异常数据的。那么如何简便地构造接口的异常数据?
  • 场景三:依赖接口性能参数无法保障。在对接口性能压测的时候,需要下游接口及时返回数据,满足上游接口的调用频度。在依赖接口多的情况下,如何减轻工作量?

二、Mock 的定义

在性能基础之浅谈常见接口性能压测文中,我们有简单介绍过 Mock ,本文将详细阐述 Mock 概念。 在接口测试过程中,对于某些不容易构造或者不容易获取的对象,我们常常会用一个虚拟的对象代替以便测试。在具体的测试过程中,我们经常会碰到需要模拟数据或者接口的情况,因为环境问题或者系统复杂度的问题,我们需要使用 Mock 方式进行数据的模拟。 引用淘宝网《接口测试白皮书》中的对 Mock 的定义:

Mock 是指使用各种技术手段模拟出各种需要的资源以供测试使用。 被 Mock 的资源通常有以下特征:

被测目标依赖该资源

该资源可能因为各种原因不稳定、返回结果不断变化或者并不总是能够获取到

该资源跟被测目标本身质量无关

这些资源可能是一个外部或底层接口、一个系统、一组数据对象或者是一整套目标软件的工作环境等。通过 Mock 避免对外部真实资源的依赖实现对被测目标的孤立测试,从而大大降低测试的难度,节约测试成本。

需要注意的是利用 Mock 通过的测试与使用真实环境通过的测试毕竟还是有一定差别的。有些时候我们就是需要所测试的系统能够处理依赖所产生的各种情况,包括正常情况和异常情况,我们同样不能保证我们的Mock 可以模拟到每种这样的情况。因此只在确实有必要的情况下才运用Mock。

三、Mock 的分类

目前主要应用两大类 Mock 的场景。 一种是 Mock 一个对象,写入一些预期的值,通过它进行自己想要的测试。主要适用于单元测试,哪种语言开发的程序必须用基于哪种语言的Mock 方案去实现。 例如:Mockito 只能针对 Java ,适用范围:单测

另外一种就是 Mock 一个 Server ,构造一个假的服务返回预期的结果,也是为了进行自己的测试。主要适用于接口&性能测试,Mock 方案和程序使用的语言无关,可以用 Java 实现,也可以用 Python 实现等,例如:搭建一个 Mock Server,适用范围:无限制

这两个场景构造了大部分的 Mock 使用范围。

四、Mock 一个对象

此处使用Mockito示例

Mockito 是 GitHub 上使用最广泛的 Mock 框架,并与 JUnit 结合使用。Mockito 框架可以创建和配置 mock 对象。使用 Mockito 简化了具有外部依赖的类的测试开发。


一般使用 Mockito 的步骤:

  1. 模拟任何外部依赖并将这些模拟对象插入测试代码中
  2. 执行测试中的代码执行测试中的代码
  3. 验证代码是否按照预期执行验证代码是否按照预期执行

引入pom

  <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.10.19</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
        </dependency>

新建测试类,构造了 list 这样的对象,并且给一个元素赋值 zuozewei。在最后断言的时候,也可以通过这个 list 里面确实有这个值。所以,通过这种方式,我们可以进行对象构造。可以是类,也可以是接口。 除了构造对象,当然也可以对方法设定的返回值指定异常。 上述代码的意思就是当调用 list 的第二个元素的时候,抛出一个运行异常。

public class SimpleTest {

 @Test
 public void test(){
  // 创建Mock对象,参数可以是类或者接口
  List<String> list = mock(List.class);

  //设置方法的预期返回值
  when(list.get(0)).thenReturn("zuozewei");
  when(list.get(1)).thenThrow(new RuntimeException("test exception"));

  String result = list.get(0);

  //验证方法调用
  verify(list).get(0);

  //断言,list的第一个元素是否是"zuozwei"
  Assert.assertEquals(result,"zuozewei");

 }
}

上面只是列举了一些 Mockito 的简单用法。对于比较复杂的用法,大家可以通过官网深入学习。因为 Mockito 主要用于单元测试,开发人员用得比较多,所以大家有兴趣可以自行了解。

五、Mock Server

下图很好地解释了Mock Server 位置和作用:

常见的Mock Server

  1. WireMock,支持HTTP协议,参考:http://wiremock.org/
  2. SoapUI MockService 支持 WebService,参考:https://www.soapui.org/
  3. Dubbo,需要自己实现
  4. 使用Web框架自己开发 Mock Server 系统,参考:http://www.testclass.net/interface/flask_mock/
  5. 在线 Mock Server 系统,参考:http://easy-mock.com/login
  6. 使用现成的 Mock Server 库创建系统,参考: MockServer:https://github.com/jamesdbloom/mockserver Moco:https://github.com/dreamhead/moco
    两个项目都不错有 Mock Serve r库,GitHub 上面的 Star 也差不多。

六、小结

本文分场景介绍了两种 Mock 方式,对于Mock Server 的方案各有各的便利性,看起来都是对接口的模拟。

相关推荐

Qwen上新AI前端工程师!一句话搞定HTML/CSS/JS,秒变React大神

梦晨发自凹非寺量子位|公众号QbitAIQwen上新“AI前端工程师”WebDev,一句话开发网页应用。三大件HTML,CSS,JavaScript一个工具全包了,定睛一看用的还是Reac...

程序员的 JavaScript 代码该如何让计算机搞懂?

出自程序员之手的JavaScript代码,该如何变成计算机所能理解的机器语言呢?本文将带你走进JavaScript引擎内部,一探究竟。作者|LydiaHallie译者|弯月,责编|...

JavaScript:如何优雅的创建数组?

在JavaScript里,有多种方式可以创建数组,下面为你详细介绍:1.使用数组字面量这是最常用的创建数组的方法,使用方括号[]来创建数组。//创建一个空数组letemptyArray...

Jquery 详细用法

1、jQuery介绍(1)jQuery是什么?是一个js框架,其主要思想是利用jQuery提供的选择器查找要操作的节点,然后将找到的节点封装成一个jQuery对象。封装成jQuery对象的目的有...

HTML页面基本结构和加载过程

大家好,我是皮皮。前言对于前端来说,HTML都是最基础的内容。今天,我们来了解一下HTML和网页有什么关系,以及与DOM有什么不同。通过本讲内容,你将掌握浏览器是怎么处理HTML内容的,...

【HarmonyOS Next之旅】兼容JS的类Web开发(一)

目录1->概述1.1->整体架构2->文件组织2.1->目录结构2.2->文件访问规则2.3->媒体文件格式3->js标签配置3....

JavaScript初学者指南

如果你刚接触JavaScript,想必已经被“modulebundlersvs.moduleloaders”、“Webpackvs.Browserify”和“AMDvs.Common...

前端图片延迟加载详细讲解

原文链接:http://www.gbtags.com/gb/share/6366.htm?原本是打算昨天昨天下午的时候就写一篇关于前端图片延迟加载的详细技术的博客的,没想到下午公司项目出现了一些问题...

selenium:操作滚动条的方法(8)

selenium支持几种操作滚动条的方法,主要介绍如下:使用ActionChains类模拟鼠标滚轮操作使用函数ActionChains.send_keys发送按键Keys.PAGE_DOWN往下滑动...

jQuery 获取和设置HTML元素

jQuery中包含更改和操作HTML元素和属性的强大方法。我们可以通过这些方法来获取HTML元素中的文本内容、元素内容(例如HTML标签)、属性值等。text()方法text()方法可以用...

JavaScript脚本如何断言select下拉框的元素内容?

使用JavaScript脚本断言select下拉框的元素内容,需要考虑页面元素是否加载成功,出错时打印等,主要实现功能功能需包括如下几点:1.等待下拉框元素加载完成(支持超时设置)2.获取下...

JavaScript图片或者div拖动拖动函数的实现

/**拖动图片封装html格式:<imglay-src="${item.Resourcesurl}"alt="${item.ResourcesName}"...

JavaScript代码怎样引入到HTML中?

JavaScript程序不能独立运行,它需要被嵌入HTML中,然后浏览器才能执行JavaScript代码。通过<script>标签将JavaScript代码引入到HTM...

当你在Vue.js中想要隐藏 `` 标签时,可以这样做:

在Vue.js里,要是你想要搞掉`<br>`(换行)标签的效果,通常有几种路子:1.使用CSS嗯,最简单的办法就是用CSS搞定,控制元素的样式,让<br>标签彻底不显示...

php手把手教你做网站(三十)上传图片生成缩略图

三种方法:按比例缩小、图片裁切、预览图片裁切不管使用哪一个都是建立在图片已经上传的基础上;预览裁切上传,如果预览的图片就是原始大小,可以预览裁切以后上传(这里是个假象,下边会说明);1、上传以后按比例...

取消回复欢迎 发表评论: