5.1 RPC 简介
RPC(Remote Procedure Call,远程过程调用)协议是一种计算机通信协议,该协议允许本地计算机上的程序远程调用另一台计算机上的程序,而在此过程中,开发人员不需要额外编程。另外,在面向对象编程的程序中,远程过程调用又可称为远程调用或远程方法调用。常见的 RPC 协议实现如下。
Java RMI:Java Remote Method Invocation,即 Java 远程方法调用,采用了 JDK 中标准的 java.rmi.*实现。
Apache Dubbo(以下简称 Dubbo):是阿里巴巴开源的一款高性能、轻量级的 Java RPC 框架。Dubbo 的特点包括可面向接口的远程方法调用、智能容错、负载均衡和服务自动注册及发现等。
Hessian:Hessian 是一种二进制协议,它非常适合发送二进制数据,且无须通过附件的形式对该协议进行任何扩展。
XML-RPC:XML-RPC 是一个规范和一组实现,它允许程序运行在不同的操作系统和环境中,以通过 Internet 进行过程调用。它是一种基于 HTTP 和 XML 实现的远程过程调用。XML-RPC 的设计虽然非常简单,但它支持传输、处理和返回复杂的数据结构。
Apache Thrift:是一种 RPC 协议实现的框架,适用于跨语言服务的开发,它将软件堆栈与代码生成引擎结合起来构建高效的服务,且可无缝连接 Java、Python、C++、JavaScript、C#和 PHP 等编程语言。
在众多 RPC 协议的实现中,Dubbo 作为分布式微服务的主流框架之一,在企业级应用开发中使用频率较高,因此本章使用 Dubbo 作为 RPC 接口自动化测试的示例。
Dubbo 中的重要角色如图 5-1 所示。
图 5-1
服务提供者:提供远程调用的接口。
容器:运行服务提供者。
服务消费者:调用服务提供者提供的接口。
注册中心:服务提供者将服务注册到注册中心,服务消费者从注册中心获取需要使用的服务。
监控中心:监控服务提供者和服务消费者的调用过程。监控中心是可选的。
5.2 部署待测程序
1.安装 JDK
在即将部署待测程序的服务器上安装 JDK,并配置系统变量如下。这里以 Windows 为例。
① 新建 JAVA_HOME,变量值填写如下。
C:Program FilesJavajdk1.8.0_212
② 新建 CLASSPATH,变量值填写如下。
.;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar
③ 编辑 Path,变量值追加如下。
;%JAVA_HOME%in
2.安装 ZooKeeper
在 Dubbo 中,注册中心只是一个角色,可以充当该角色的中间件有很多,ZooKeeper 就是其中最常用的一个,同时也是官方推荐使用的。ZooKeeper 可以部署为单机模式或分布式模式,为简明步骤,示例部署为单机模式。这里以 Windows 为例。
① 从官网下载 ZooKeeper。
② 解压缩到指定目录,笔者解压缩到 D:Program Files 目录。
③ 将 conf 目录下的 zoo_sample.cfg 文件重命名为 zoo.cfg,编辑 zoo.cfg 文件,在文件最后加上 admin.serverPort=8081
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=D:javawebapache-zookeeper-3.5.8data # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 admin.serverPort=8081
④ 双击 bin 目录下的 zkServer.cmd 文件,运行成功后如图 5-2 所示。
3.部署待测程序
从笔者的 GitHub 中下载待测程序,程序名为 rpcinterface-0.0.1-SNAPSHOT.jar,下载后放在服务器上,执行以下命令运行即可。
java-jar E: pcinterface-0.0.1-SNAPSHOT.jar
这里把本地电脑作为服务器,且待测程序放在了 E 盘根目录,读者需要根据实际情况替换以上路径。运行成功后如图 5-3 所示。
5.3 手工测试用例设计
5.3.1 分析待测接口
Dubbo 接口的分析方式和 HTTP 接口类似,接口文档如表 5-1 所示。
表 5-1
从接口中可以看出待测程序只有一个接口,但有两个方法,即 getMobilePhone 和 saveMobilePhone,这与第 4 章中的待测程序相同。其中,com.lujiatao.rpcinterface.domain.MobilePhone 为一个实体类,由于不是 Java 的内置类型,因此在接口文档中最好写出全路径。
5.3.2 测试用例设计
这里仅以入参作为示例来设计测试用例,5.4 节会将这部分手工测试用例转换成自动化测试用例。
1.getMobilePhone 测试用例设计
(1)参数必填项
(2)参数长度
接口文档未提及参数长度,但我们可以提交一个相对较长的参数。
Case 4:model=「01234567890123456789012345678901234567890123456789」——返回空
(3)参数组合
在多个参数接口中,参数可能相互响应或制约,因此对参数组合的用例设计必不可少。本接口不涉及(因为只有一个参数)。
(4)参数规则
一般特殊的参数会有相应规则,比如手机号、身份证号和统一社会信用代码等。本接口不涉及。
(5)参数枚举
有些参数只能接收固定的几个参数值,这类参数在服务端大多用枚举定义,在这种情况下,需要测试每种枚举值。本接口不涉及。
综合以上各种情况,getMobilePhone 一共设计了 4 条手工测试用例。
2.saveMobilePhone 测试用例设计
(1)参数必填项
接口文档未提及参数长度,但我们可以提交一个相对较长的参数。
(3)参数组合
本接口不涉及。
(4)参数规则
本接口不涉及。
(5)参数枚举
os 参数代表操作系统,而手机操作系统目前主流的只有 Android 和 iOS,且在接口文档的示例中,os 的值为「IOS」。在 Java 中,枚举用大写表示,故推测该字段在后台以枚举方式定义。
Case 6 和 Case 11 试图给枚举赋值空字符串或不存在的枚举,这两种情况会导致编译报错,因此没有必要测试。综合以上各种情况,saveMobilePhone 方法一共设计了 9 条手工测试用例。
参考资料:
apache-zookeeper-3.5.8-bin.tar.gz