首页> 软件工程> Mock测试介绍入门整理

[文章]Mock测试介绍入门整理

收藏
0 476 0

【摘要】

       随着现在的软件系统的架构越来越复杂,开发模式也由以前的单体应用转变更多的微服务模式、分布式架构等,系统开发团队内部各职责也划分的更加清晰,但引发开发团队内部彼此协作的复杂度比以前更高,因为要保证团队之间的所有任务的开发测试步调按计划保持一致是很难得一件事。

        MOCK测试(即仿真测试)是为了解决现实真实测试对象很难获取构成或者开发团队间的协作开发步调不一致但又要求尽早进行开发测试以发现问题的情况,大多数情况针对接口测试。总体来说,为提高效率,基于该情况提出的一种开发测试解决方案,但不能代替最终的集成测试等。

      本文只针对大部分Mock测试及契约测试相关的概念原理和应用框架等作入门整理,仅供开发人员、测试人员入门学习参考。

        相关文档参考官网说明和网上资料等。

【正文】

1       概念

Mock是什么?Mock直译就是模仿的、模拟的、仿真的。但在软件开发中特指:Mock 是指使用各种技术手段模拟出各种需要的资源以供测试使用。

关于Mock要关注的几个要点:

1)     Mock的资源可能是一个外部或底层接口、一个系统、一组数据对象或者是一整套目标软件的工作环境等。

2)     Mock的资源于被测目标本身质量无关,被测目标依赖该资源。

3)     利用 Mock 通过的测试与使用真实环境通过的测试还是有一定差别的,不能保证Mock 可以模拟到每种真实环境的情况,因此只在确实有必要的情况下才运用Mock

2       使用Mock的原因

在实际开发中,两个服务之间存在接口或数据关联,为了开发中尽早进行接口调试验证核心业务的正确性,或者对于某些不容易构造或者不容易获取的对象,我们常常会用一个虚拟的对象代替以便测试。

在具体的开发测试过程中,经常会碰到需要模拟数据或者接口的情况,因为环境问题或者系统复杂度的问题,需要使用 Mock 方式进行数据的模拟。

例如以下情况:

u  一些比较难构造的Object:这类Object通常有很多依赖,在单元测试中构造出这样类通常花费的成本太大。

u  有一些Object的操作费时,而被测对象依赖于这一个操作的执行结果,例如大文件写操作,数据的更新等等,出于测试的需求,通常将这类操作进行Mock

u  异常逻辑:一些异常的逻辑往往在正常测试中是很难触发的,通过Mock可以人为的控制触发异常逻辑。

u  在一些压力测试的场景下,也不得不使用Mock

3       应用场景

u  为无法访问的资源编写测试

u  团队并行工作

u  提前创建测试

u  创建一个验证或者演示程序

u  隔离系统  

4       主要分类

主要应用在两大类Mock

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

n  另外一种就是Mock 一个Server,构造一个假的服务返回预期的结果,主要适用于接口&性能测试。Mock 方案和程序使用的语言无关(可以用 Java 实现,也可以用 PythonJS实现等)。例如:搭建一个 Mock Server,基于Mock.js

 

5       常用Mock框架和Server整理

现在网上常见的Mock Server如下:

n  WireMock:支持HTTP协议,参考:http://wiremock.org/

n  SoapUI MockService:支持WebService,参考:https://www.soapui.org/

n  线上Mock ServerEasy-mock参考http://easy-mock.com/login

n  使用Mock Server库创建系统,参考 MockServer Moco

 

常见的Mock框架:

Mockito

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

Ø  官网 http://mockito.org

Ø  API文档http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html

示例:

步骤:

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

 

代码参考:

Pom.xml

<dependency>

    <groupId>org.mockito</groupId>

    <artifactId>mockito-all</artifactId>

    <version>xx.xx.xx</version>

</dependency>

<dependency>

    <groupId>org.testng</groupId>

    <artifactId>testng</artifactId>

    <version>xx.xx.xx</version>

</dependency>

// --- code --- /

public class CanwaySimpleTest {

    @Test

    public void cwtest(){

        // 创建Mock对象,参数可以是类或者接口

        List<String> list = mock(List.class);

        //设置方法的预期返回值

        when(list.get(0)).thenReturn("canway");

        when(list.get(1)).thenThrow(new RuntimeException("Exception"));

        String result = list.get(0);

        //验证方法调用

        verify(list).get(0);

        //断言,list的第一个元素是否是"canway"

        Assert.assertEquals(result,"canway");

    }

}

 

【总结】

      以上只是针对Mock测试做了一个简单的入门介绍整理,现在已有很多开源框架和技术,有兴趣可上网搜索深入学习。同时也可以了解下契约测试。


软件工程
最近热帖
{{item.Title}} {{item.ViewCount}}
近期热议
{{item.Title}} {{item.PostCount}}