如何动态的测试Thrift服务

news2025/2/25 21:55:03

​RPC协议与Thrift框架

RPC(Remote Procedure Call,远程过程调用)是一种通信协议,用于不同的进程或计算机之间进行通信和交互。它允许应用程序在本地或远程计算机上调用另一个应用程序中的函数或方法,就像调用本地函数一样。

RPC协议通过网络传输协议来实现不同计算机之间的通信,常见的网络传输协议有TCP、UDP等。当一个客户端需要调用远程服务器上的某个方法时,客户端会向服务器发送一个请求(包括请求参数),服务器接收到请求后执行相应的方法,并返回结果(包括返回值)。客户端接收到结果后继续执行自己的逻辑。

RPC协议的优点在于它可以隐藏底层通信细节,使得开发人员可以像调用本地函数一样调用远程函数,从而简化了分布式系统的开发。此外,RPC协议还具有高效、灵活、可扩展等优点,因此广泛应用于分布式系统、微服务架构等领域。

RPC(Remote Procedure Call)是一种通用的远程过程调用协议,而Thrift则是基于RPC协议开发的高效、跨语言和跨平台的服务框架。

Thrift是由Facebook开源的一个分布式服务框架,它使用IDL(Interface Definition Language)定义服务接口,然后通过自动生成代码的方式实现各种编程语言之间的互操作性。Thrift支持多种数据序列化和传输协议,包括二进制编码、JSON、XML等,还提供了多种服务器的实现方式和客户端库。

在Thrift的内部实现中,它使用了RPC协议来实现远程过程调用,并利用不同的编程语言的反射机制来对消息进行序列化和反序列化。通过使用RPC协议,Thrift可以在不同的计算机上运行服务,并允许客户端以本地服务的方式调用远程服务。此外,Thrift还提供了诸如负载均衡、故障转移、安全认证等方面的特性,使得分布式服务开发更加方便和高效。

实现一个Thrift服务

以下是一个使用Java和Thrift框架实现的简单订单查询服务示例。该服务包括一个接口,对应着查询订单信息的操作:

1. 定义Thrift服务的IDL文件(例如example.thrift),其中定义了服务名称、接口、方法、参数和返回值等信息:

namespace java example

struct Order {
    1: i32 orderId,
    2: string customerName,
    3: double amount
}

service OrderService {
    Order getOrder(1: i32 orderId)
}

上面的IDL文件中定义了一个结构体Order,表示订单信息,以及一个接口OrderService,包含了一个获取订单信息的方法getOrder。

2. 使用Thrift提供的工具生成Java代码(例如在命令行中执行thrift --gen java example.thrift)。这将生成与IDL文件中定义的服务接口和方法相对应的Java类和接口。

3. 实现服务接口的具体逻辑。例如,在服务器端实现一个订单查询服务:

