Vert.x Java开发指南——第五章 测试Vert.x代码

Java Vertx 全解析 Vertx Java 异步编程套件 阅读详情

第五章 测试Vert.x代码

版权声明:本文为博主自主翻译,转载请标明出处。 https://blog.youkuaiyun.com/elinespace/article/details/80470846

相应代码位于本指南仓库的step-4目录。

到目前为止,我们已经开发了未包含测试的Wiki实现。这自然不是一种好的实践,因此让我们看一下如何为Vert.x代码编写测试。

5.1 开始

vertx-unit模块提供了工具来测试Vert.x中的异步操作。除此之外,你还可以使用你选择的测试框架,如JUnit。

使用JUnit,需要的Maven依赖如下:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-unit</artifactId>
    <scope>test</scope>
</dependency>

JUnit测试需要注解为VertxUnitRunner runner,以便使用vertx-unit特性:

@RunWith(VertxUnitRunner.class)
public class SomeTest {
    // (...)
}

通过这个runner,JUnit测试和生命周期方法接收一个TestContext参数。这个对象提供了对基础断言、存储数据上下文的访问,以及几个面向异步的帮助类,我们将在本节中可以看到。

为了说明它,让我们考虑一个异步场景,我们想要检查一个timer任务被调用了一次,以及一个周期任务被调用了三次。由于这个代码是异步的,所以测试方法在测试完成之前就退出,因此,使测试通过或失败还需要以异步方式进行:

@Test /*(timeout=5000)*/ ⑧
public void async_behavior(TestContext context) { ①
    Vertx vertx = Vertx.vertx(); ②
    context.assertEquals("foo", "foo"); ③
    Async a1 = context.async(); ④
    Async a2 = context.async(3); ⑤
    vertx.setTimer(100, n -> a1.complete()); ⑥
    vertx.setPeriodic(100, n -> a2.countDown()); ⑦
}

① TestContext是由runner提供的一个参数。

② 由于我们在单元测试中,我们需要创建一个Vert.x上下文。

③ 此处是一个基本的TestContext断言的示例。

④ 我们得到第一个Async对象,它接下来可能完成(或失败)。

⑤ 这个Async对象作为一个countdown工作,在三次调用之后成功完成。

⑥ 我们在timer触发时完成。

⑦ 每次周期任务触发一个countdown。测试在所有Async对象完成后通过。

⑧ 有一个默认(long)超时时间用于异步测试用例,但是它可以通过JUnit的@Test注解覆盖。

5.2 测试数据库操作

数据库服务非常适合编写测试。

我们首先需要部署数据库Verticle。我们将配置JDBC链接为HSQLDB,使用内存存储,当成功的时候,我们将获取一个服务代理用于我们的测试用例。

由于这些操作的需要,我们利用JUnit的before/after生命周期方法:

private Vertx vertx;
private WikiDatabaseService service;
@Before
public void prepare(TestContext context) throws InterruptedException {
    vertx = Vertx.vertx();
    JsonObject conf = new JsonObject() ①
        .put(WikiDatabaseVerticle.CONFIG_WIKIDB_JDBC_URL,               "jdbc:hsqldb:mem:testdb;shutdown=true")
        .put(WikiDatabaseVerticle.CONFIG_WIKIDB_JDBC_MAX_POOL_SIZE, 4);
    vertx.deployVerticle(new WikiDatabaseVerticle(), new DeploymentOptions().setConfig(conf),
    context.asyncAssertSuccess(id -> ②
        service = WikiDatabaseService.createProxy(vertx,WikiDatabaseVerticle.CONFIG_WIKIDB_QUEUE)));
}

① 我们只是复写了Verticle的部分配置,其它使用默认值。

② asyncAssertSuccess对于提供一个检测异步操作成功的handler是非常有用的。它有一个变体是无参的,另一个变体像这个,此时我们可以链接结果到另一个handler。

Vert.x的清理很简单,我们再次使用asyncAssertSuccess以确保没有遇到错误:

@After
public void finish(TestContext context) {
    vertx.close(context.asyncAssertSuccess());
}

数据库服务的操作本质上是CRUD操作,因此使用一个JUnit测试用例合并它们全部是一个测试的好方法:

