首页 > 编程语言 >走进Java接口测试之Mock(概念篇)

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

时间:2023-04-05 10:08:14浏览次数:32  
标签:Java Mockito list 接口 Server 测试 Mock

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

引言

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

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

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 简化了具有外部依赖的类的测试开发。

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

一般使用 Mockito 的步骤:

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

引入pom

    1.   <dependency>
    2.             <groupId>org.mockito</groupId>
    3.             <artifactId>mockito-all</artifactId>
    4.             <version>1.10.19</version>
    5.         </dependency>
    6.         <dependency>
    7.             <groupId>org.testng</groupId>
    8.             <artifactId>testng</artifactId>
    9.             <version>6.14.3</version>
    10.         </dependency>
    新建测试类,构造了 list 这样的对象

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


    1. public class SimpleTest {
    2. 
    3.     @Test
    4.     public void test(){
    5.         // 创建Mock对象,参数可以是类或者接口
    6.         List<String> list = mock(List.class);
    7. 
    8.         //设置方法的预期返回值
    9.         when(list.get(0)).thenReturn("zuozewei");
    10.         when(list.get(1)).thenThrow(new RuntimeException("test exception"));
    11. 
    12.         String result = list.get(0);
    13. 
    14.         //验证方法调用
    15.         verify(list).get(0);
    16. 
    17.         //断言,list的第一个元素是否是"zuozwei"
    18.         Assert.assertEquals(result,"zuozewei");
    19. 
    20.     }
    21. }

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

    Mock Server

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

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

    常见的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 Server库,GitHub上面的 Star 也差不多。

    小结

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


    标签:Java,Mockito,list,接口,Server,测试,Mock
    From: https://blog.51cto.com/u_15181572/6170224

    相关文章

    • 秒懂HTTPS接口(实现篇)
      HTTPS接口实现下面我们来实践使用Java实现一个简单HTTPS接口示例项目结构:1.springbootdemo2.├─config配置信息类3.├─controller控制器类4.├─entity实体类5.├─enums枚举类6.├─exception异常类7.├─handler捕获类8.├─repository数据访问类9.├......
    • 【fastweixin框架教程7】微信企业号自定义菜单接口开发
       下面这个类我对fastweixin框架的简单封装调用,大家可以参考,如果需要QYAPIConfigExt和MainServernSupport,请参考本教程以前几篇文章  应用可以在会话界面底部设置自定义菜单,菜单项可按需设定,并可为其设置响应动作。用户可以通过点击菜单项,收到你设定的消息。企业号支持自定义......
    • JavaScript 弹出框(警告框、确认框、提示框)
      JavaScript有三种类型弹出框:警告框、确认框、提示框。一、警告框如果要确保信息传递给用户,通常会使用警告框。当警告框弹出时,用户将需要单击“确定”来继续基础语句 <script> //警告框 window.alert("成功弹出警告框!");//window.alert()方法可以不带window前缀。 ......
    • javaEE进阶小结与回顾(一)
      继承继承的格式:publicclassStudentextendsPeople()父类:子类的共性抽取而来继承的好处,子类可以直接使用父类成员,提高代码复用性与可维护性继承的弊端,使类与类之间产生关联,增强其之间的耦合性,父类变化时子类不得不跟着变化类与类之间具有isa的关系时,适合使用继承,......
    • java学习日记20230406-StringBuilder,StringBuffer,String比较
      StringBuffer,StringBuilder,String比较: StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法相同;String:不可变字符序列,效率低,但是复用率高;StringBuffer:可变字符序列,效率较高,线程安全;StringBuider:可变字符序列,效率极高,线程不安全  String使用注意说明: ......
    • java学习日记20230406-StringBuilder类
      StringBuilder类一个可变的字符序列,此类提供一个与StringBuffer兼容的Api,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,他比StringBuffer要快----StringBuilder不是线程安全的在S......
    • JavaScript对象
      ArrayString自定义对象 ArrayJavaScriptArray对象用于定义数组定义: var变量名=newArray(元素列表);//方式一var变量名=[元素列表];//方式二 访问arr[索引]=值;arr[0]=1;注意:JS类似于Java集合,长度,类型都可变 Ps.length数组中元素的个数......
    • Java
      Java一、转义字符\t:一个制表符,实现对齐功能\n:换行\\:一个\,其他单引号、双引号同\r:一个回车System.out.print("学习\r北京");ps:回车后,回到行首替换输入二、注释单行注释多行注释(禁止套娃)文档注释javadoc-d生成后的路径-author-version文件名......
    • java学习日记20230405-StringBuffer类
      StringBuffer类java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删很多方法与String相同,但StringBuffer是可变长度的StringBuffer是一个容器StringBuffer是final类实现了Serializable接口,可以保存到文件或网络传输继承了抽象类AbstractStringBuiderAbstra......
    • Java笔记(8) 异常和错误
      异常的简单分类检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如用户要打开一个不存在的文件,一个异常就发生了,这些异常在编译时不能被简单的忽略。运行时异常:运行时异常是可能被程序员避免的异常,与检查性异常相反,运行时异常可以在编译时......