Table Of Content
- 1. Tổng quan về Integration Testing
- 1.1. Integration Testing là gì?
- 1.2. Tại sao cần Integration Testing?
- 2. Thiết lập môi trường kiểm thử trong ASP.NET Core
- 2.1. Cấu trúc thư mục dự án
- 2.2. Cài đặt thư viện cần thiết
- 2.3. Tạo lớp CustomWebApplicationFactory
- 3. Viết Integration Test với xUnit
- 3.1. Kiểm thử API GET
- 3.2. Kiểm thử API POST
- 3.3. Kiểm thử API PUT
- 3.4. Kiểm thử API DELETE
- 4. Chạy kiểm thử
- 5. Tổng kết
1. Tổng quan về Integration Testing
1.1. Integration Testing là gì?
Integration Testing (Kiểm thử tích hợp) là một phương pháp kiểm thử phần mềm nhằm xác minh sự tương tác giữa các thành phần hoặc module của hệ thống. Trong ASP.NET Core, kiểm thử tích hợp giúp đảm bảo các thành phần như Controller, Service, Repository, Database, Middleware hoạt động đúng khi kết hợp với nhau.
1.2. Tại sao cần Integration Testing?
- Phát hiện lỗi giao tiếp giữa các module: Đảm bảo API, database, middleware và các service tương tác đúng.
- Kiểm thử end-to-end: Giúp phát hiện các lỗi xảy ra khi hệ thống thực thi hoàn chỉnh.
- Đảm bảo API hoạt động đúng: Kiểm tra response, authentication, authorization, database transactions.
- Tăng cường độ tin cậy: Đảm bảo ứng dụng hoạt động ổn định trước khi triển khai.
- Giảm thiểu rủi ro khi phát triển phần mềm: Kiểm thử tích hợp giúp phát hiện lỗi sớm trong quy trình phát triển, tiết kiệm thời gian và công sức sửa lỗi.
- Cải thiện khả năng bảo trì: Bằng cách thường xuyên thực hiện kiểm thử tích hợp, nhóm phát triển có thể nhanh chóng phát hiện các vấn đề do thay đổi mã nguồn.
2. Thiết lập môi trường kiểm thử trong ASP.NET Core
2.1. Cấu trúc thư mục dự án
Một dự án ASP.NET Core thông thường có thể được tổ chức như sau:
/MyApp
│── MyApp.Api/ # API chính
│── MyApp.Application/ # Business logic
│── MyApp.Infrastructure/ # Data Access, Repository
│── MyApp.Tests/ # Unit Tests
│── MyApp.IntegrationTests/ # Integration Tests
Thư mục MyApp.IntegrationTests
sẽ chứa các bài kiểm thử tích hợp.
2.2. Cài đặt thư viện cần thiết
Thêm các package hỗ trợ kiểm thử:
# Cài đặt xUnit, TestServer, Moq
dotnet add package Microsoft.AspNetCore.Mvc.Testing
Ngoài ra, nếu bạn cần kiểm thử các tương tác với cơ sở dữ liệu thực, có thể cài đặt Microsoft.EntityFrameworkCore.InMemory
để sử dụng In-Memory Database:
dotnet add package Microsoft.EntityFrameworkCore.InMemory
2.3. Tạo lớp CustomWebApplicationFactory
Lớp này giúp khởi tạo môi trường test với WebApplicationFactory
.
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using MyApp.Infrastructure;
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<AppDbContext>));
if (descriptor != null)
{
services.Remove(descriptor);
}
services.AddDbContext<AppDbContext>(options =>
{
options.UseInMemoryDatabase("TestDb");
});
});
}
}
3. Viết Integration Test với xUnit
3.1. Kiểm thử API GET
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;
using MyApp.Api;
using Microsoft.AspNetCore.Mvc.Testing;
public class ProductControllerTests : IClassFixture<CustomWebApplicationFactory<Startup>>
{
private readonly HttpClient _client;
public ProductControllerTests(CustomWebApplicationFactory<Startup> factory)
{
_client = factory.CreateClient();
}
[Fact]
public async Task Get_Products_Returns_Success()
{
var response = await _client.GetAsync("/api/products");
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
Assert.NotEmpty(content);
}
}
3.2. Kiểm thử API POST
[Fact]
public async Task Post_Product_Returns_Created()
{
var newProduct = new { Name = "Laptop", Price = 1000 };
var response = await _client.PostAsJsonAsync("/api/products", newProduct);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Assert.Contains("Laptop", result);
}
3.3. Kiểm thử API PUT
[Fact]
public async Task Put_Product_Returns_Success()
{
var updatedProduct = new { Name = "Laptop Pro", Price = 1200 };
var response = await _client.PutAsJsonAsync("/api/products/1", updatedProduct);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Assert.Contains("Laptop Pro", result);
}
3.4. Kiểm thử API DELETE
[Fact]
public async Task Delete_Product_Returns_Success()
{
var response = await _client.DeleteAsync("/api/products/1");
response.EnsureSuccessStatusCode();
}
4. Chạy kiểm thử
Chạy các bài kiểm thử bằng lệnh:
dotnet test
Nếu bạn muốn thấy chi tiết hơn về kết quả kiểm thử, có thể chạy:
dotnet test --logger "console;verbosity=normal"
5. Tổng kết
- Integration Testing giúp kiểm tra sự tương tác giữa các thành phần trong ASP.NET Core.
- WebApplicationFactory hỗ trợ tạo môi trường kiểm thử một cách dễ dàng.
- Dùng xUnit để viết các bài kiểm thử API như GET, POST, PUT, DELETE.
- Có thể dùng In-Memory Database để kiểm tra logic liên quan đến cơ sở dữ liệu.
- Bổ sung thêm kiểm thử cho các method như PUT, DELETE để kiểm tra toàn bộ API.
- Sử dụng TestServer giúp mô phỏng request thực và xác nhận đầu ra.
Với những bước trên, bạn có thể dễ dàng viết Integration Test để đảm bảo hệ thống hoạt động chính xác và đáng tin cậy trước khi triển khai lên môi trường production.
No Comment! Be the first one.