什么是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,您不僅可以提高測試質量,還可以為更強大、更自信的開發周期鋪平道路。