RPC接口测试(三) RPC接口测试

Wesley13
• 阅读 1202

RPC接口测试

接口测试主要分HTTP和RPC两类,RPC类型里面以Dubbo较为知名。
互联网微服务架构,两种接口都需要做接口测试的,不管是业务测试还是回归测试;

Dubbo:Java栈的互联网公司比如阿里、美团、58、滴滴、京东等等都是差不多的服务端架构,所以这些公司,两类接口测试也是必不可少的工作部分;
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

rpc API 文档如下

接口实体: Object restForRpc(RequestParams requestParams);

请求URL: http://10.118.60.177:8931/express/test/restForRpc

请求方式:POST

RPC接口测试(三) RPC接口测试

dubbo是什么

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

rpc场景

RPC接口测试(三) RPC接口测试

dubbo架构

 RPC接口测试(三) RPC接口测试

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

dubbo demo

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

基于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之类的字节码分析框架即可自动生成接口测试用例模板了。

dubbo测试的技术关注点

dubbo支持很多的协议,如果用的是http或者hessian协议,他们本身是文本的,可以直接使用restassured框架进行接口测试

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

原文地址https://testerhome.com/topics/10481

点赞
收藏
评论区
推荐文章
捉虫大师 捉虫大师
1年前
使用dubbo-go搭建dubbo接口测试平台
背景http接口测试只需要一个curl命令,但dubbo协议没有这样的现成接口测试工具。通常公司内的dubbo控制台或其他平台会集成一个dubbo接口测试工具。调用一个dubbo接口,需要知道服务名service、方法名method和参数args。正常的调用,调用方需引入服务提供方定义的接口jar包。作为接口测试平台,没办法引入所有提供方定义的接口jar包,
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
Easter79 Easter79
1年前
swap空间的增减方法
(1)增大swap空间 去激活swap交换区: #swapoff -v /dev/vg00/lvswap 扩展交换lv: #lvextend -L 10G /dev/vg00/lvswap 重新生成swap交换区: #mkswap /dev/vg00/lvswap 激活新生成的交换区: #swapon -v /dev/vg00/lvswap
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Stella981 Stella981
1年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“**Java进阶架构师**”,点击右上角,将我们设为**★**“**星标**”!这样才不会错过每日进阶架构文章呀。   ![](http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)   **2
Stella981 Stella981
1年前
Angular material mat
Icon Icon Name mat-icon code _add\_comment_ add comment icon <mat-icon> add\_comment</mat-icon> _attach\_file_ attach file icon <mat-icon> attach\_file</mat-icon> _attach\
Stella981 Stella981
1年前
SpringBoot自定义序列化的使用方式
场景及需求: 项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。 例如: \[      {          "id": 1,          "name": null      },      {          "id": 2,          "name": "x
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为