什麼是Testcontainers,為什麼你應該關心?

Testcontainers 減少了設定和拆除測試環境的摩擦,簡化了測試,從而實現更自信、更健壯的開發。

譯自What Is Testcontainers, and Why Should You Care?,作者Kevin Wittek。

在現代軟體開發中,隨著分散式系統和微服務架構的持續趨勢,以及龐大的整合介面,編寫軟體也意味著與其他系統整合。整合測試是確保被測系統持續正確性的絕佳工具,並且可以在開發週期中提供系統行為的快速且持續的回饋。

然而,整合測試通常需要外部依賴項,例如資料庫、訊息代理程式或Web 伺服器,所有這些依賴項都有自己的配置和正確運行的特殊性。傳統上,管理這些依賴項很麻煩,容易出現不一致,並且難以在不同機器上複製。

從歷史上看,這使得整合測試因編寫和維護成本高而聲名狼藉。你要么必須遵循可能過時的文件以費力的手動方式設置環境(最終只得到一個略微損壞的環境),要么使用集中維護的共享測試環境,這通常會導致測試污染。

這就是Testcontainers的用武之地。我的同事Oleg Šelajev將在All Things Open 2024 上以「製作你自己的Testcontainers 模組,既有趣又有利可圖!」為題的演講中展示這一點。

了解Testcontainers

Testcontainers 是一個開源程式庫,用於提供一次性、輕量級的資料庫、訊息代理程式、Web 瀏覽器或幾乎可以在Docker 容器中運行的任何東西的實例。透過利用Docker根據需要從你的程式碼庫中啟動這些服務的輕量級、隔離的實例,Testcontainers 解決測試和開發期間的環境管理問題。

Testcontainers 讓開發人員可以使用基礎設施即程式碼(IaC)方法,以最少的工作量創建可靠且可重複的測試和開發環境。它使用熟悉的語言編寫生產和測試程式碼,並幫助確保程式碼針對真實、一致的服務進行測試。這種方法減少了設定和拆除測試環境的摩擦,並使測試更可靠、更容易維護。對於開發人員來說,Testcontainers 是一款改變遊戲規則的產品,它簡化了測試過程,並實現了更自信、更穩健的開發。

清理

Testcontainers 也會自動清理它所建立的所有Docker資源,確保你的系統在執行測試後保持整潔。此清理過程與你正在使用的測試框架(例如JUnit)無縫集成,其中容器會在測試執行後自動停止並刪除。

此外,Testcontainers 依賴一個名為Ryuk的專用輔助容器,它會監視並確保所有資源都正確清理,即使在測試進程可能崩潰或意外終止的情況下也是如此。透過將此清理過程綁定到測試進程的生命週期,並使用Ryuk 作為監視程序,Testcontainers 保證不會留下任何雜散容器、網路或卷,從而保持你的環境清潔,並最大程度地降低後續測試運作中資源耗盡或衝突的風險。

模組

Testcontainers 提供了一組豐富的模組,其中封裝了在測試上下文中使用容器的最佳實踐,從而使將各種技術整合到您的測試套件中變得更加容易。這些模組是針對特定技術(例如資料庫(例如PostgreSQL、MySQL)、訊息代理程式(例如Kafka、RabbitMQ)甚至像Selenium 這樣的用於瀏覽器測試的成熟應用程式環境)定制的預先配置Docker 容器。

透過使用這些模組,開發人員可以利用經過嘗試和測試的配置,這些配置針對測試場景中的可靠性和效率進行了最佳化。 Testcontainers 模組目錄提供了可用模組的全面列表,使你能夠快速找到並實現所需的容器化服務。

以下兩個最小範例展示了在Java和Go:如何使用Redis映像定義Docker 容器,配置其公開端口,並以等待容器內Redis 應用程式就緒的方式啟動容器。

在Java 中:

GenericContainer redis = new GenericContainer("redis:5.0.3-alpine")
    .withExposedPorts(379);
redis.start()

在Go 中:

container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
    ContainerRequest: testcontainers.ContainerRequest{
        Image: "redis:5.0.3-alpine",
        ExposedPorts: []string{"6379/tcp"},
        WaitingFor: wait.ForLog("Ready to accept connections"),
    },
    Started: true,
})

Testcontainers Cloud

除了這些廣泛建立的開源程式庫之外,Testcontainers 還提供了一個產品,可以將這些容器無縫地卸載到雲端中,而無需對Testcontainers 程式碼進行任何更改:Testcontainers Cloud。透過利用Testcontainers Cloud,您可以大幅減少本機電腦上的負載,釋放資源以執行其他任務,同時仍執行複雜、資源密集的測試。


這種方法可以加快您的開發工作流程,並使您的測試環境與所需的Docker 執行時間(例如,x86)具有架構同等性,因為容器是在一致且可擴展的雲端環境中執行的。無論您是處理繁重的工作負載還是只想簡化測試流程,Testcontainers Cloud 都提供無縫集成,既能提高效能,又能提高可靠性,讓您能更多地專注於編碼,而無需管理本地資源。

總結

Testcontainers 是一款多功能且強大的工具,它改變了開發人員處理整合測試和本地開發的方式。透過提供一個易於使用的介面來啟動針對特定測試需求量身定制的Docker 容器,並且可以直接從所用程式語言的熟悉性中訪問,Testcontainers 消除了與管理測試環境相關的常見挑戰。

借助封裝最佳實踐的模組、自動清理以保持系統整潔以及將容器執行卸載到Testcontainers Cloud 的能力,這種方法為在測試流程中保持一致性、可靠性和效率提供了一個全面的解決方案。

無論您是希望簡化本地工作流程的開發人員,還是旨在擴展雲端測試的團隊,Testcontainers 都為您提供了必要的工具,以確保您的程式碼在不同環境中無縫運行。透過採用Testcontainers,您不僅可以提高測試質量,還可以為更強大、更自信的開發週期鋪平道路。