@Test
public void crud_operations(TestContext context) {
    Async async = context.async();
    service.createPage("Test","Some content",context.asyncAssertSuccess(v1 -> {
        service.fetchPage("Test",context.asyncAssertSuccess(json1 -> {
            context.assertTrue(json1.getBoolean("found"));
            context.assertTrue(json1.containsKey("id"));
            context.assertEquals("Some content",json1.getString("rawContent"));
            service.savePage(json1.getInteger("id"),"Yo!",context.asyncAssertSuccess(v2 -> {
                service.fetchAllPages(context.asyncAssertSuccess(array1 -> {
                    context.assertEquals(1,array1.size());
                    service.fetchPage("Test",context.asyncAssertSuccess(json2 -> {
                        context.assertEquals("Yo!",json2.getString("rawContent"));
                        service.deletePage(json1.getInteger("id"),v3 -> {
                            service.fetchAllPages(context.asyncAssertSuccess(array2 -> {
                                context.assertTrue(array2.isEmpty());
                                async.complete();①
                                }));
                            });
                        }));
                    }));
                }));
            }));
        }));
    async.awaitSuccess(5000);②
}

① 这是唯一的Async最终完成的地方。

② 这是在退出测试用例方法和依赖JUnit超时之间的取舍。此处,测试用例线程执行等待直到Async完成或者超时周期过去。

【Java架构进阶入门到精通】Vert.x 这是目前最快的 Java 框架 如果您搜索“[最佳网络框架]”,您可能会偶然发现Techempower基准测试,其中排名超过300个框架,在那里你可能已经注意到Vert.x是排名最高的。 Vert.x是一个多语言 Web 框架,它支持[Java],Kotlin,Scala,Ruby和Javascript支持的语言之间的共同功能。无论语言如何,Vert.x都在Java虚拟机(JVM)上运行。模块化和轻量级,它面向微服务开发。 Techempower基准测试衡量从[数据库]更新,获取和交付数据的性能。每秒提供的请求越多越好。在这种涉及很少计. 阅读详情

相关推荐

第5章 VERT.X5迁移指南(一)Vert.x 5的更新内容

异步模型重构:全面转向Future编程回调模型彻底移除Vert.x 5删除了所有基于回调的API(如),需将所有旧版代码改造为基于Future的链式调用。// Vert.x 3/4的回调写法} else {});// Vert.x 5的Future写法所有返回Future的异步方法不再支持回调参数Verticle基类start()方法直接返回Future,需使用替代未被弃用,但新项目建议使用Future链式操作与异常处理新增composemaprecover// 降级处理});

err2008的专栏 598

这是目前最快的 Java 框架,300个框架中排名第一,真香

如果您搜索“ 最佳网络框架 ”,您可能会偶然发现Techempower基准测试,其中排名超过300个框架,在那里你可能已经注意到Vert.x是排名最高的。 Vert.x是一个多语言 Web 框架,它支持 Java ,Kotlin,Scala,Ruby和Javascript支持的语言之间的共同功能。 无论语言如何,Vert.x都在Java虚拟机(JVM)上运行。 模块化和轻量级,它面向微服务开发。 ...

weixin_46302190的博客 627

Vert.X下Kotlin RESTful API开发指南

本文详细介绍了如何使用Vert.X框架和Kotlin语言开发RESTful API。首先展示了如何创建一个RESTful API来获取、排序产品数据和按ID获取产品详情。接着,讲解了使用POST方法添加新产品数据的流程,包括处理JSON数据和将其转换为Kotlin模型类。此外,还介绍了如何使用PUT方法更新产品信息,以及如何在Postman中测试这些HTTP方法。

weixin_30021053的博客 514

一文带你认识目前最快的Java框架:Vert.x

在使用vertx-web的一些测试中,性能有所下降,但由于它似乎源于优化,因此可能会在后续版本中得到解决。在使用并发时,我们可以从如今的许多选项中获取,例如Promise,Future,Rx,以及Vert.x自己的惯用方法。凭借更强的并发支持,Vert.x不仅适用于IO,也适用于需要并行计算的CPU繁重流程。Vert.x是一个多语言Web框架,它支持Java,Kotlin,Scala,Ruby和Javascript支持的语言之间的共同功能。由于它是跨处理程序的简化,我们可以专注于重要的事情,如数据库查询。

qq_66627105的博客 1568

构建未来Java项目的Vert.x模板

Vert.x 是一个用于构建响应式应用程序的工具包和运行时,特别适合于高流量、低延迟的场合。它采用异步事件驱动模型,能够轻松应对分布式和多核架构,为开发者提供了构建现代网络应用的新途径。Vert.x 是基于 JVM 平台的,但其设计理念也支持其他语言,比如 JavaScript、Groovy 和 Ruby。项目起源于对现代网络应用开发的需求,旨在提供一个轻量级、模块化、以及具备反应式编程特性的项目模板。在企业应用开发中,我们常常面临需要快速搭建、迭代和部署高效、可伸缩的服务端应用。

weixin_42620563的博客 895

