之前有朋友问如何做集成测试,今天就重点讲讲这个集成测试在开源项目中是如何做的。

通常是需要对外提供服务的开源项目都需要集成测试:

  • Pulsar

  • Kafka

  • Dubbo 等

而只提供本地类库的项目通常只需要编写单元测试即可:

  • Hutool

  • Apache Commmon

以我接触到的服务型应用主要分为两类:一个是 Java 应用一个是 Golang 应用。

🐳Golang

Golang 因为工具链没有 Java 那么强大,所以大部分的集成测试的功能都是通过编写 Makefile 和 shell 脚本实现的。

还是以我熟悉的 Pulsar 的 go-client 为例,它在 GitHub 的集成测试是通过 GitHub action 触发的,定义如下:962f8150bc42fad6bf11c41f0b3bb06a.png最终调用的是 Makefile 中的 test 命令,并且把需要测试的 Golang 版本传入进去。

1e6ad2fe73912dc3179061a6a0053cd0.png

Dockerfile3be9920bd27fdc522f12677509704148.png

这个镜像简单来说就是将 Pulsar 的镜像作为基础运行镜像(这里面包含了 Pulsar 的服务端),然后将这个 pulsar-client-go 的代码复制进去编译。

接着运行:

cd /pulsar/pulsar-client-go && ./scripts/run-ci.sh

也就是测试脚本。

f6078af3fe3118abd8a32e2038b625ee.png

测试脚本的逻辑也很简单:

  • 启动 pulsar 服务端

  • 运行测试代码 因为所有的测试代码里连接服务端的地址都是 localhost,所以可以直接连接。cf1d73c6a0cee01aa63d48a0f8ff85b9.png

通过这里的 action 日志可以跟踪所有的运行情况。

☕Java

Java 因为工具链强大,所以集成测试几乎不需要用 Makefile 和脚本配合执行。

还是以 Pulsar 为例,它的集成测试是需要模拟在本地启动一个服务端,然后再运行测试代码。

这个的好处是任何一个单测都可以在本地直接运行,而  Go 的代码还需要先在本地启动一个服务端,测试起来比较麻烦。

来看看它是如何实现的,我以其中一个 BrokerClientIntegrationTest为例:0069e3cb248bf312bd03cb7badbbe2f1.png50e0ecd78c27be6daa36d917a171df76.png会在单测启动的时候先启动服务端。

8621bc71665bf49f2928e547416697a8.png

最终会调用 PulsarTestContext 的 build 函数启动 broker(服务端),而执行单测也只需要使用 mvn 就可以自动触发这些单元测试。c76b88a115421757e3a14bf2942f16c6.png只是每一个单测都需要启停服务端,所以要把 Pulsar 的所有单测跑完通常需要 1~2 个小时。

所以这些集成测试本质上都是先要把测试环境构建出来,再跑对应的测试代码;后续也打算给 cim 加上集成测试实操一下。

本文节选自我在知识星球的文章:

bfbfef5cb2c1cee55e9ec5b505b4b8ce.jpeg

有需要的朋友可以扫码领取优惠券以 49 的价格加入,支持三天内无条件退款。

4c930edfd4bb153eedeffd97c2625a50.png

往期推荐

从Helm到 Operator:Kubernetes应用管理的进化

五个我最近在 Go 里学到的小技巧

如何找到并快速上手一个开源项目

OpenTelemetry 深度定制:跨服务追踪的实战技巧

ff9781435730bc39d75a2d929aef6e4e.gif

点分享

11d58bdbb34d5d9c1a54b440d634a487.gif

点收藏

ca5a5307f615c2fbe67af04c152aec2a.gif

点点赞

1b2125ac14ff5821bcbd2d0852921c8c.gif

点在看

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