用於相關服務的 Quarkus 測試容器
1. 概述
在本文中,我們將了解使用 Testcontainers 來幫助使用「即時」服務到服務測試來測試 Quarkus 應用程式的強大功能。
微服務架構中的測試很重要,但重現類似生產的系統可能很困難。啟用測試的常見選項包括使用手動 API 測試工具(例如 Postman)、模擬服務或信任記憶體資料庫。在運行 CI 管道或部署到上層環境之前,我們可能不會執行真正的服務到服務互動。如果不徹底測試服務交互,這可能會帶來問題並延遲交付。
Testcontainers 提供了一個解決方案,透過授予啟動依賴項並直接在本地環境中對其進行測試的能力。這使我們能夠利用任何容器化應用程式、服務或依賴項並在我們的測試案例中使用。
2. 解決方案架構
我們的解決方案架構相當簡單,但允許我們專注於強大的設定來證明 Testcontainers 對於服務到服務測試的價值:
客戶呼叫customer-service
,我們正在測試的服務,它會傳回客戶資料。 customer-service
依賴order-service
來查詢特定客戶的訂單。 PostgreSQL 資料庫支援我們的每項服務。
3. 測試容器解決方案
首先,讓我們確保我們有適當的依賴項, [org.testcontainers](https://mvnrepository.com/artifact/org.testcontainers/testcontainers)
core 和[org.testcontainers.postgresql](https://mvnrepository.com/artifact/org.testcontainers/postgresql)
:
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>1.19.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<version>1.19.6</version>
<scope>test</scope>
</dependency>
Quarkus 為我們提供了一些非常重要的類,我們將利用它們來針對特定依賴項編寫測試。來自Quarkus 官方指南:
一個非常常見的需求是在 Quarkus 應用程式開始測試之前啟動 Quarkus 應用程式所依賴的一些服務。為了滿足這項需求,Quarkus 提供了
@io.quarkus.test.common.QuarkusTestResource
和io.quarkus.test.common.QuarkusTestResourceLifecycleManager
。
接下來,我們宣告一個實作QuarkusTestResourceLifecycleManager
的類別,並將負責配置依賴服務及其 PostgreSQL 資料庫:
public class CustomerServiceTestcontainersManager implements QuarkusTestResourceLifecycleManager {
}
現在,讓我們使用 Testcontainers API 和模組(它們是各種依賴項的預先配置實作)來連接它們以進行測試:
private PostgreSQLContainer<?> postgreSQLContainer;
private GenericContainer<?> orderService;
然後,我們將配置連接和運行依賴項所需的一切:
@Override
public Map<String, String> start() {
之後,測試完成後我們需要停止服務:
@Override
public void stop() {
if (orderService != null) {
orderService.stop();
}
if (postgreSQLContainer != null) {
postgreSQLContainer.stop();
}
}
這裡我們可以利用 Quarkus 來管理測試類別中的依賴生命週期:
@QuarkusTestResource(CustomerServiceTestcontainersManager.class)
class CustomerResourceLiveTest {
}
接下來,我們編寫一個參數化測試,檢查我們是否從依賴服務傳回客戶的資料及其訂單:
@ParameterizedTest
@MethodSource(value = "customerDataProvider")
void givenCustomer_whenFindById_thenReturnOrders(long customerId, String customerName, int orderSize) {
Customer response = RestAssured.given()
.pathParam("id", customerId)
.get()
.thenReturn()
.as(Customer.class);
Assertions.assertEquals(customerId, response.id);
Assertions.assertEquals(customerName, response.name);
Assertions.assertEquals(orderSize, response.orders.size());
}
private static Stream<Arguments> customerDataProvider() {
return Stream.of(Arguments.of(1, "Customer 1", 3), Arguments.of(2, "Customer 2", 1), Arguments.of(3, "Customer 3", 0));
}
因此,執行測試時的輸出表示訂單服務容器已啟動:
Creating container for image: quarkus/order-service-jvm:latest
Container quarkus/order-service-jvm:latest is starting: 02ae38053012336ac577860997f74391eef3d4d5cd07cfffba5e27c66f520d9a
Container quarkus/order-service-jvm:latest started in PT1.199365S
因此,我們已經使用即時依賴項成功執行了類似生產的測試,部署了端到端驗證服務行為所需的內容。
4。
在本教程中,我們展示了 Testcontainers 作為使用容器化依賴項透過網路測試 Quarkus 應用程式的解決方案。
測試容器透過與這些真實服務對話並為我們的測試程式碼提供程式設計 API,幫助我們執行可靠且可重複的測試。
與往常一樣,原始碼可以在 GitHub 上取得。