Lập trình Go 22/09/2026 11 phút

Integration test với testcontainers trong Go: dựng dịch vụ thật trong Docker

Mock chỉ giả lập hành vi bạn nghĩ dịch vụ có; bug thật nằm ở khác biệt với dịch vụ thật. testcontainers-go dựng database/Redis thật trong Docker ngay trong test rồi tự dọn. Đo thật: code testcontainers biên dịch sạch, và một integration test thật chống Redis (không mock) pass — kèm báo cáo trung thực về yêu cầu Docker socket.

Lập trình 22/09/2026 8 phút

Kim tự tháp kiểm thử đo thật: cấy 8 lỗi vào một dịch vụ Go — unit bắt 2, integration bắt 4, end-to-end bắt cả 8, nhưng một test chạm PostgreSQL đắt gấp 184 lần unit và lỗi end-to-end chỉ nói triệu chứng

Mở sê-ri kiểm thử backend bằng số thay vì hình vẽ. Một gói Go nhỏ với logic tính giá, repo PostgreSQL và handler HTTP, ba tầng test tách bằng build tag, tám lỗi cấy vào từng cái một. Unit bắt 2/8, integration 4/8, end-to-end 8/8. Giá đo bằng go test -count=100: unit 12,5 µs một test, integration 2,3 ms, end-to-end trong tiến trình 2,25 ms, tức bước nhảy 184 lần nằm ở chỗ chạm cơ sở dữ liệu chứ không ở HTTP. Cùng một lỗi làm tròn, unit nói đúng hàm và đầu vào, end-to-end chỉ nói tổng sai 1 xu; lỗi quên cột NOT NULL làm cả 5 test end-to-end đỏ mà không dòng nào nói vì sao.

Lập trình 22/09/2026 8 phút

Kiểm thử tích hợp với PostgreSQL thật, đo thật: rollback mỗi test 2,9 ms, cơ sở dữ liệu mới mỗi test 20,5 ms, container mới 0,8 giây — và sáu lỗi ứng dụng mà SQLite trong bộ nhớ cho qua cả sáu, PostgreSQL từ chối cả sáu

Năm cách cô lập test tích hợp trên cùng một khối việc, đo bằng go test -count=30: pool không dọn 3,4 ms, transaction rồi rollback 2,9 ms, truncate 5,7 ms, schema mỗi test 9,1 ms, cơ sở dữ liệu mỗi test 20,5 ms; container postgres:16 mới sẵn sàng sau 0,8 giây. Rollback rẻ nhất nhưng vỡ khi mã dưới test tự mở kết nối và commit: nó không thấy dữ liệu mồi chưa commit, test đỏ oan. Rồi sáu lỗi ứng dụng chạy cùng mã test trên SQLite trong bộ nhớ và PostgreSQL thật: varchar quá dài, integer tràn, khoá ngoại, LIKE hoa thường, so sánh kiểu, GROUP BY. SQLite cho qua 6/6, PostgreSQL bắt 6/6.