Kiểm thử backend thực chiến đo thật

Sê-ri 12 phần về kiểm thử cho backend: unit, tích hợp với PostgreSQL thật, property-based, fuzzing, mutation testing, contract, test giòn, đồng thời, fault injection — mỗi phần đo thật bằng Go 1.23 trong Docker, không bịa số.

5/12 phần đã đăng Lập trình
1 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. 22/09/2026 · 8 phút đọc 2 Thiết kế để kiểm thử được: tách I/O khỏi logic rồi đo — một hàm làm hết cho 84,8% độ phủ nhưng mù hoàn toàn nhánh giờ vàng, lõi thuần cho 100% với 24 ca mỗi ca 2 dòng, nhanh hơn 400 lần, và bắt được lỗi biên 16h mà bản cũ xanh mãi Cùng một hàm tính tiền đọc hạng khách từ PostgreSQL, xem đồng hồ để áp giờ vàng, hỏi dịch vụ thuế qua HTTP rồi ghi biên lai. Bản trước: 7 ca kiểm, mỗi ca 12 dòng dựng PostgreSQL và máy chủ giả, 2,5 ms một ca, độ phủ 84,8%, và nhánh giờ vàng không kiểm được vì không ai điều khiển được time.Now. Bản sau tách thành lõi thuần nhận Input có sẵn Now và RatePct, cộng vỏ mỏng: 24 ca table-driven mỗi ca 2 dòng, 6 µs một ca, 100% lõi, vỏ chỉ cần 2 ca. Cấy lỗi h nhỏ hơn bằng 16 thay vì nhỏ hơn 16: bản trước vẫn xanh lúc 6h sáng, bản sau đỏ đúng ca biên 16:00 trong 1 ms. 22/09/2026 · 8 phút đọc 3 Test double đo thật: cùng một dịch vụ, viết test bằng stub, mock và fake rồi refactor 5 lần và cấy 4 lỗi — stub không bao giờ vỡ nhưng lọt 3/4 lỗi, mock bắt đủ 4 lỗi nhưng vỡ ở cả 4 refactor giữ nguyên hành vi, fake bắt đủ 4 và vỡ 0 Một Service.Place với hai phụ thuộc Repo và Mailer, ba bộ test cùng bốn ca nhưng ba kiểu thay thế: stub trả giá trị đóng sẵn, mock ghi lại và khẳng định chuỗi lời gọi, fake là cài đặt thu nhỏ trong bộ nhớ. Tạo 5 refactor giữ nguyên hành vi bên ngoài và 4 lỗi thật, chạy cả ba bộ trên từng bản. Stub: 0 test vỡ khi refactor nhưng chỉ bắt 1/4 lỗi, lọt quên gửi thư, lưu đơn hai lần, gửi thư khi lưu hỏng. Mock: bắt 4/4 lỗi nhưng 6 test phải sửa qua 4 refactor, kể cả khi chỉ bỏ một lần gọi thừa. Fake: bắt 4/4, vỡ 0. Thêm một phương thức vào interface làm cả ba bộ lỗi biên dịch. 22/09/2026 · 8 phút đọc 4 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. 22/09/2026 · 8 phút đọc 5 Property-based testing đo thật: bốn hàm thuần với bốn lỗi tinh vi — test ví dụ viết tay xanh 4/4, test tính chất đỏ 4/4 ngay ca đầu tiên với phản ví dụ thu nhỏ còn 1 xu, 4 ký tự, 1 phần tử; và một test ví dụ đã đóng băng luôn hành vi sai Bốn hàm thuần có lỗi tinh vi: định dạng tiền mất dấu với số âm dưới 1 đồng, slug không luỹ đẳng, phân trang thừa một trang rỗng khi chia hết, gộp khoảng bỏ qua hai khoảng chạm biên. Test ví dụ viết tay 42 dòng xanh cả bốn. Test tính chất 78 dòng với pgregory.net/rapid đỏ cả bốn ngay ca sinh đầu tiên vì rapid thử giá trị biên trước, phản ví dụ thu nhỏ: cents bằng -1, chuỗi 4 ký tự, một phần tử với size 1, hai khoảng {0,3} và {3,3}. testing/quick trả phản ví dụ 20 ký tự không đọc nổi. Sửa xong, 40.000 ca chạy trong 44 ms, và test ví dụ Paginate đỏ vì nó đã khẳng định đúng hành vi sai. 22/09/2026 · 8 phút đọc

Còn 7 phần nữa sẽ lần lượt được đăng.