zoukankan      html  css  js  c++  java
  • Dubbo 接口测试技术,测试开发进阶必备(附源码)

    Dubbo 接口测试为霍格沃兹测试学院特色课程,全网深度领先,想一起系统进阶的同学文末加群交流。

    Dubbo 是什么?

    Dubbo 是阿里巴巴开源的一套 RPC 方案,因为理念很契合微服务,这几年很火,用户里面不凡京东,当当,去哪儿等大公司。

    RPC 场景

    Dubbo 架构

    官网也提供了一个很简单实用的 Demo 来演示 Dubbo 协议的使用,用起来的确很简单强大。

    Dubbo demo

    首页的例子已经很好了。可参考 http://Dubbo.io/

    下面介绍几种常用的 Dubbo 接口测试方法。

    基于 telnet 的简单调试接口

    任何一个 Dubbo 服务都支持一个简单的 telent 交互。比如

    telnet localhost 20880  
    >ls -l  
    > ls -l DemoService  
    > invoke DemoSerivce.sayHello("seveniruby")  
    

    这种方式只能用来简单验证接口的可用

    传统的基于 XML 配置的 Dubbo 的测试方法

    首先创建一个 XML 文件放到 resources

    <?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
           xmlns:Dubbo="http://code.alibabatech.com/schema/Dubbo"  
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/Dubbo http://code.alibabatech.com/schema/Dubbo/Dubbo.xsd">  
        <Dubbo:application name="demo-consumer"/>  
        <Dubbo:registry address="Dubbo://127.0.0.1:9090"/>  
        <Dubbo:reference id="demoService" interface="com.testerhome.tapi.Dubbo.DemoService"/>  
    </beans>  
    

    通过使用一份 XML 配置文件进行测试

      test("Dubbo use registy xml"){  
        val context = new ClassPathXmlApplicationContext("Dubbo/consumer.xml")  
        context.start()  
        val demoService = context.getBean("demoService").asInstanceOf[DemoService]  
        println(demoService.sayHello("seveniruby"))  
      
        val req=new RequestModel()  
        req.setName("james")  
        req.getChild.setName("lily")  
        println(TData.toJson(demoService.reqModel(req)))  
      }  
    

    基于 API 的 Dubbo 测试方法

    其实除了 XML 配置之外,官方也提供了一份直接通过 API 进行配置的方式,这个方式无疑是可编程比较灵活的。

      test("Dubbo use registry"){  
        // 当前应用配置  
        val application = new ApplicationConfig  
        application.setName("yyy")  
      
        // 注意:ReferenceConfig 为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接  
      
        // 引用远程服务  
        val reference = new ReferenceConfig[DemoService] // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏  
        reference.setApplication(application)  
        reference.setRegistry(registry); // 多个注册中心可以用 setRegistries()  
        reference.setInterface(classOf[DemoService])  
        //reference.setUrl("Dubbo://127.0.0.1:20881")  
        reference.setTimeout(5000)  
      
        // 和本地 bean 一样使用 DemoService  
        val DemoService = reference.get // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用  
        System.out.println(DemoService.sayHello("seveniruby"))  
      
        val req=new RequestModel()  
        req.setName("james")  
        req.getChild.setName("lily")  
        System.out.println(TData.toJson(DemoService.reqModel(req)))  
      }  
    

    泛化调用

    官方原话是:

    泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map
    表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现。

    这种情况适合自己打造接口测试框架使用。以上 2 个方式都需要依赖研发提供的 Dubbo 接口的 jar 包,这无疑会增加项目的负担。

    使用泛化可以不依赖任何研发提供的 jar 包,不过缺点也明显,仍然需要 jar 包或者其他的文档去分析 Dubbo 接口的调用参数信息。

    例子

      test(" 泛化调用 by provider conf use map"){  
      
        var reference = new ReferenceConfig[GenericService]() // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存  
        reference.setGeneric(true) // 声明为泛化接口  
        reference.setApplication(new ApplicationConfig("generic-provider"))  
        //reference.setRegistry(registry)  
        reference.setInterface("com.testerhome.tapi.Dubbo.DemoService") // 弱类型接口名  
        reference.setTimeout(5000)  
        reference.setUrl(s"Dubbo://127.0.0.1:20881")  
      
        val genericService = reference.get  
        val result = genericService.$invoke("sayHello", Array("java.lang.String"), Array("xxxx".asInstanceOf[AnyRef]))  
        log.info(result)  
      
        val childMap= mutable.Map[String, AnyRef]()  
        childMap.put("name", "children")  
        val map= mutable.Map[String, AnyRef]()  
        map.put("name", "aaa")  
        map.put("id", "11")  
        map.put("child", childMap.asJava)  
      
        val resModel=genericService.$invoke(  
          "reqModel",  
          Array("com.testerhome.tapi.Dubbo.RequestModel"),  
          Array(map.asJava.asInstanceOf[AnyRef]))  
        log.info(resModel)  
        log.info(TData.toJson(resModel))  
      }  
    

    虽然看起来还是依赖 jar 包,不过这个依赖就挺小了。如果你技术稍微 “猥琐” 点,就应该可以想到,只需要借助 asm
    之类的字节码分析框架即可自动生成接口测试用例模板了。

    Tips | Dubbo 测试的技术关注点

    • Dubbo 支持很多的协议,如果用的是 HTTP 或者 Hessian 协议,他们本身是文本的,可以直接使用 RESTAssured 框架进行接口测试;

    • Dubbo 的 Registry 保存了 Dubbo 各种服务的注册信息,测试的时候可以直接用 registry,而不是直接连接到提供服务的 provider 上;

    ** _
    来霍格沃兹测试开发学社,学习更多软件测试与测试开发的进阶技术,知识点涵盖web自动化测试 app自动化测试、接口自动化测试、测试框架、性能测试、安全测试、持续集成/持续交付/DevOps,测试左移、测试右移、精准测试、测试平台开发、测试管理等内容,课程技术涵盖bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相关技术,全面提升测试开发工程师的技术实力
    QQ交流群:484590337
    公众号 TestingStudio
    点击获取更多信息

  • 相关阅读:
    [杂谈]关于前端如何学习框架的一点牢骚
    【2018】面试复习大纲
    迟来的2017总结
    [转载并收藏]JavaScript 疲劳终极指南:我们行业的真相
    想做好产品,一定要成为自己产品的用户
    2017年个人提升计划
    Chrome新发现
    不要被所在的公司或企业绑架
    半夜不想睡有感
    2016年总结
  • 原文地址:https://www.cnblogs.com/hogwarts/p/15828961.html
Copyright © 2011-2022 走看看