美文网首页
Mock 技术原理

Mock 技术原理

作者: 自如_ | 来源:发表于2020-07-25 18:05 被阅读0次

    1. 什么是mock?

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

    • 在前后端分离项目中,当后端工程师还没有完成接口开发的时候,前端开发工程师利用Mock技术,自
      己用mock技术先调用一个虚拟的接口,模拟接口返回的数据,来完成前端页面的开发。

    • 其实,接口测试和前端开发有一个共同点,就是都需要用到后端工程师提供的接口。所以,当我们做接
      口测试的时候,如果后端某些接口还不成熟、所依赖的接口不稳定或者所依赖的接口为第三方接口、构
      造依赖的接口数据太复杂等问题时,我们可以用mock的方式先虚拟这些接口返回来代替。提高工作效
      率。

    2. moco介绍

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

    • mock数据:即 mock 一个对象,写入一些预期的值,通过它进行自己想要的测试。常见的有:
      EasyMock、Mockito 、WireMock、JMockit。主要适用于单元测试。

    • mock 服务:即mock 一个 sever,构造一个依赖的服务并给予他预期的服务返回值,适用范围
      广,更加适合集成测试。如 moco框架。

    Moco 是类似一个 Mock 的工具框架,一个简单搭建模拟服务器的程序库/工具,下载就是一个JAR包。
    有如下特点:

    • 只需要简单的配置 request、response 等即可满足要求

    • 支持 http、https、socket 协议,可以说是非常的灵活性

    • 支持在 request 中设置 Headers , Cookies , StatusCode 等 对 GET、POST、PUT、DELETE 等请求方式都支持

    • 无需环境配置,有 Java 环境即可

    • 修改配置后,立刻生效。只需要维护接口,也就是契约即可

    • 支持多种数据格式,如 JSON、Text、XML、File 等

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

    3. 下载moco

    链接:https://pan.baidu.com/s/1DzHKtkduENSwF3W4YURoKA
    提取码:g8k78

    4. 配置json文件

    我们需要先编辑一个json文件,用来模拟不同的请求,返回不同的响应。新建一个文件,格式改为json,然后打开这个文件进行编辑,内容如下:

     [{
      "description":"demo",
      "request":{
       "uri":"/demo1"
       },
      "response":{
       "text":"Hello,demo1"
      }
     }]
    

    其中

    • description是注释(描述),由于json无法写注释,所以提供了用这个key

    • uri就是我们这个接口的统一资源标识符,可以根据模拟的接口自行定义

    • response里的内容即为返回的值

    • 这是一个非常简单的mock

    5. 启动moco

    moco项目是采用java开发的,所以启动moco前,需要安装jdk。未安装请先安装

    把我们下载下来的moco的jar包和刚刚编辑好的json文件放到同一个文件夹路径下,如图:

    image.png

    然后在该路径下打开cmd命令行,如图:

    image.png

    方法:在该路径下,输入cmd,按回车,弹出命令行。

    输入命令

    java -jar moco-runner-1.1.0-standalone.jar http -p 9090 -c test.json

    其中

    • jar包的名称可根据自己下载的jar包版本来写

    • http代表这个模拟的是http请求

    • -p 9090 定义是端口号

    • -c test.json 是我们编辑的那个json文件名。

    执行命名后,如图:

    image.png

    此时我们mock的服务以及启动成功了,相当于在我们本地的9090端口上启动的,所以我们可以通过浏览器访问一下http://localhost:9090/demo 来看看返回的结果,注意,这里/demo就是我们在json文件中定义的uri。

    image.png

    如图,我们访问后得到了json文件中编辑的返回值。以上我们就完成了用moco来帮助我们生成mock。

    6. 配置不同的请求

    Demo1:约定URI
     [{
      "description":"demo1=约定URI",
      "request":{
       "uri":"/demo1"
       },
      "response":{
       "text":"Hello,demo1"
      }
    
    demo2:约定请求参数
     [{
      "description":"demo2=约定请求参数",
      "request":{
       "queries":{
        "key1":"abc",
        "key2":"123"
         }
       },
      "response":{
       "text":"Hello,demo2"
      }
     }]
    
    demo3:约定请求方法
     [{
      "description":"demo3=约定请求方法",
      "request":{
       "method":"DELETE"
       },
      "response":{
       "text":"Hello,demo3"
      }
     }]
    
    demo4:约定请求头
     [{
      "description":"demo4=约定请求头",
      "request":{
       "headers":{
        "Content-Type":"application/xml"
        }
       },
      "response":{
       "text":"Hello,demo4"
      }
     }]
    

    demo5:约定请求体参数-form

     [{
      "description":"demo5=约定请求体参数-form",
      "request":{
       "forms":{
        "key1":"abc"
        }
       },
      "response":{
       "text":"Hello,demo5"
      }
     }]
    

    demo6:约定请求体参数-json

     [{
      "description":"demo6=约定请求体参数-json",
      "request":{
       "headers":{
        "Content-Type":"application/json"
        }, 
       "json":{
         "key1":"value1",
         "key2":"value2"
        }
       },
      "response":{
       "text":"Hello,demo6"
      }
     }]x`
    

    demo7 uri-startsWith匹配(以什么字段开头)

    [{
      "description":"demo7=uri-startsWith匹配", 
      "request":{ "uri":{
       "startsWith":"/sq" 
     }
    }, 
      "response":{
      "text":"Hello,demo7" 
    }
    }]
    

    demo8 uri-endWith匹配(以什么字段结尾)

    [
    {
        "description":"demo8=uri-endsWith匹配",
        "request":{
            "uri":{
            "endsWith":"sq" 
            } 
            }, 
        "response":{
        "text":"Hello,demo8"
        }
    }]
    

    demo9 uri-contain包含

    [{
        "description":"demo9=uri-contain匹配",
        "request":{
            "uri":{
                "contain":"fcl"
            }
        },
        "response":{    
            "text":"Hello,demo9"  
        }
    }]
    

    Demo10:返回状态码

    [{
        "description":"demo10=响应状态码",
        "request":{
            "uri":"demo10"
        },
        "response":{
            "status":200 }
    }]
    

    Demo11:返回响应头

    [{
        "description":"demo11=响应头",
        "request":{
            "uri":"demo11"
        },
        "response":{
            "headers":{
                "Content-Type":"application/json"
            }
        }
    }]
    

    Demo12:重定向

    [{
        "description":"demo12=重定向",
        "request":{
            "uri":"demo12"
        },
        "redirectTo":"http://www.baidu.com"
    }]
    

    Demo13:返回JSON格式的数据

    [{
        "description":"demo13=返回json格式的数据",
        "request":{
            "uri":"/demo13" },
        "response":{
            "json":{
                "key1":"value1","key2":"value2"}
        } 
    }]
    

    7. 附:json脚本关键字

    • request

      \circ method

      \circ uri

      \circ headers

      \circ cookies

      \circ queries

      \circ forms、json、text

    • response

      \circ status

      \circ headers

      \circ cookies

      \circ text、json

      \circ redirectTo

    8. moco总结

    • Moco还可以通过在json文件中添加cookies、header、重定向这些参数,来模拟各种情况下的请求和返回值,可以根据自己工作的需求去对这些东西进行了解。

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

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

    相关文章

      网友评论

          本文标题:Mock 技术原理

          本文链接:https://www.haomeiwen.com/subject/irsplktx.html