测试
用户手册
测试
测试是任何软件开发或集成过程中的关键环节。通常,Camel 用户会将各种不同的技术通过多种不同的 EIP 组合在一起,涉及不同的端点、语言、Bean 集成以及依赖注入,因此很容易出现问题!测试是确保一切按预期运行的关键武器。
Camel 是一个 Java 库,因此你可以在 JUnit 中轻松编写测试。不过,Camel 项目一直致力于让 Camel 的测试尽可能简单且强大,为此我们引入了以下特性。
测试模块
支持以下模块:
| 组件 | 说明 |
|---|---|
camel-test-junit5 | JUnit 5:用于在独立模式(或不使用 Spring)下测试 Camel |
camel-test-main-junit5 | JUnit 5:用于在 Camel Main 模式下测试 Camel |
camel-test-spring-junit5 | JUnit 5:用于配合 Spring / Spring Boot 测试 Camel |
camel-test-junit5 | JUnit 6:用于在独立模式(或不使用 Spring)下测试 Camel |
camel-test-main-junit5 | JUnit 6:用于在 Camel Main 模式下测试 Camel |
camel-test-spring-junit5 | JUnit 6:用于配合 Spring / Spring Boot 测试 Camel |
camel-test-infra | Camel Test Infra:Camel Test Infra 是一组模块,利用现代 JUnit 5 特性来抽象测试基础设施的准备与执行。除其他功能外,它还提供了基础设施抽象(基于 Test Containers——它是 camel-testcontainers 组件事实上的继任者),以及针对 Camel Context 本身的 JUnit 5 扩展。 |
camel-jbang-test | Camel CLI 测试插件:一个 Camel CLI 插件,用于在使用 JBang 进行原型开发时编写自动化测试。这些测试能够从一开始就启动 Camel 集成并验证其逻辑。该测试插件无需任何项目配置,因此你可以直接开始编写和运行自动化测试。 |
| 如果你使用的是 Camel Quarkus,可以在 Camel Quarkus 文档中找到关于如何使用 Quarkus 和 Camel 进行测试的相关信息。 |
|---|
在所有方式中,测试类的写法基本相同,因为它们都复用了 Camel 的绑定与注入注解。
| 关于不同测试模块的更多详细信息,请参阅上表链接中各自的文档。 |
|---|
测试功能
Camel 提供了一组在编写 Camel 单元测试或集成测试时常用的功能。
测试端点
Camel 提供了若干端点,可以让测试更加容易。
| 名称 | 说明 |
|---|---|
| Mock | 使用 mock 测试路由和中介规则,并允许向端点添加断言。 |
| DataSet | 用于负载测试和持久性测试,该端点提供了创建大量消息并发送给各个组件的方式,同时断言这些消息被正确消费。 |
| DataSet Test | 用于自动从另一个端点加载一组预期消息,然后将这些消息与到达该端点的消息进行比较。 |
其中最主要的端点是 Mock 端点,它允许向不同的端点添加预期结果;随后你可以运行测试,并在测试结束时断言这些预期是否得到满足。
对物理传输技术进行桩实现
如果你想测试某条路由,但希望避免真正使用实际的物理传输方式,那么以下端点会很有用:
| 例如,对转换路由进行单元测试,而不是执行完整的集成测试 |
|---|
| 名称 | 说明 |
|---|---|
| Direct | 由生产者直接调用消费者,从而执行单线程(非 SEDA)的 VM 内调用,这可用于模拟物理传输层 |
| SEDA | 通过 BlockingQueue 将消息异步投递给消费者,非常适合测试异步传输方式 |
| Stub | 工作方式类似于 SEDA,但不会校验端点 URI,因此打桩非常简单。 |
测试已有的路由
Camel 提供了一些功能,用于在无法或不愿使用 Mock 等组件时,辅助对已有路由进行测试。
例如,你可能有一条已可用于生产的路由,希望通过某个第三方 API 向该路由发送消息来进行测试。
| 名称 | 说明 |
|---|---|
| NotifyBuilder | 允许你在某个特定条件发生时收到通知。例如,当路由处理完五条消息时。你可以构建复杂的表达式来匹配触发通知的条件。 |
| AdviceWith | 允许你使用 RouteBuilder 的风格来增强(advice)一条已有的路由。例如,你可以将消息发送(或发送并跳过)到 Mock 端点,以验证 Camel 发送的消息是否符合预期。 |
集成测试
集成测试的目的是验证整个组件或服务与其同其他组件、基础设施和服务的集成是否正常。
通常,集成测试会将 Camel 应用作为一个整体启动,并包含消息代理、数据持久化以及与 Camel 应用交互的第三方服务等测试基础设施。
有关详情以及如何应对常见的集成测试挑战,请参阅本章关于集成测试的内容。
Camel 用户发现有不少第三方测试库非常有用,尤其是在进行集成测试时。
| 名称 | 描述 |
|---|---|
| Citrus 集成测试 | 自动化集成测试框架,支持多种消息协议和数据格式 |
| YAKS | YAKS 是基于 Citrus 的框架,用于在 Kubernetes 上实现云原生 BDD 测试 |
Citrus 测试框架
作为为 Camel 应用编写集成测试的示例,你可以使用 Citrus 测试框架。Citrus 是一个开源的 Java 测试框架,专注于集成测试和消息处理。
该框架与 Apache Camel 集成得非常好。Citrus 可以帮助你编写自动化集成测试,对测试基础设施进行妥善准备,并与对外暴露的服务建立连接,从而借助强大的消息验证能力对 Camel 应用进行验证,支持多种消息数据格式(例如 XML、Json、YAML、纯文本)。
请参阅 Citrus 文档,了解如何为 Apache Camel 应用编写自动化测试。以下章节可能对 Camel 开发者和测试人员很有参考价值:
| 名称 | 描述 |
|---|---|
| Citrus 与 Camel 路由 | 在测试过程中启动和停止 Camel 路由。 |
| Citrus 与 Camel 测试基础设施 | 在 Citrus 测试过程中启动和停止 Camel 测试基础设施服务。 |
| Citrus 与 Camel 处理器 | 在 Citrus 测试中使用 Camel 处理器、转换器和数据格式 EIP。 |
| Citrus 与 Camel CLI | 在测试过程中使用 JBang 运行 Camel 集成。 |
| Citrus 与 JBang 和 Camel CLI 提供了良好的集成。这意味着你可以从一开始就在 Camel CLI 的原型设计阶段使用 Citrus 编写自动化测试。详见 Camel CLI 测试插件 章节。 |
|---|
Citrus 与 Quarkus 和 Spring Boot 集成,因此你可以基于熟悉的框架和库来编写测试。你可以从一组受支持的测试引擎(如 JUnit Jupiter)中进行选择,以便在构建生命周期的一部分或在你喜爱的 IDE 中运行这些测试。
评论
登录后参与评论
KnowForge