如何在 Java 中重複使用測試容器
1. 概述
在本教程中,我們將學習在設定本機開發和測試環境時如何重複使用測試容器。
首先,我們必須確保在應用程式停止或測試套件完成時不會關閉容器。之後,我們將討論 Testcontainer –特定配置,並將討論使用 Testcontainers 桌面應用程式的好處。最後,我們需要記住,重複使用 Testcontainers是一項實驗性功能,尚未準備好在 CI 管道中使用。
2.確保測試容器沒有停止
為我們的單元測試啟用 Testcontainers 的一個簡單方法是透過Testcontainers
和@Container
註解來利用其專用的 JUnit 5 擴充。
讓我們編寫一個測試來啟動 Spring Boot 應用程式並允許它連接到在 Docker 容器中運行的 MongoDB 資料庫:
@Testcontainers
@SpringBootTest
class ReusableContainersLiveTest {
@Container
static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"));
// dynamic properties and test cases
}
然而,自動啟動MongoDBContainer
的 Testcontainer 的 JUnit5 擴充也會在測試後將其關閉。因此,讓我們刪除@Testcontainers
和@Container
註釋,並手動啟動容器:
@SpringBootTest
class ReusableContainersLiveTest {
static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"));
@BeforeAll
static void beforeAll() {
mongoDBContainer.start();
}
// dynamic properties and test cases
}
另一方面,我們可能在本地開發期間使用 Spring Boot 對 Testcontainers 的內建支援。在這種情況下,我們不會使用 JUnit 5 擴展,且此步驟是不必要的。
3. 管理測試容器生命週期
現在,我們可以完全控制容器的生命週期。我們可以將應用程式配置為重複使用現有的 Testcontainer,並且可以從終端手動停止它。
3.1. withReuse()
方法
我們可以使用 Fluent API 的withReuse()
方法將 Testcontainer 標記為可重複使用:
static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"))
.withReuse(true);
當我們第一次執行測試時,我們將看到有關啟動MongoDBContainer.
這通常需要幾秒鐘:
23:56:42.383 [main] INFO tc.mongo:4.0.10 - Creating container for image: mongo:4.0.10
23:56:42.892 [main] INFO tc.mongo:4.0.10 - Container mongo:4.0.10 is starting: d5fa298bf6...
23:56:45.470 [main] INFO tc.mongo:4.0.10 - Container mongo:4.0.10 started in PT3.11239S
測試完成後,我們應該能夠看到容器仍在運行。例如,我們可以使用docker ps
命令從終端機進行檢查:
此外,當我們重新執行測試時,只要配置不更改,容器就會被重複使用。因此,容器設定時間顯著減少:
00:12:23.859 [main] INFO tc.mongo:4.0.10 - Creating container for image: mongo:4.0.10
00:12:24.190 [main] INFO tc.mongo:4.0.10 - Reusing container with ID: d5fa298b... and hash: 0702144b...
00:12:24.191 [main] INFO tc.mongo:4.0.10 - Reusing existing container (d5fa298b...) and not creating a new one
00:12:24.398 [main] INFO tc.mongo:4.0.10 - Container mongo:4.0.10 started in PT0.5555088S
最後,重複使用的資料庫包含先前插入的文件。雖然這可能對本地開發有用,但對測試可能有害。如果我們需要重新開始,我們可以在每次測試之前簡單地清除集合。
3.2.測試容器配置
在某些情況下,可能會出現警告,指出“Reuse was requested but the environment doesn't support the reuse of containers”.
**當我們的本地 Testcontainers 配置中停用重複使用時,就會發生這種情況:**
00:23:09.461 [main] INFO tc.mongo:4.0.10 - Creating container for image: mongo:4.0.10
00:23:09.463 [main] WARN tc.mongo:4.0.10 - Reuse was requested but the environment does not support the reuse of containers
To enable reuse of containers, you must set 'testcontainers.reuse.enable=true' in a file located at C:\Users\Emanuel Trandafir\.testcontainers.properties
00:23:09.544 [main] INFO tc.mongo:4.0.10 - Container mongo:4.0.10 is starting: 903dd52d7...
要修復它,我們可以簡單地編輯.testcontainers.properties
檔案並將reuse
為enabled
:
3.3.停止容器
我們可以隨時從終端手動停止 Docker 容器。為此,我們只需執行docker stop
命令,然後運行容器 ID。應用程式的未來執行會啟動一個新的 Docker 容器。
4.測試容器桌面
我們可以安裝Testcontainer 桌面應用程式來輕鬆管理測試容器的生命週期和配置。
該應用程式需要身份驗證,但我們可以使用 GitHub 帳戶輕鬆登入。登入後,我們將在工具列中看到「測試容器」圖示。如果我們點擊它,我們將有幾個選項可供選擇:
現在,執行前面演示的步驟就像單擊按鈕一樣輕鬆。例如,我們可以透過Preferences > Enable reusable containers
。此外,如果需要更多調試,我們可以在關閉之前終止容器或凍結它們。
5. 結論
在本文中,我們學習如何重複使用測試容器 在爪哇。我們發現 JUnit 5 可能會在執行完成之前嘗試關閉容器。我們透過手動啟動容器而不是依賴 Testcontainers 的 JUnit 5 擴充功能來避免這種情況。
之後,我們討論了withReuse()
方法和其他特定於 Testcontainer 的配置。最後,我們安裝了 Testcontainers 桌面應用程序,並且我們看到了在管理 Testcontainers 生命週期時它如何成為雙重檢查配置的寶貴資產。
與往常一樣,本文中使用的完整程式碼可以在 GitHub 上找到。