SoC设计中的RDC陷阱:如何避免异步复位导致的亚稳态问题

本文深入探讨了SoC设计中由异步复位引发的复位域交叉(RDC)陷阱及其导致的亚稳态风险。通过分析实际案例,文章系统性地提出了以同步复位优先、异步复位同步释放为核心的设计原则,并介绍了电路级加固与验证策略,为构建稳健的SoC复位架构提供了实用指南。

weixin_29280657的博客 419

【Java】初学Vert.x(1)

今天开始将分享自己初学Vert.x的一些经验和看法。里面有不足或想得不周到的地方,还请各位看官多多包涵。

Kida 的躺平小屋 1342

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1276

vert.x框架学习笔记

摘要Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统的开销。因此相比较传统的阻塞模型,异步模型能够很大层度的提高系统的并发量。Vert.x除了异步之外,还提供了非常多的吸引人的技术,比如EventBus,通过EventBus可以非常简单的实现分布式消息,进而为分布式系统调用,微服务奠定基础。

zwj1030711290的优快云 3624

MagicDraw-用例图

MagicDraw-用例图

木头征的博客 3129

AVM环视:系统搭建整体流程

文章目录前言一、畸变矫正鱼眼相机二、透视变换三、图像拼接四、图像融合总结 前言 由于正在做AVM环视,所以记录一下整个过程,归纳为一个系列文章,并对期间遇到的错误进行归纳整理。本文主要概括了AVM环视的大致流程和逻辑,不涉及代码部分,仅供思路参考,其中涉及的具体技术会在后期整理为小章节进行分析。 一、畸变矫正 鱼眼相机 做环视基本上使用到的是鱼眼照片,因为鱼眼相机的视角范围可以达到220°到230°,所以一个相机就可以采集到一个面的全部信息,例如汽车具有四个面,那么在汽车的前后左右分别安装一个鱼眼相机.

qq_34468890的博客 6536

Vert.x Java开发指南——第一章 介绍

第一章 介绍 该指南是Vert.x异步编程的一个入门介绍,主要针对那些熟悉主流、非异步Web开发框架和库(如Java EE、Spring)的开发者。 1.1 关于该手册 我们假定读者已经熟悉Java编程语言及其生态系统。 我们将以一个Wiki Web应用作为开始,它开始采用关系数据库和服务端页面渲染;然后我们通过几个步骤逐步演进该应用,直到它成为一个现代的单页应用,并且拥有实时Web的...

边城白衣的博客 6515

QT Android开发之Android端usb调试模式设置与问题解决

QT Android开发之Android端usb调试模式设置与问题解决 一.QT android开发android端usb调试模式设置 QT android开发环境搭建完成后,android设备需要打开usb调试模式才能正常连接,下面以小米ipad为例进行设置(其他手机和ipad设置方法类似) 二.小米ipad打开usb调试模式 1.设置----我的设备-----全部参数信息-----OS版本---点击这里6次以上就进入开发者模式。

热土程序园,利他愉己~ 1129

Vert.x Java开发指南——第二章 使用Vert.x编写最小可用Wiki

第二章 使用Vert.x编写的最小可用Wiki 相应的源代码位于该指南代码库的step-1目录下 我们将从第一次迭代开始,最简单的代码可能是使用Vert.x编写一个Wiki。而下一次迭代将在代码库中引入更多的简洁以及适当的测试,我们将看到基于Vert.x的快速原型是一个既简单又现实的目标。 现阶段,Wiki将使用HTML页面的服务端渲染以及通过JDBC链接进行数据持久化。为了完成这些...

边城白衣的博客 8143

【AI编程】Codex 进阶与高阶技巧:从熟练到精通——2026 最新教程

Skill 是 Codex 的「插件」—— 一段 Markdown 定义触发条件、输入参数和执行流程。比自定义命令更强大,支持参数化、多步骤、条件判断。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 192

基于Costas环的载波同步实现及Matlab仿真

其中,第一个相位环接收带噪声的待同步载波,并产生一个相位误差信号,这个误差信号再通过第二个相位环进行反馈控制,使得两个相位环的相位差保持为90度,最终输出同步载波信号。接下来,我们可以编写Costas环的仿真程序,并将上面生成的信号输入到Costas环中进行同步,最终输出同步后的载波信号。综上所述,本文介绍了如何使用Matlab实现基于Costas环的载波同步,并给出相应的源代码。上述代码中,我们初始化了Costas环的各个参数,然后通过循环迭代实现了相位估计和相位误差控制,最终输出了同步后的载波信号。

2301_78484069的博客 1048

Vert.x Java开发指南——第八章 安全和访问控制

