開源項目如何做集成測試,你學(xué)會了嗎?
之前有朋友問如何做集成測試,今天就重點講講這個集成測試在開源項目中是如何做的。
通常是需要對外提供服務(wù)的開源項目都需要集成測試:
- Pulsar
- Kafka
- Dubbo 等
而只提供本地類庫的項目通常只需要編寫單元測試即可:
- Hutool
- Apache Commmon
以我接觸到的服務(wù)型應(yīng)用主要分為兩類:一個是 Java 應(yīng)用一個是 Golang 應(yīng)用。
??Golang
Golang 因為工具鏈沒有 Java 那么強大,所以大部分的集成測試的功能都是通過編寫 Makefile 和 shell 腳本實現(xiàn)的。
還是以我熟悉的 Pulsar 的 go-client 為例,它在 GitHub 的集成測試是通過 GitHub action 觸發(fā)的,定義如下:
圖片
最終調(diào)用的是 Makefile 中的 test 命令,并且把需要測試的 Golang 版本傳入進去。
圖片
Dockerfile
:
圖片
這個鏡像簡單來說就是將 Pulsar 的鏡像作為基礎(chǔ)運行鏡像(這里面包含了 Pulsar 的服務(wù)端),然后將這個 pulsar-client-go 的代碼復(fù)制進去編譯。
接著運行:
cd /pulsar/pulsar-client-go && ./scripts/run-ci.sh
也就是測試腳本。
圖片
測試腳本的邏輯也很簡單:
- 啟動 pulsar 服務(wù)端
- 運行測試代碼 因為所有的測試代碼里連接服務(wù)端的地址都是
localhost
,所以可以直接連接。
圖片
通過這里的 action 日志可以跟蹤所有的運行情況。
?Java
Java 因為工具鏈強大,所以集成測試幾乎不需要用 Makefile 和腳本配合執(zhí)行。
還是以 Pulsar 為例,它的集成測試是需要模擬在本地啟動一個服務(wù)端,然后再運行測試代碼。
這個的好處是任何一個單測都可以在本地直接運行,而 Go 的代碼還需要先在本地啟動一個服務(wù)端,測試起來比較麻煩。
來看看它是如何實現(xiàn)的,我以其中一個 BrokerClientIntegrationTest為例:
圖片
圖片
會在單測啟動的時候先啟動服務(wù)端。
圖片
最終會調(diào)用 PulsarTestContext 的 build 函數(shù)啟動 broker(服務(wù)端),而執(zhí)行單測也只需要使用 mvn 就可以自動觸發(fā)這些單元測試。
圖片
只是每一個單測都需要啟停服務(wù)端,所以要把 Pulsar 的所有單測跑完通常需要 1~2 個小時。
所以這些集成測試本質(zhì)上都是先要把測試環(huán)境構(gòu)建出來,再跑對應(yīng)的測試代碼;后續(xù)也打算給 cim 加上集成測試實操一下。