public class OrderServiceImpl implements OrderService.Iface {    private Map<Integer, Order> orderMap = new HashMap<>();    public OrderServiceImpl() {        // 初始化订单数据        for (int i = 1; i <= 10; i++) {            Order order = new Order(i, "Customer" + i, i * 100.0);            orderMap.put(order.orderId, order);        }    }    @Override    public Order getOrder(int orderId) throws TException {        if (orderMap.containsKey(orderId)) {            return orderMap.get(orderId);        } else {            throw new TException("Order not found");        }    }    public static void main(String[] args) throws Exception {        TServerTransport serverTransport = new TServerSocket(9090);        TProcessor processor = new OrderService.Processor<OrderService.Iface>(new OrderServiceImpl());        TServer server = new TSimpleServer(new TServer.Args(serverTransport).processor(processor));        System.out.println("Starting the server...");        server.serve();    }}

在上述代码中,使用Thrift提供的TProcessor将服务实现类与IDL文件中定义的接口绑定起来,并创建了一个TSimpleServer对象来启动服务器。在具体的业务逻辑中,查询订单信息时会遍历已有订单数据并查找对应订单信息。

4. 在客户端编写代码调用服务。例如:

public class OrderServiceClient {    public static void main(String[] args) throws Exception {        TTransport transport = new TSocket("localhost", 9090);        transport.open();        TProtocol protocol = new TBinaryProtocol(transport);        OrderService.Client client = new OrderService.Client(protocol);        int orderId = 5;        try {            Order order = client.getOrder(orderId);            System.out.printf("Order #%d: %s, %.2f\n", order.orderId, order.customerName, order.amount);        } catch (TException e) {            System.out.println("Failed to get order: " + e.getMessage());        }        transport.close();    }}

在客户端代码中,创建一个与服务器通信的TSocket对象,然后使用该对象创建TProtocol对象,并利用其创建OrderService.Client客户端代理对象。通过客户端代理对象调用服务器提供的服务接口和方法,并获取服务结果。

如何测试thrift服务

下面是一个基于TestNG的Thrift自动化测试框架设计思路,并给出对应的Java代码实现。

1. 模块划分

该框架可以划分为以下几个模块:

- 测试套件模块:定义测试用例,包括测试方法、输入参数和预期结果等。

- 测试数据模块:提供测试所需的数据,例如订单信息、客户信息等。这些数据可以从文件、数据库或其他来源中读取。

- 测试环境模块:创建并初始化测试环境,包括启动测试服务器和创建Thrift客户端代理对象等。

- 测试执行模块:执行测试用例,并进行结果断言和记录。可以使用Mock对象模拟测试环境,从而避免对真实环境造成影响。

- 测试报告模块:生成测试报告,展示测试的结果和统计信息等。

2. 实现方式

在Java中,可以通过以下方式来实现上述模块:

- 使用TestNG注解定义测试用例(例如@Test)和测试套件(例如@Suite)。

- 创建POJO类,表示订单信息、客户信息等测试数据。

- 使用@BeforeSuite、@AfterSuite、@BeforeTest、@AfterTest等注解,在适当的时机创建和清除测试环境。

- 在测试方法中,通过Thrift客户端代理对象调用服务接口和方法,并对返回结果进行断言和记录。

- 使用TestNG提供的Reporter API来生成测试报告。

下面是一个基于TestNG的Thrift自动化测试框架示例代码,假设服务接口为example.OrderService:

import example.Order;import example.OrderService;import org.apache.thrift.protocol.TBinaryProtocol;import org.apache.thrift.transport.TSocket;import org.testng.annotations.*;import java.util.Random;public class OrderServiceTest {    private static final int PORT = 9090;    private static OrderService.Client client;    @BeforeSuite    public void setUp() throws Exception {        // 创建Thrift客户端代理对象        TSocket socket = new TSocket("localhost", PORT);        socket.open();        client = new OrderService.Client(new TBinaryProtocol(socket));    }    @AfterSuite    public void tearDown() throws Exception {        // 关闭Thrift客户端        if (client != null) {            client.getInputProtocol().getTransport().close();        }    }    @DataProvider(name = "orderData")    public Object[][] createOrderData() {        // 创建订单数据        return new Object[][]{                {new Order(1, "Customer1", 100)},                {new Order(2, "Customer2", 200)},                {new Order(3, "Customer3", 300)}        };    }    @Test(dataProvider = "orderData")    public void testGetOrder(Order order) throws Exception {        // 测试用例1:查询已有订单信息        Order result = client.getOrder(order.orderId);        assertOrderEquals(order, result);        // 测试用例2:查询不存在的订单信息        try {            client.getOrder(0);        } catch (Exception e) {            assertErrorMessageEquals("Order not found", e.getMessage());        }    }    // 添加更多测试用例...    private void assertOrderEquals(Order expected, Order actual) {        // 比较订单信息是否相等    }    private void assertErrorMessageEquals(String expected, String actual) {        // 比较错误消息是否相等    }}

在上述代码中,使用TestNG提供的注解@BeforeSuite和@AfterSuite分别创建和关闭Thrift客户端代理对象,并使用@DataProvider注解定义测试数据。在@Test注解的测试方法中,通过Thrift客户端代理对象调用服务方法,并对返回结果进行断言。此外,还可以结合持续集成工具(例如Jenkins)和自动化测试框架(例如Selenium或Appium)来实现部署、测试和反馈的自动化流程。

往期推荐

聊聊工作中的自我管理和向上管理

经验分享|测试工程师转型测试开发历程

聊聊UI自动化的PageObject设计模式

细读《阿里测试之道》

我在阿里做测开

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

asp.net+sqlserver校园超市进销存管理系统的开发与设计

随校园超市管理系统功能&#xff1a;包括&#xff0c;管理员登录、员工登录&#xff1b;商品信息管理&#xff0c;能够查看商品的基本信息&#xff0c;对商品的基本信息进行修改&#xff1b;员工信息管理&#xff0c;管理员工基本信息&#xff0c;设置与不同的权限&#xff0c;…

【Selenium中】——全栈开发——如桃花来

目录索引 查找元素&#xff1a;查找方法&#xff1a;单个元素查找&#xff1a;多个元素查找&#xff1a;*代码演示&#xff1a;* 元素交互操作&#xff1a;清空文字&#xff1a; 推荐的变量名定义名称&#xff1a;执行JavaScript &#xff1a;滚动页面方法&#xff1a;*滚动到底…

NetCore发布到Docker-局域网

1.说明: 1) 目标&#xff0c;NetCore 项目通过Jenkins发布到局域网的服务器上 2) 单机版的请参考 https://mp.csdn.net/mp_blog/creation/editor/130619862 2.安装插件 Publish Over SSH 1) Dashboard -> Manage Jenkins -> 插件管 2) 安装完之后 2.添加SSH服务器 1) …

【重磅分享】免梯子GPT,教你玩转GPT正确姿势

火了一周的 ChatGPT&#xff0c;xd 不允许还有小伙伴不知道这个东西是什么&#xff1f;简单来说就是&#xff0c;你可以让它扮演任何事物&#xff0c;据说已经有人用它开始了颜色文学创作。因为它太火了&#xff0c;所以&#xff0c;本周特推在几十个带有“chatgpt”的项目中选…

VOC标签格式转yolo格式并划分训练集和测试集

目录 一、了解VOC数据格式 1、Annotations目录 2. JPEGImages目录 二、YOLO格式 三、VOC标签格式转yolo格式并划分训练集和测试集 一、了解VOC数据格式 Pascal VOC数据集下载地址&#xff1a;The PASCAL Visual Object Classes Homepage 介绍一下VOC 数据集下载后的目录结构…

Vue(动画、过渡、动画库)

一、动画 1.使用场景 在插入、更新或者移除DOM元素时候&#xff0c;在合适的时候给元素添加样式类型。 2. 使用 首先在组件style创建出现和离开的动画 然后对动画进行处理&#xff08;命名注意是v-enter-action和v-leave-action&#xff09; 如果name命名在默认标签中使用之后…

Redis高可用系列——ZSet类型底层详解

文章目录 概述skiplistredis的skiplist 概述 Redis 中的 zset 是一种有序集合类型&#xff0c;它可以存储不重复的字符串元素&#xff0c;并且给每个元素赋予一个排序权重值&#xff08;score&#xff09;。Redis 通过权重值来为集合中的元素进行从小到大的排序。zset 的成员是…

一、H3C-NE实验-Telnet实验

实验环境&#xff1a; 1. 在电脑搜索栏&#xff0c;搜“程序”&#xff0c;确保Telnet服务开启 2. 防火墙处于关闭状态 实验工具&#xff1a;H3C Cloud Lab、SecureCRT 实验拓扑&#xff1a; 实验步骤&#xff1a; 1. 登录路由器&#xff0c;配置路由器相关信息&#xff0c;…

【容器化】Docker 使用Ⅰ

【容器化】Docker 使用Ⅰ Docker Hello World运行交互式的容器启动容器&#xff08;后台模式&#xff09;停止容器Docker 的使用获取镜像启动容器后台运行停止一个容器进入容器导出和导入容器删除容器运行一个 web 应用查看 WEB 应用容器网络端口的快捷方式查看 WEB 应用程序日…

618前夕,淘宝天猫大变革,探索电商天花板之上的价值

2023年淘宝天猫618商家大会&#xff0c;恰逢淘宝20周年&#xff0c;也是阿里“16N”组织架构改革&#xff0c;淘宝天猫“独立”经营后&#xff0c;管理和运营团队的首次亮相。除了淘宝天猫618的具体策略&#xff0c;最受关注的&#xff0c;还有淘宝天猫的大变革——涉及淘宝天猫…

JavaScript实现贪吃蛇小游戏(网页单机版)

文章目录 项目地址项目介绍游戏开始游戏暂停游戏模式游戏死亡重新开始 结尾 今天使用 JavaScript 实现了一个网页版的贪吃蛇小游戏。 项目地址 Github: https://github.com/herenpeng/snakeGitee: https://gitee.com/herenpeng/snake 项目介绍 游戏开始 使用浏览器打开 sn…

【历史上的今天】4 月 21 日:微处理器先驱诞生;Winamp 发布;COPPA 正式生效

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 21 日&#xff0c;在 2006 年的今天&#xff0c;数码资讯网站 IT168 CEO 确认公司已经收购技术社区 ITPUB。宋刚则表示&#xff0c;收购 ITPUB 将有助于 …

C++string类的模拟实现

string类的模拟实现 1.string构造函数的实现问题2.浅拷贝3.深拷贝4.写时拷贝&#xff08;只做了解&#xff09;5.string类的模拟实现 1.string构造函数的实现问题 【问题1】 【问题2】没有显示定义拷贝构造函数&#xff0c;使用编译器默认生成拷贝构造函数 显示定义&#x…

git: fatal: detected dubious ownership

原因及解决&#xff1a; 当一个 仓库被与当前用户不同的用户克隆时&#xff0c;就会发生这种情况。我是在重新安装 Windows 后遇到了这个问题&#xff0c;但使用了以前克隆的 git 存储库&#xff08;在单独的分区上&#xff09; 右键单击 仓库文件夹&#xff0c;属性&#xf…

DNSPod十问周康:如何成为办公硬件领域的乔布斯?

本期嘉宾 周康 成者科技 CEO 周康&#xff0c;成者科技CEO、首席产品官。2013年创办成者科技&#xff0c;通过AI和互联网技术&#xff0c;推动办公设备智能化。担任CEO期间&#xff0c;带领成者科技攻克书籍扫描技术&#xff0c;融入大量的AI视觉技术&#xff0c;优化扫描质量…

芒果YOLO专栏的YOLOv8的Baseline改进:打造更方便版本NEW YOLOv8

关于芒果YOLO改进专栏的YOLOv5和YOLOv8的改进 - YOLOAir3解析 本篇文章作为一个Baseline改进解析篇 优势在于:改起来更加方便 文章目录 第一种改进方式第二种改进方式使用方式网络配置训练其他使用关于官方YOLOv8的改进方式:由于YOLOv5作者 发布的 YOLOv8,是使用的全新架构…

微服务分布式事务处理

当我们向微服务架构迁移时&#xff0c;如何处理好分布式事务是必须考虑的问题。这篇文章介绍了分布式事务处理的两种方案&#xff0c;可以结合实际采用合适的解决方案。原文&#xff1a;Handling Distributed Transactions in the Microservice world[1] 如今每个人&#xff08…

图片投票小程序微信投票软件发起投票软件互动酷投票

现在来说&#xff0c;公司、企业、学校更多的想借助短视频推广自己。 通过微信投票小程序&#xff0c;网友们就可以通过手机拍视频上传视频参加活动&#xff0c;而短视频微信投票评选活动既可以给用户发挥的空间激发参与的热情&#xff0c;又可以让商家和企业实现推广的目的&am…

Linux指令 热键

热键 上一次我们说到了linux的基本指令&#xff0c;这次我们先说一下热键 TAB TAB键在linux中有什么作用呢&#xff1f;&#xff1f; 在Linux中&#xff0c;假设我们想要输入的指令忘记了&#xff0c;我们可以TAB两下&#xff0c;帮我们补全命令或者假如命令太多&#xff0…

openfeign源码解析

概括 Feign是Netflix开发的声明式、模板化的HTTP客户端&#xff0c;其灵感来自Retrofit、JAXRS-2.0以及WebSocket。 Feign可帮助我们更加便捷、优雅地调用HTTP API。 Feign支持多种注解&#xff0c;例如Feign自带的注解或者JAX-RS注解等。Spring Cloud openfeign对Feign进行了 …