集成测试
集成测试
集成测试是一种特殊的测试形式,通常需要启动一个完整的 Apache Camel 应用程序,以验证它与其他组件和服务之间的交互。
一个典型的集成测试场景会验证各服务之间的协作以及它们彼此的集成。这通常涉及基础设施,尤其是数据持久层、消息代理或第三方服务。
| 在软件开发中,单元测试和集成测试都是必不可少的,前者用于确保功能正确,后者用于确保与集成服务的兼容性。两者结合,才能对您的 Camel 应用程序实现成功的质量保证。 |
|---|
Citrus 测试框架
作为为 Camel 应用程序编写集成测试的示例,您可以使用 Citrus 测试框架。
Citrus 是一个开源的 Java 测试框架,专注于集成测试和消息处理。
该框架与 Apache Camel 集成得非常好。Citrus 帮助您编写自动化集成测试,它可以恰当地准备测试基础设施,并连接到已暴露的服务,通过强大的消息校验能力(支持多种消息数据格式,如 XML、Json、YAML、纯文本)来验证 Camel 应用程序。
请参阅 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 中运行测试。
Quarkus 测试支持
在使用 Quarkus 编写应用程序时,你很可能会使用带有 @QuarkusTest 或 @QuarkusIntegrationTest 注解的 JUnit Jupiter 测试类。你可以在此基础上结合 Citrus 继续使用它们,从而为应用程序编写自动化集成测试。
以下示例在一个 Quarkus 测试中使用了 Citrus Quarkus 扩展:
@QuarkusTest
@CitrusSupport
public class CamelDemoApplicationIT implements TestActionSupport {
@BindToRegistry
private final HttpClient httpClient = HttpEndpoints.http()
.client()
.requestUrl("http://localhost:8081")
.build();
@BindToRegistry
private final KafkaEndpoint completed = new KafkaEndpointBuilder()
.topic("completed")
.build();
@CitrusResource
private TestCaseRunner t;
@Test
void shouldVerifyDemoApp() {
t.given(
http().client(httpClient)
.send()
.post("/bookings")
.message()
.body(Resources.fromClasspath("booking.json"))
);
t.when(
http().client(httpClient)
.receive()
.response(HttpStatus.OK)
);
t.then(
receive().endpoint(completed)
.message()
.body("Booking complete!")
);
}
}Citrus 提供了一个 Quarkus 扩展,其中包含 @CitrusSupport 注解。将其添加到测试类后,测试即可使用 Citrus 端点组件以及用于编写集成测试的 Java 领域特定语言。
上面的示例使用常规的 @QuarkusTest 注解来启动 Camel 应用程序。然后,测试使用 Citrus 端点与对外暴露的 Http 服务进行交互,并以给定的 bookings.json 有效负载调用 /bookings 端点。预期结果是返回 200 OK 响应,同时在 Kafka 主题 completed 上产生一条事件消息。响应和事件内容都通过预期的消息内容进行验证(例如 Http 状态码 200 OK)。
表示集成测试的类名使用 *IT 后缀。这是一种常见的设计原则,用于区分普通单元测试和集成测试。单元测试通常使用 *Test 作为名称后缀。Maven 构建生命周期能够根据名称区分这两类测试,因此 Maven 的 surefire 插件可以在 test 生命周期阶段运行单元测试,而 Maven 的 failsafe 插件则在 integration-test 生命周期阶段运行集成测试。 |
|---|
| 始终确保使用单元测试或集成测试的命名模式之一,这样 Maven 才能在相应的构建生命周期阶段找到并执行你的测试。 |
|---|
Spring Boot 支持
你可以在 Spring Boot 测试中非常轻松地使用 Citrus,与作为 Spring Boot 应用程序一部分启动的 Apache Camel 路由进行交互。
下面的示例在 Quarkus 测试中使用了 Citrus Quarkus 扩展:
@SpringBootTest(classes = CamelDemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@CitrusSpringSupport
@ContextConfiguration(classes = { CitrusEndpointConfig.class })
public class CamelDemoApplicationIT implements TestActionSupport {
@Autowired
private HttpClient httpClient;
@Autowired
private KafkaEndpoint completed;
@CitrusResource
private TestCaseRunner t;
@Test
void shouldVerifyDemoApp() {
t.given(
http().client(httpClient)
.send()
.post("/bookings")
.message()
.body(Resources.fromClasspath("booking.json"))
);
t.when(
http().client(httpClient)
.receive()
.response(HttpStatus.OK)
);
t.then(
receive().endpoint(completed)
.message()
.body("Booking complete!")
);
}
}Citrus 自带 Spring 集成,因此你可以将 Citrus 端点声明为 Spring bean。通过测试类上的 @CitrusSpringSupport JUnit 注解即可启用测试的 Citrus Spring 支持。
将其添加到测试类后,测试便可以使用 Citrus 端点组件以及用于编写集成测试的 Java 领域特定语言。
上面的示例使用常规的 @SpringBootTest 注解来启动 Camel 应用程序。随后测试通过自动装配的 Citrus 端点与对外暴露的 Http 服务进行交互,并以给定的 booking.json 负载调用 /bookings 端点。预期结果是收到 200 OK 响应,并且在 Kafka 主题 completed 上收到一条事件消息。响应内容和事件内容都会根据预期的报文内容进行校验(例如 Http 状态码 200 OK)。
Citrus 端点 bean 定义在 Spring 配置类 CitrusEndpointConfig 中。
@Configuration
@Import(CitrusSpringConfig.class)
public class CitrusEndpointConfig {
@Bean
public HttpClient httpClient() {
return http().client()
.requestUrl("http://localhost:8080")
.build();
}
@Bean
public KafkaEndpoint completed() {
return kafka()
.topic("completed")
.build();
}
}表示集成测试的类名使用 *IT 后缀。这是一种常见的设计原则,用于区分普通单元测试和集成测试。单元测试通常使用 *Test 作为名称后缀。Maven 构建生命周期能够根据名称区分测试类别,因此 Maven surefire 插件可以在 test 生命周期阶段运行单元测试,而 Maven failsafe 插件则在 Maven 的 integration-test 生命周期阶段运行集成测试。 |
|---|
| 始终确保使用单元测试或集成测试的命名模式之一,这样 Maven 才能在相应的构建生命周期阶段找到并执行你的测试。 |
|---|
评论
登录后参与评论
KnowForge