Mục lục
Bạn đã từng phải viết kiểm thử cần cơ sở dữ liệu thực và cảm thấy mệt mỏi với việc thiết lập local hoặc dữ liệu giả?
Testcontainers có thể là người bạn mới của bạn. Trong bài viết này, chúng ta sẽ khám phá cách Testcontainers đơn giản hóa kiểm thử tích hợp bằng cách khởi động các dịch vụ thực trong container Docker theo yêu cầu. Chúng ta sẽ bắt đầu với giới thiệu nhanh về Testcontainers là gì và tại sao nó hữu ích, sau đó đi sâu vào ví dụ tập trung vào Azure Cosmos DB (một cơ sở dữ liệu NoSQL).
Testcontainers là gì và Tại sao Sử dụng Nó?
Testcontainers là một framework mã nguồn mở giúp dễ dàng chạy các phiên bản tạm thời của tài nguyên bên ngoài (cơ sở dữ liệu, message broker, v.v.) trong container Docker trong quá trình kiểm thử. Thay vì quản lý thủ công một cơ sở dữ liệu kiểm thử hoặc phụ thuộc vào mock, bạn để Testcontainers khởi động một phiên bản thực cho bạn.
Tại sao điều này hữu ích? Hãy xem xét kiểm thử tích hợp cơ sở dữ liệu. Bạn có thể sử dụng cửa hàng trong bộ nhớ hoặc mock để mô phỏng cơ sở dữ liệu, nhưng mock có giới hạn – chúng chỉ chính xác như những giả định bạn lập trình vào chúng. Ngược lại, kiểm thử chống lại một phiên bản cơ sở dữ liệu thực (ngay cả phiên bản local) mang lại sự tin cậy cao hơn nhiều.
Kiểm Thử Tích Hợp: Mock vs Emulators vs Dịch Vụ Thực
- Kiểm thử đơn vị với mock hoặc cơ sở dữ liệu in-memory: Nhanh và dễ, nhưng có thể khác biệt so với hành vi thực tế.
- Sử dụng cơ sở dữ liệu cloud thực (môi trường kiểm thử trong Azure): Đảm bảo bạn kiểm thử với thứ thực tế, nhưng có nhược điểm chi phí và tốc độ.
- Sử dụng Cosmos DB Emulator local thủ công: Azure cung cấp Cosmos DB Emulator chạy local để mô phỏng hành vi của Cosmos DB mà không có chi phí cloud.
- Sử dụng Testcontainers (emulator local tự động hóa): Cách tiếp cận này kết hợp lợi ích của emulator với tự động hóa.
Thiết Lập Container Cosmos DB Emulator Trong Kiểm Thử
Bước đầu tiên là cấu hình và khởi động container Cosmos DB Emulator cho kiểm thử của chúng ta. Testcontainers for .NET cung cấp CosmosDbBuilder làm điều này dễ dàng:
using DotNet.Testcontainers.Builders;
using DotNet.Testcontainers.Containers;
var cosmosDbContainer = new CosmosDbBuilder()
.WithImage("mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest")
.WithEnvironment("AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE", "127.0.0.1")
.WithPortBinding(8081, 8081)
.Build();
await cosmosDbContainer.StartAsync();
Khởi Tạo CosmosClient và Chuẩn Bị Cơ Sở Dữ Liệu
Sau khi container đang chạy, chúng ta cần kết nối đến nó từ mã kiểm thử:
var connectionString = cosmosDbContainer.GetConnectionString();
var clientOptions = new CosmosClientOptions
{
ConnectionMode = ConnectionMode.Gateway,
HttpClientFactory = () => new HttpClient(new HttpClientHandler {
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
})
};
using var cosmosClient = new CosmosClient(connectionString, clientOptions);
string databaseName = "TestDatabase";
string containerName = "TestContainer";
await cosmosClient.CreateDatabaseIfNotExistsAsync(databaseName);
var database = cosmosClient.GetDatabase(databaseName);
await database.CreateContainerIfNotExistsAsync(containerName, "/id");
var container = database.GetContainer(containerName);
Kiểm Thử: Chèn và Truy Vấn Tài Liệu Trong Cosmos DB
Đối với ví dụ kiểm thử của chúng ta, chúng ta sẽ mô phỏng một kịch bản đơn giản:
public record UserItem(string id, string Name);
// Tạo item kiểm thử
var testUser = new UserItem(Guid.NewGuid().ToString(), "Jane Doe");
// Chèn item vào container Cosmos
await container.CreateItemAsync(testUser, new PartitionKey(testUser.id));
// Đọc item trở lại từ container
var response = await container.ReadItemAsync<UserItem>(
testUser.id,
new PartitionKey(testUser.id)
);
UserItem fetchedUser = response.Resource;
// Xác nhận: item lấy được khớp với item chúng ta chèn
Assert.Equal(testUser.Name, fetchedUser.Name);
Dọn Dẹp: Hủy Container
Một trong những lợi thế của Testcontainers là nó xử lý dọn dẹp cho bạn:
await cosmosClient.GetDatabase(databaseName).DeleteAsync(); // xóa cơ sở dữ liệu (tùy chọn)
await cosmosDbContainer.DisposeAsync(); // dừng và xóa container
Ví Dụ Hoàn Chỉnh: Kiểm Thử Tích Hợp Cosmos DB Sử Dụng Testcontainers
Trong ví dụ này, bạn sẽ thấy cách sử dụng Testcontainers với Azure Cosmos DB emulator trong một lớp MSTest đầy đủ. Mẫu minh họa:
- Thực Thi Kiểm Thử Có Điều Kiện: Kiểm tra biến môi trường để kiểm thử tích hợp chỉ chạy khi mong muốn.
- Thiết Lập Container: Sử dụng
ContainerBuilderđể cấu hình ảnh emulator. - Khởi tạo Client: Tạo
CosmosClientvới custom HTTP handler để bỏ qua xác thực SSL. - Thực Thi Kiểm Thử: Chèn và truy vấn tài liệu, với xác nhận sử dụng FluentAssertions.
- Dọn Dẹp: Dừng và hủy container đúng cách và xóa cơ sở dữ liệu kiểm thử.
Tổng Kết và Bước Tiếp Theo
Trong bài viết này, chúng ta đã minh họa cách sử dụng Testcontainers trong .NET để kiểm thử tích hợp chống lại môi trường Azure Cosmos DB thực, mà không yêu cầu bất kỳ cơ sở hạ tầng bên ngoài nào.
Cần làm gì tiếp theo? Nếu bạn quan tâm đến việc sử dụng Testcontainers cho các dự án của riêng mình:
- Kiểm tra tài liệu chính thức Testcontainers cho .NET (và các ngôn ngữ khác).
- Đọc thêm về Azure Cosmos DB Emulator trong tài liệu của Microsoft.
- Thử mở rộng ví dụ này: ví dụ, kiểm thử tích hợp một repository hoặc data access layer từ ứng dụng của bạn sử dụng Cosmos DB.
- Khám phá các cơ sở dữ liệu khác với Testcontainers. Mô hình rất tương tự.
Bằng cách tích hợp Testcontainers vào bộ kiểm thử của bạn, bạn có thể vượt ra ngoài mock và đảm bảo mã của bạn hoạt động với các thành phần cơ sở hạ tầng thực, tất cả trong khi giữ kiểm thử được tự động hóa và tự chứa.