第八章 安全和访问控制 相应代码位于本指南仓库的step-7目录下 使用Vert.x,安全和访问控制非常容易实现。在本章中,我们将介绍: 迁移HTTP到HTTPS 添加用户认证以及基于分组的权限到Web应用中 使用JWT对Web API进行访问控制 8.1 在Vert.x中支持HTTPS Vert.x为SSL加密网络链接提供了支持。在生产环境中暴露HTTP服务器比较常见的方式...

边城白衣的博客 3089

资产会计 Transaction Type 与业务交易的 Post to Affiliated Company 不一致导致的 AAPO176:成因剖析与修复指引

本文解析了SAP资产会计中常见的"AAPO176"错误提示,指出当交易类型(TType)与业务交易(Business Transaction)的"关联公司过账"(Post to Affiliated Company)标志不一致时,系统会拒绝过账。作者详细说明了该标志的作用机制,并提供了四种解决方案:修正交易类型使用、匹配正确的业务交易、调整系统配置或建立映射关系。文章还通过实际案例展示了配置错误对集团合并报表的影响,并附带了用于检查配置一致性的ABAP脚本。该错误通常

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 395

Vert.x(vertx) 实现TCP服务

对于Java开发人员,想要实现一个http服务,非常简单,写个servlet,打成war包,放到tomcat下就能运行。但如果要实现一个tcp服务就没那么简单了,因为tcp是传输层协议,并不像http那样,有类似tomcat的中间件给我们封装底层的网络协议,封装线程的交互。要实现一个tcp服务,只能自己动手处理网络和线程问题,这是非常考验编程功底的事情,而且如果团队人员素质不高,项目周期要求较短的...

happyfly的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Vert.x vs. Micronaut:2025年高并发Java框架选型指南

在2025年的Java生态系统中,Vert.x和Micronaut作为两个高性能框架,各自在异步编程和微服务领域占据重要地位。本文将深入比较它们的架构设计、性能特点、适用场景和开发体验,帮助你根据项目需求做出明智选择。文章包含详细代码示例和实际场景分析,助你掌握这两个框架的核心差异。Vert.x是一个轻量级、高性能的响应式应用框架,采用事件循环和非阻塞IO模型。它本质上是一个工具包,提供了构建响应式应用的底层组件。核心特点多语言支持(Java、Kotlin、Groovy等)真正的非阻塞I/O。

龚小帅的博客 1629

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Vert.x Codegen 使用指南

Vert.x Codegen 使用指南 项目介绍 Vert.x Codegen 是一个用于异步多语言 API 的代码生成器,它为 Vert.x 生态系统提供强大的支持。这个工具通过注解处理器和类模型JSON转换器,使得数据对象能够便捷地处理,并且包含了对Protobuf的支持,大大简化了高效开发复杂服务的过程。它是构建响应式、高性能应用程序的关键组件之一,特别是在微服务架构中。 项目快速启动 要...

gitblog_00675的博客 1043

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Vert x开发指南

Vert x开发指南

jhfyuf的博客 450

Vert.x!这是目前最快的 Java 框架

如果您搜索“最佳网络框架”,您可能会偶然发现Techempower基准测试,其中排名超过300个框架,在那里你可能已经注意到Vert.x是排名最高的。Vert.x是一个多语言 Web 框...

Java技术栈,分享最主流的Java技术 1835

Tad.x 基准测试实现全解析:基于 Java 21 与 Vert.x 异步栈的高性能 Web 框架调优实践

Tad.x(`tadx`)是 [FrameworkBenchmarks](https://link.gitcode.com/i/0764c7ace7ebc88d5999a23a191434de)(TechEmpower Web Framework Benchmarks)项目中的一个 Java Web 框架基准测试实现,主要用于通过统一的 7 类测试场景衡量 Web 框架的性能表现。本篇文章以 [t

gitblog_00697的博客 932

Vert.x Blueprint Todo Backend 项目教程

Vert.x Blueprint Todo Backend 项目教程 1. 项目介绍 Vert.x Blueprint Todo Backend 是一个基于 Vert.x 框架的反应式待办事项后端实现项目。该项目展示了如何使用 Vert.x 和多种持久化方式(如 JDBC、MongoDB 等)来构建一个 RESTful API。Vert.x 是一个高性能、异步、事件驱动的框架,适用于构建现代化的微...

gitblog_00713的博客 1045
上一篇: Vert.x Java开发指南——第四章 重构为Vert.x服务
下一篇: Vert.x Java开发指南——第六章 与第三方的Web服务集成
边城白衣
博客等级 码龄14年 106粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值