赞
踩
实际工作中,测试人员可能会遇到如下情况:
在性能基础之浅谈常见接口性能压测文中,我们有简单介绍过 Mock ,本文将详细阐述 Mock 概念。
在接口测试过程中,对于某些不容易构造或者不容易获取的对象,我们常常会用一个虚拟的对象代替以便测试。在具体的测试过程中,我们经常会碰到需要模拟数据或者接口的情况,因为环境问题或者系统复杂度的问题,我们需要使用 Mock 方式进行数据的模拟。
引用淘宝网《接口测试白皮书》中的对 Mock 的定义:
Mock 是指使用各种技术手段模拟出各种需要的资源以供测试使用。
被 Mock 的资源通常有以下特征:
- 被测目标依赖该资源
- 该资源可能因为各种原因不稳定、返回结果不断变化或者并不总是能够获取到
- 该资源跟被测目标本身质量无关
- 这些资源可能是一个外部或底层接口、一个系统、一组数据对象或者是一整套目标软件的工作环境等。通过 Mock 避免对外部真实资源的依赖实现对被测目标的孤立测试,从而大大降低测试的难度,节约测试成本。
- 需要注意的是利用 Mock 通过的测试与使用真实环境通过的测试毕竟还是有一定差别的。有些时候我们就是需要所测试的系统能够处理依赖所产生的各种情况,包括正常情况和异常情况,我们同样不能保证我们的Mock 可以模拟到每种这样的情况。因此只在确实有必要的情况下才运用Mock。
目前主要应用两大类 Mock 的场景。
一种是 Mock 一个对象,写入一些预期的值,通过它进行自己想要的测试。主要适用于单元测试,哪种语言开发的程序必须用基于哪种语言的Mock 方案去实现。
例如:Mockito 只能针对 Java ,适用范围:单测
另外一种就是 Mock 一个 Server ,构造一个假的服务返回预期的结果,也是为了进行自己的测试。主要适用于接口&性能测试,Mock 方案和程序使用的语言无关,可以用 Java 实现,也可以用 Python 实现等,例如:搭建一个 Mock Server,适用范围:无限制
这两个场景构造了大部分的 Mock 使用范围。
此处使用Mockito示例
Mockito 是 GitHub 上使用最广泛的 Mock 框架,并与 JUnit 结合使用。Mockito 框架可以创建和配置 mock 对象。使用 Mockito 简化了具有外部依赖的类的测试开发。
一般使用 Mockito 的步骤:
引入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 方式,对于Mock Server 的方案各有各的便利性,看起来都是对接口的模拟。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。