zoukankan      html  css  js  c++  java
  • 多测师讲解接口测试__mock___高级讲师肖sir

    一、关于Mock测试

    1、什么是Mock测试?
    mock测试,源自于英文单词fake,意为假的测试
    实际工作中用于模拟那些无法实时连接的后端,或是没有开发出来的后端,用于获得结果反馈的一种测试方式。通过发送请求后,模拟后台返回的响应内容来确认当前系统的正确性。
    Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。
    说白了所谓得mock测试就是,后端定义好了接口文档,但是还没开发完成。换种说法就是端口之间无法进行联调,只能通过自己伪造数据进行开发/测试。那么这种伪造数据就是所谓得mock。
    但是因为各种各样的情况,不能总拿死数据来开发/测试,需要一些随机数据,这样才能更好的覆盖整个用例的可能性


    2、为什么要进行Mock测试?
    Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以,Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。比如一段代码有这样的依赖:


    当我们需要测试A类的时候,如果没有 Mock,则我们需要把整个依赖树都构建出来,而使用 Mock 的话就可以将结构分解开,像下面这样:


    3、Mock对象适用场景
    (1)需要将当前被测单元和其依赖模块独立开来,构造一个独立的测试环境,不关注被测单元的依赖对象,只关注被测单元的功能逻辑。

      -----比如被测代码中需要依赖第三方接口返回值进行逻辑处理,可能因为网络或者其他环境因素,调用第三方经常会中断或者失败,无法对被测单元进行测试,这个时候就可以使用mock技术来将被测单元和依赖模块独立开来,使得测试可以进行下去。

    (2)被测单元依赖的模块尚未开发完成,而被测单元需要依赖模块的返回值进行后续处理。

    1)前后端项目中,后端接口开发完成之前,接口联调;

    2)依赖的上游项目的接口尚未开发完成,需要接口联调测试;

      -----比如service层的代码中,包含对Dao层的调用,但是,DAO层代码尚未实现

    (3)被测单元依赖的对象较难模拟或者构造比较复杂。

      -----比如,支付宝支付的异常条件有很多,但是模拟这种异常条件很复杂或者无法模拟,比如,查询聚划算的订单结果,无法在测试环境进行模拟。
    4、Mock测试的优势

    (1) 团队可以并行工作

    有了Mock,前后端人员只需要定义好接口文档就可以开始并行工作,互不影响,只在最后的联调阶段往来密切;后端与后端之间如果有接口耦合,也同样能被Mock解决;测试过程中如果遇到依赖接口没有准备好,同样可以借助Mock;不会出现一个团队等待另一个团队的情况。这样的话,开发自测阶段就可以及早开展,从而发现缺陷的时机也提前了,有利于整个产品质量以及进度的保证。

    (2)开启TDD模式,即测试驱动开发

    单元测试是TDD实现的基石,而TDD经常会碰到协同模块尚未开发完成的情况,但是有了mock,这些一切都不是问题。当接口定义好后,测试人员就可以创建一个Mock,把接口添加到自动化测试环境,提前创建测试。

    (3)可以模拟那些无法访问的资源

    比如说,你需要调用一个“墙”外的资源来方便自己调试,就可以自己Mock一个。

    (4)隔离系统

    假如我们需要调用一个post请求,为了获得某个响应,来看当前系统是否能正确处理返回的“响应”,但是这个post请求会造成数据库中数据的污染,那么就可以充分利用Mock,构造一个虚拟的post请求,我们给他指定返回就好了。

    (5)可以用来演示

    假如我们需要创建一个演示程序,并且做了简单的UI,那么在完全没有开发后端服务的情况下,也可以进行演示。说到演示了,假如你已经做好了一个系统,并且需要给客户进行演示,但是里面有些真实数据并不想让用户看到,那么同样,你可以用Mock接口把这些敏感信息接口全部替换。

    (6)测试覆盖度

    假如有一个接口,有100个不同类型的返回,我们需要测试它在不同返回下,系统是否能够正常响应,但是有些返回在正常情况下基本不会发生,比如,我们需要测试在当接口发生500错误的时候,app是否崩溃,别告诉我你一定要给服务端代码做些手脚让他返回500 。而使用mock,这一切就都好办了,想要什么返回就模拟什么返回,不用再担心我的测试覆盖度了!
    5、Mock测试存在的问题

    使用Mock测试有时可以提高团队的开发效率,但当B、C都开发完成代码后,这时应该把E2E测试代码从使用Mock测试改为调用真实的模块,以避免出现模块之间集成部分漏测的问题。这里说mock存在的问题,主要是让开发和测试不要过分的依赖/相信mock接口。

    使用mock时,切记的几点:

    1)测试人员不应该被覆盖率高的E2E自动化测试所迷惑,覆盖率高不代表没有问题。尤其在接手新项目中,需要查看E2E测试中有没有使用Mock测试,进一步去判断这些地方使用Mock测试是否合理,这些Mock测试是否应该换成真实模块间的调用和集成。

    2)当把mock接口换成实际接口后,测试/开发也必须把之前的测试重新做一遍。

    ps: 当你使用mock接口来提高效率,请注意:你的工作量其实是比 直接只用实际接口 多了 一倍的。如果测试时,偷懒,替换成实际接口后,只是简单测试,那么 当实际接口和mock预期接口有差异时,故障便和你相遇了。

    建议: mock接口只能主流程联调/ 异常返回测试,不要过分依赖mock接口进行测试。

    3)测试完毕,上线前,请一定确保 为了mock而做的相关代码/配置文件的修改,确认已经完全恢复了。

    建议:上线checklist中条条列出,并上线前review

    二、postman工具来实现mock
    要求:要注册后才可以实现
    策略:使用mock-server配置私有环境变量并设置相应内容,获取mock-sever的接口密钥AIP-key并创建接口名称,将mock-server的url和接口密钥API-key一并添加在环境变量中,在当前集合中创建新请求,在example中设置预期响应结果,使用环境变量中的mock-sever的url,并将环境变量中的mock-server的接口名称和API-key放到请求头(header)里,发送请求,获得预期结果
    1. 新建mock sever


    2. 输入mock的请求和响应设置,设置好点击next



    3.设置mock server,输入mock server的名字,使用的环境,并且设置成私有mock服务,没有合适的环境可以选择no environment,点击create



    4.点击here获取mock 接口密钥,登陆浏览器设置,然后点击close



    5.点击获取接口密钥

     



    6.设置接口密钥名

     


    7.这里展示mock 接口密钥名称和密钥编码,可以开启或关闭,也可以删除不想要的密钥



    8.回到postman,发现在右侧collection集合出出现了一个以刚才name命名的collection,点击这个集合右上角的箭头,选择mock,出现mock server的地址


    9.点击右上角眼睛旁的下拉框查看环境,新增了一个刚才name同名的环境


    10. 下拉框选择它,然后点击旁边的眼睛,查看,发现刚才看到的mock server的url已经配进去了


    11.但这还是不够,点击edit,添加刚刚的api-key,添加格式:VARIBLE=NAME VALUE=API-KEY,并保存

     



    12.在请求界面上刚才在mock server中配置的路径,并在header中输入API-KEY格式:KEY:x-api-key VALUE:{{NAME}},其他部分要与之前设置的一致,点击send,获取结果




    13.在当前collection下新建一个请求,请求方法、参数、url自定义,url要以{{url}}/xxx/xxx格式。header中配置x-api-key和{{name}}



    14.配置好后,点击右上角的example,配置对应的响应

    15.配置好保存,回到请求页面,点击send,查看预期返回结果

     



    PS:使用中地址栏内的{{url}}一定要带着,这是使用mock server的服务。其后面路径名称以及层级均可自定义,但要记得设置对应的example并且保存后再运行

  • 相关阅读:
    scala环境配置+hello world!
    mysql无法登录
    ajax跨域
    jfinal框架页面找不到相关css,js文件404
    从程序员到CTO的Java技术路线图 作者:zz563143188
    在項目中快速部署SLF4J+LOGBACK
    Spring整合MyBatis
    SpringMVC常用注解實例詳解3:@ResponseBody
    浏览器包含哪些进程?
    前端程序员也需要知道进程和线程
  • 原文地址:https://www.cnblogs.com/xiaolehua/p/13686943.html
Copyright © 2011-2022 走看看