使用TestContainers進行容器Docker測試 – Emmanouil
Testcontainers是一個Java庫,支援JUnit測試,它提供了常見的資料庫,Selenium Web瀏覽器或其他可以在Docker容器中執行的輕型的一次性例項。
假設我們在本教程中使用maven:
<properties> <junit-jupiter.version>5.4.2</junit-jupiter.version> <testcontainers.version>1.15.0</testcontainers.version> </properties> <dependencies> <dependency> <groupId>org.testcontainers</groupId> <artifactId>testcontainers</artifactId> <version>${testcontainers.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>junit-jupiter</artifactId> <version>${testcontainers.version}</version> <scope>test</scope> </dependency> </dependencies> |
這裡將使用Hoverfly作為被測試的案例。
可以透過使用Java執行Hoverfly或在Hoverfly容器中預載入測試用例。這裡使用測試Hoverfly容器:
package com.gkatzioura.hoverfly.docker; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.testcontainers.containers.BindMode; import org.testcontainers.containers.GenericContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @Testcontainers public class ContainerBasedSimulation { private static final String SIMULATION_HOST_PATH = ContainerBasedSimulation.class.getClassLoader().getResource("simulation.json").getPath(); @Container public static GenericContainer gcs = new GenericContainer("spectolabs/hoverfly") .withExposedPorts(8888) .withExposedPorts(8500) .withCommand("-webserver","-import","/var/hoverfly/simulation.json") .withClasspathResourceMapping("simulation.json","/var/hoverfly/simulation.json" ,BindMode.READ_ONLY); @Test void testHttpGet() { var hoverFlyHost = gcs.getHost(); var hoverFlyPort = gcs.getMappedPort(8500); var client = HttpClient.newHttpClient(); var request = HttpRequest.newBuilder() .uri(URI.create("http://"+hoverFlyHost+":"+ hoverFlyPort +"/user")) .build(); var res = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .join(); Assertions.assertEquals("{\"username\":\"test-user\"}",res); } } |
講解如下:
Jupiter整合需要@Testcontainers批註。
@Testcontainers public class ContainerBasedSimulation { } |
這時需要使用的容器的映象還沒有載入,這時使用GenericContainer :
@Container public static GenericContainer gcs = new GenericContainer("spectolabs/hoverfly") |
由於我們要將模擬應用載入到容器,因此需要從主機上設定模擬路徑。透過使用withClasspathResourceMapping,我們可以直接在類路徑中指定檔案,例如測試資源。
.withClasspathResourceMapping("simulation.json","/var/hoverfly/simulation.json",BindMode.READ_ONLY); |
Hoverfly需要暴露模擬和管理埠,因此我們將指示Testcontainer暴露那些埠並將其對映到主機。
new GenericContainer("spectolabs/hoverfly") .withExposedPorts(8888) .withExposedPorts(8500) |
我們需要在容器上放置一個模擬。透過使用withFileSystemBind,我們可以指定本地路徑和容器上的路徑。
... .withFileSystemBind(SIMULATION_HOST_PATH,"/var/hoverfly/simulation.json" ,BindMode.READ_ONLY) ... |
此外,docker映像可能還需要一些其他命令,因此我們將使用.withCommand來傳遞所需的命令。
... .withCommand("-webserver","-import","/var/hoverfly/simulation.json") ... |
從技術上講,我們可以說已經準備好連線到容器,但是在執行測試容器時,這時外部正常訪問不能透過指定用於繫結的埠訪問該容器,因為如果測試並行執行,將會發生衝突。因此,測試容器要做的就是將容器的裸露埠對映到隨機的本地埠。這樣避免了埠衝突。
@Test void testHttpGet() { var hoverFlyHost = gcs.getHost(); var hoverFlyPort = gcs.getMappedPort(8500); var client = HttpClient.newHttpClient(); var request = HttpRequest.newBuilder() .uri(URI.create("http://"+hoverFlyHost+":"+ hoverFlyPort +"/user")) .build(); var res = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .join(); Assertions.assertEquals("{\"username\":\"test-user\"}",res); } |
使用GenericContainer.getMappedPort(8500),我們可以獲取用於與容器互動的埠。另外,getHost()也是必不可少的,因為它並不總是直接指向localhost。
最後:
docker ps >04a322447226 testcontainers/ryuk:0.3.0 "/app" |
相關文章
- 使用容器Docker進行開發Docker
- 使用遠端Docker進行整合測試Docker
- 使用docker執行CentOS容器DockerCentOS
- 使用 HTTPie 進行 API 測試HTTPAPI
- 使用Loadrunner進行效能測試
- 使用PostMan進行API測試PostmanAPI
- TestContainers:現代資料庫的測試方法 -GunduAI資料庫
- 使用 Sysbench 進行 Linux 效能測試Linux
- 使用Wiremock進行整合測試 - kubilayREMMock
- 使用jest進行單元測試
- 使用 MeterSphere 進行 Dubbo 介面測試
- 使用JMeter進行壓力測試JMeter
- 使用JUnit進行單元測試
- docker進入容器Docker
- 使用 Spring Boot 和 @SpringBootTest 進行測試Spring Boot
- 使用 Spring Boot 進行單元測試Spring Boot
- 如何使用MOQ進行單元測試
- 使用Jest進行React單元測試React
- 使用 PostMan 進行自動化測試Postman
- 使用PostMan進行自動化測試Postman
- 基於openvswitch+Docker構建SDN網路測試環境 (使用ovs-docker進行構建)Docker
- Python中的單元測試框架:使用unittest進行有效測試Python框架
- 效能測試進階實踐篇:10分鐘教你使用JMeter進行websocket測試!JMeterWeb
- 如何使用 jacoco 統計多個 docker 容器服務的測試覆蓋率Docker
- 測試前奏 之 Robotium使用Eclipse和ADT對apk進行黑盒測試EclipseAPK
- 使用Angular CLI進行單元測試和E2E測試Angular
- 如何使用Visual Studio Code遠端容器(Remote Container)功能在Docker內部進行開發 - Docker BlogREMAIDocker
- 測試開發之系統篇-Docker容器安裝Docker
- 在Rainbond上使用Locust進行壓力測試AI
- 使用python對oracle進行簡單效能測試PythonOracle
- 使用java+TestNG進行介面迴歸測試Java
- 使用JMeter進行負載測試快速入門JMeter負載
- 【SWINGBENCH】使用SwingBench對Oracle進行壓力測試Oracle
- 進入正在執行的Docker容器的4種方式Docker
- 負載測試如何尋找"拐點"?使用哪種方法進行測試?負載
- Docker-容器使用Docker
- 把 Windows 裝進 Docker 容器裡WindowsDocker
- Docker_06 容器-進階操作Docker