通常是需要对外提供服务的开源项目都需要集成测试:
- Pulsar
- Kafka
- Dubbo 等
而只提供本地类库的项目通常只需要编写单元测试即可:
- Hutool
- Apache Commmon
以我接触到的服务型应用主要分为两类:一个是 Java 应用一个是 Golang 应用。
🐳Golang
Golang 因为工具链没有 Java 那么强大,所以大部分的集成测试的功能都是通过编写 Makefile 和 shell 脚本实现的。
还是以我熟悉的 Pulsar 的 go-client 为例,它在 GitHub 的集成测试是通过 GitHub action 触发的,定义如下:
图片
最终调用的是 Makefile 中的 test 命令,并且把需要测试的 Golang 版本传入进去。
图片
Dockerfile
:
图片
这个镜像简单来说就是将 Pulsar 的镜像作为基础运行镜像(这里面包含了 Pulsar 的服务端),然后将这个 pulsar-client-go 的代码复制进去编译。
接着运行:
cd /pulsar/pulsar-client-go && ./scripts/run-ci.sh
也就是测试脚本。
图片
测试脚本的逻辑也很简单:
- 启动 pulsar 服务端
- 运行测试代码 因为所有的测试代码里连接服务端的地址都是
localhost
,所以可以直接连接。
图片
通过这里的 action 日志可以跟踪所有的运行情况。
☕Java
Java 因为工具链强大,所以集成测试几乎不需要用 Makefile 和脚本配合执行。
还是以 Pulsar 为例,它的集成测试是需要模拟在本地启动一个服务端,然后再运行测试代码。
这个的好处是任何一个单测都可以在本地直接运行,而 Go 的代码还需要先在本地启动一个服务端,测试起来比较麻烦。
来看看它是如何实现的,我以其中一个 BrokerClientIntegrationTest为例:
图片
图片
会在单测启动的时候先启动服务端。
图片
最终会调用 PulsarTestContext 的 build 函数启动 broker(服务端),而执行单测也只需要使用 mvn 就可以自动触发这些单元测试。
图片
只是每一个单测都需要启停服务端,所以要把 Pulsar 的所有单测跑完通常需要 1~2 个小时。
所以这些集成测试本质上都是先要把测试环境构建出来,再跑对应的测试代码;后续也打算给 cim 加上集成测试实操一下。