51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1175|回复: 0
打印 上一主题 下一主题

聊一聊Dubbo 接口测试技术

[复制链接]
  • TA的每日心情
    无聊
    3 小时前
  • 签到天数: 937 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-11-16 13:12:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     01 Dubbo 是什么?
      Dubbo 是阿里巴巴开源的一套 RPC 方案,因为理念很契合微服务,这几年很火,用户里面不乏京东、当当、去哪儿等大公司。
      RPC 场景

    Dubbo 架构

    官网也提供了一个很简单实用的 Demo 来演示 Dubbo 协议的使用,用起来的确很简单强大。
      Dubbo Demo
      官网首页的例子已经很好了,可参考 http://dubbo.io/
      02 基于 telnet 的简单调试接口
      任何一个 Dubbo 服务都支持一个简单的 telent 交互。比如:
    1. telnet localhost 20880
    2.   >ls -l
    3.   > ls -l DemoService
    4.   > invoke DemoSerivce.sayHello("seveniruby")
    复制代码
    这种方式只能用来简单验证接口的可用。
      03 传统的基于 XML 配置的 Dubbo 的[url=]测试[/url]方法
      首先创建一个 XML 文件放到 resources 下:
    1. <?xml version="1.0" encoding="UTF-8"?>
    2.   <beans xmlns="http://www.springframework.org/schema/beans"
    3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4.          xmlns:Dubbo="http://code.alibabatech.com/schema/Dubbo"
    5.          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">
    6.       <Dubbo:application name="demo-consumer"/>
    7.       <Dubbo:registry address="Dubbo://127.0.0.1:9090"/>
    8.       <Dubbo:reference id="demoService" interface="com.testerhome.tapi.Dubbo.DemoService"/>
    9.   </beans>
    复制代码
    通过使用一份 XML 配置文件进行测试
    1.  test("Dubbo use registy xml"){
    2.       val context = new ClassPathXmlApplicationContext("Dubbo/consumer.xml")
    3.       context.start()
    4.       val demoService = context.getBean("demoService").asInstanceOf[DemoService]
    5.       println(demoService.sayHello("seveniruby"))
    6.       val req=new RequestModel()
    7.       req.setName("james")
    8.       req.getChild.setName("lily")
    9.       println(TData.toJson(demoService.reqModel(req)))
    10.     }
    复制代码
    04 基于 API 的 Dubbo 测试方法
      其实除了 XML 配置之外,官方也提供了一份直接通过 XML 进行配置的方式,这个方式无疑是可编程、比较灵活的。
    1. test("Dubbo use registry"){
    2.       // 当前应用配置
    3.       val application = new ApplicationConfig
    4.       application.setName("yyy")
    5.       // 注意:ReferenceConfig 为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
    6.       // 引用远程服务
    7.       val reference = new ReferenceConfig[DemoService] // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
    8.       reference.setApplication(application)
    9.       reference.setRegistry(registry); // 多个注册中心可以用 setRegistries()
    10.       reference.setInterface(classOf[DemoService])
    11.       //reference.setUrl("Dubbo://127.0.0.1:20881")
    12.       reference.setTimeout(5000)
    13.       // 和本地 bean 一样使用 DemoService
    14.       val DemoService = reference.get // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用
    15.       System.out.println(DemoService.sayHello("seveniruby"))
    16.       val req=new RequestModel()
    17.       req.setName("james")
    18.       req.getChild.setName("lily")
    19.       System.out.println(TData.toJson(DemoService.reqModel(req)))
    20.     }
    复制代码


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


    这种情况适合自己打造接口测试框架使用。以上 2 个方式都需要依赖研发提供的 Dubbo 接口的 jar 包,这无疑会增加项目的负担。
      使用泛化可以不依赖任何研发提供的 jar 包,不过缺点也明显,仍然需要 jar 包或者其他的文档去分析 Dubbo 接口的调用参数信息。
      举个例子:
    1. test(" 泛化调用 by provider conf use map"){
    2.       var reference = new ReferenceConfig[GenericService]() // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存
    3.       reference.setGeneric(true) // 声明为泛化接口
    4.       reference.setApplication(new ApplicationConfig("generic-provider"))
    5.       //reference.setRegistry(registry)
    6.       reference.setInterface("com.testerhome.tapi.Dubbo.DemoService") // 弱类型接口名
    7.       reference.setTimeout(5000)
    8.       reference.setUrl(s"Dubbo://127.0.0.1:20881")
    9.       val genericService = reference.get
    10.       val result = genericService.$invoke("sayHello", Array("java.lang.String"), Array("xxxx".asInstanceOf[AnyRef]))
    11.       log.info(result)
    12.       val childMap= mutable.Map[String, AnyRef]()
    13.       childMap.put("name", "children")
    14.       val map= mutable.Map[String, AnyRef]()
    15.       map.put("name", "aaa")
    16.       map.put("id", "11")
    17.       map.put("child", childMap.asJava)
    18.       val resModel=genericService.$invoke(
    19.         "reqModel",
    20.         Array("com.testerhome.tapi.Dubbo.RequestModel"),
    21.         Array(map.asJava.asInstanceOf[AnyRef]))
    22.       log.info(resModel)
    23.       log.info(TData.toJson(resModel))
    24.     }
    复制代码


    虽然看起来还是依赖 jar 包,不过这个依赖就挺小了。如果你技术稍微 “猥琐” 点,就应该可以想到,只需要借助 asm 之类的字节码分析框架即可自动生成接口测试用例模板了。
      06 Dubbo 测试的技术关注点
      Dubbo 支持很多的协议,如果用的是 http 或者 hessian 协议,他们本身是文本的,可以直接使用 restassured 框架进行接口测试。
      Dubbo 的 registry 保存了 Dubbo 各种服务的注册信息,测试的时候可以直接用 registry,而不是直接连接到提供服务的 provider 上。









    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-25 12:47 , Processed in 0.066477 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表