測試容器桌面
1. 概述
在本教程中,我們將探索 Testcontainers 桌面應用程序,這是一個用於運行 Testcontainers 的簡單而強大的工具。我們將學習如何使用它來配置 Docker 環境、管理容器生命週期,並深入了解我們的開發和測試模式。
2.測試容器桌面
Testcontainers Desktop 提供了一個最小的 UI,旨在簡化 Testcontainer 配置和偵錯。我們可以從官方網站免費下載Testcontainers Desktop。要開始使用它,我們將透過建立帳戶或透過 Google、GitHub 或 Docker 等第三方進行註冊。
就這樣!安裝應用程式並登入後,我們就可以開始在開發工作流程中使用 Testcontainers Desktop:
我們應該在任務欄中看到 Testcontainers 標誌。如果我們右鍵單擊它,我們將看到我們今天將探討的一些關鍵功能:
- 使用測試容器雲
- 冷凍容器關閉
- 定義固定連接埠
- 與容器交互
- 請參閱測試容器儀表板
- 執行高級定制
3. 測試容器執行模式
Testcontainers Desktop 為開發人員提供了兩種主要的運行測試方式:本地或在雲端。值得注意的是,本地執行是預設行為。
3.1.本地執行
本地執行利用我們本地的 Docker 環境。例如,讓我們執行一個 JUnit 測試,該測試使用 Testcontainers 來啟動 MongoDB Docker 容器:
@Testcontainers
@SpringBootTest
class DynamicPropertiesLiveTest {
@Container
static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"));
@DynamicPropertySource
static void setProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
}
@Test
void whenRequestingHobbits_thenReturnFrodoAndSam() {
// ...
}
}
如果我們本機還沒有 Docker 映像,我們會看到 Docker 在日誌中拉取它。之後,MongoDB 容器啟動:
org.testcontainers.dockerclient.DockerClientProviderStrategy - Found Docker environment with local Npipe socket (npipe:////./pipe/docker_engine)
org.testcontainers.DockerClientFactory - Docker host IP address is localhost
org.testcontainers.DockerClientFactory - Connected to docker:
Server Version: 4.8.3
API Version: 1.41
Operating System: fedora
Total Memory: 7871 MB
org.testcontainers.DockerClientFactory - Checking the system...
org.testcontainers.DockerClientFactory - ✔︎ Docker server version should be at least 1.6.0
tc.mongo:4.0.10 - Pulling docker image: mongo:4.0.10. Please be patient; this may take some time but only needs to be done once.
tc.mongo:4.0.10 - Starting to pull image
tc.mongo:4.0.10 - Pulling image layers: 1 pending, 1 downloaded, 0 extracted, (0 bytes/? MB)
tc.mongo:4.0.10 - Pulling image layers: 0 pending, 2 downloaded, 0 extracted, (0 bytes/0 bytes)
[ ... ]
tc.mongo:4.0.10 - Pull complete. 14 layers, pulled in 17s (downloaded 129 MB at 7 MB/s)
tc.mongo:4.0.10 - Creating container for image: mongo:4.0.10
tc.mongo:4.0.10 - Container mongo:4.0.10 is starting: 3d74c3a...
tc.mongo:4.0.10 - Container mongo:4.0.10 started in PT21.0624015S
此外,我們可以透過在終端機中執行「 docker ps
」命令來手動檢查容器是否已建立。
3.2.測試容器雲執行
Testcontainers Cloud 提供了一個可擴展的平台,用於在雲端環境中執行測試。如果我們不想在本機上運行容器或無法存取正在運行的 Docker 環境,那麼這是理想的選擇。
TestContainer Cloud是Testcontainers的付費功能,但我們每月最多可以免費使用300分鐘。
讓我們從小 UI 切換到“Run with Testcontainers Cloud”:
讓我們使用此選項重新運行測試,並再次閱讀日誌:
org.testcontainers.dockerclient.DockerClientProviderStrategy - Found Docker environment with Testcontainers Host with tc.host=tcp://127.0.0.1:65497
org.testcontainers.DockerClientFactory - Docker host IP address is 127.0.0.1
org.testcontainers.DockerClientFactory - Connected to docker:
Server Version: 78+testcontainerscloud (via Testcontainers Desktop 1.7.0)
API Version: 1.43
Operating System: Ubuntu 20.04 LTS
Total Memory: 7407 MB
org.testcontainers.DockerClientFactory - Checking the system...
org.testcontainers.DockerClientFactory - ✔︎ Docker server version should be at least 1.6.0
tc.mongo:4.0.10 - Pulling docker image: mongo:4.0.10. Please be patient; this may take some time but only needs to be done once.
tc.mongo:4.0.10 - Starting to pull image
tc.mongo:4.0.10 - Pulling image layers: 0 pending, 0 downloaded, 0 extracted, (0 bytes/0 bytes)
tc.mongo:4.0.10 - Pulling image layers: 12 pending, 1 downloaded, 0 extracted, (0 bytes/? MB)
[ ... ]
如預期的那樣,使用了不同的環境,並且不再在本地下載 Docker 映像。不用說,如果我們運行命令“ docker ps
”,我們將看不到任何本地運行的容器。
4. 調試測試容器
Testcontainers Desktop 透過防止容器關閉、定義固定連接埠、自訂配置以滿足我們的需求以及直接與容器互動等功能,促進了流暢的除錯體驗。
4.1.凍結容器關閉
我們可以使用桌面應用程式來手動控制容器的生命週期。例如,我們可以使用選項「 Freeze container shutdown
」來允許正在運行的容器即使在啟動它的測試終止後也能繼續運行:
如果我們啟用此功能並重新執行測試,我們將收到一則通知,確認容器已被凍結。
接下來,我們將識別本機上與 Docker 容器所公開的連接埠相對應的連接埠。 MongoDB 通常在連接埠27017
上運行。讓我們打開一個終端機並運行命令“ docker ps
”來查看此映射:
正如我們所看到的,Docker 將容器的連接埠27017
從我們的機器映射到連接埠64215
。因此,我們可以使用此連接埠透過我們首選的 MongoDB 用戶端應用程式連接到資料庫。
Studio3T是 MongoDB 的圖形使用者介面,有助於資料庫管理、查詢和視覺化。讓我們用它來配置和測試與 Mongo Testcontainer 的連線:
我們的測試將一些記錄從「 test
」資料庫插入到「 characters
」集合中。讓我們執行一個簡單的查詢來列出集合中的所有記錄:
正如我們所看到的,所有記錄都存在於資料庫中。
4.2.定義固定連接埠
通常,測試容器在隨機連接埠上啟動。但是,如果我們經常需要查找暴露的連接埠以進行調試,我們可以定義固定連接埠。為此,我們首先需要導覽至Services > Open config location
。這將打開一個資料夾,其中包含一些更流行的 Testconatiners 模組的配置範例:
讓我們堅持我們的用例並檢查“ mongodb.toml.example
”檔案。首先,我們將其重新命名為“ mongodb.toml
”,刪除“.toml”。 example
”擴展名。
現在,讓我們檢查該文件的內容。註解逐步解釋如何自訂此檔案以允許 Testcontainers Desktop 正確代理服務的連接埠。讓我們專注於「 ports
」變量,我們可以用它來定義本地端口和容器端口之間的映射:
# `local-port` configures on which port on your machine the service is exposed.
# `container-port` indicates which port inside the container to proxy.
ports = [
{local-port = 27017, container-port = 27017},
]
因此,只需重命名檔案並啟用此配置,我們就可以使用固定連接埠27017
連接到 MongoDB 資料庫。
換句話說,我們不再需要每次重新執行測試時手動檢查連接埠映射,而是可以依賴 Mongo 的預設連接埠。
4.3.與容器交互
有時,即使連接到資料庫也是不夠的,例如當我們需要更詳細的調試時。在這種情況下,我們可以直接存取Docker容器本身。例如,我們可以打開一個附加到容器的終端並與其互動。
為此,我們導航到Containers
,然後選擇要偵錯的容器。之後,系統會提示我們選擇三個操作:「 Open terminal
」、「 Tail logs
」或「 Terminate
」:
「 Open terminal
」操作允許我們存取附加到容器的終端。例如,我們可以使用此終端啟動MongoDB shell
並查詢數據,而無需在本機系統上安裝任何 MongoDB 用戶端應用程式。
讓我們先打開一個終端機( Containers > mongo:4.0.10 > Open terminal
):
從現在開始,說明取決於我們使用的容器和我們想要偵錯的用例。在我們的例子中,讓我們執行以下命令:
- “
mongo
” – 開啟 MongoDB shell 提示符 - “
show dbs
” – 列出伺服器上存在的資料庫 - 「
use test
」 – 切換到「test
」資料庫,這是我們的應用程式建立的資料庫 - “
db.getCollection(“characters”).find({“race”:”hobbit”})
” – 查詢“characters
”集合並按“race
”屬性過濾
正如預期的那樣,我們可以看到使用 MongoDB shell 執行的命令。最後一個查詢db.getCollection(…),
從「 test
」資料庫的「 characters
」集合中檢索記錄清單。
5. 測試容器儀表板
Testcontainers Desktop 提供了一個使用者友善的儀表板,其中包含我們使用的 Testcontainers 的摘要。我們可以從選單中選擇「 Open Dashboard…
」選項來存取該網頁:
儀表板提供了所使用的測試容器和圖像的概述,以及指向資源和帳戶設定的有用連結。在頁面底部,我們可以看到最近的活動以及用於執行的環境。
此協作工具跨桌面和 CI 環境聚合測試數據,提供對開發和測試模式的見解。儀表板上的小部件有助於回答有關測試一致性、發布影響、流行容器映像和過時相依性的問題。
六,結論
在本文中,我們發現了 Testcontainers 桌面應用程式的各種功能,它們可以幫助我們運行和調試 Testcontainers。我們探索了凍結貨櫃關閉、使用固定連接埠以及存取與貨櫃連接的終端的方法。此外,我們也研究了 Testcontainers Dashboard,這是一個增強測試活動可見度和洞察力的工具。
與往常一樣,本文中使用的程式碼範例可以在 GitHub 上找到。