Chiến lược kiểm thử
1. Nguyên tắc
- Kim tự tháp: nhiều kiểm thử đơn vị nhanh, ít hơn kiểm thử tích hợp, vài kịch bản end-to-end và tải.
- Mọi lỗi tìm thấy ở môi trường thật phải có kiểm thử tái hiện trước khi sửa.
- Kiểm thử cô lập tenant và bảo mật là bắt buộc, không phải tùy chọn (NFR-12).
- Kiểm thử phải chạy được cục bộ chỉ với Docker (Redis, VictoriaMetrics) và mock Access Hub.
2. Các tầng kiểm thử của Collector
| Tầng | Công cụ | Nội dung |
|---|---|---|
| Đơn vị | go test -race | Giải mã và kiểm tra payload, giới hạn, đặt nhãn, băm token, backoff, máy trạng thái cảnh báo, gom nhóm, chọn nguồn rollup |
| Bảng quyết định cảnh báo | Bảng test (table-driven) | Các đường vào PENDING, đủ for, hysteresis, no_data, flapping, silence, bảo trì |
| Phát lại xác định | Tệp chuỗi mẫu ghi sẵn | Cùng chuỗi mẫu cho ra cùng chuỗi sự kiện, kể cả sau khởi động lại giữa chừng |
| Tích hợp | testcontainers | Redis thật, VictoriaMetrics thật, bus in-process và JetStream (GĐ 3), luồng enroll đến ghi TSDB đến truy vấn |
| Hợp đồng với Access Hub | OpenAPI + mẫu tests/ApiSamples | Collector gọi mock sinh từ OpenAPI của Access Hub. Bản chạy hằng đêm gọi Access Hub thật ở môi trường thử. Ngược lại phía Access Hub có kiểm thử dùng mẫu payload collector thật |
| Giao thức | buf breaking, golden protobuf | Không phá vỡ tương thích, tệp golden cho mỗi phiên bản giao thức |
| Fuzz | go test -fuzz, make fuzz (FUZZTIME, mặc định 30s mỗi đích), CI chạy 20s mỗi đích | Đã có (COL-12): FuzzMetricsEndpoint (thân bất kỳ với mọi Content-Encoding, kể cả zip bomb: chỉ 200, 400, 413, 503; lô lên bus luôn mang danh tính của token, tên trong catalog, nhãn hợp lệ, giá trị tối đa 128 byte UTF-8), FuzzValidator (chấp nhận cộng bỏ bằng tổng điểm), FuzzCompile (JSON luật bất kỳ từ Access Hub), FuzzSeriesQuery (query string bất kỳ của API series: chỉ 200 hoặc 400, công ty khác không đọc được dữ liệu), internal/checks:FuzzCompile (JSON check bất kỳ từ Access Hub: không panic, không bao giờ cho URL có thông tin đăng nhập, cổng ngoài miền, hoặc trường sai loại, COL-20) |
| Bảo mật | Bộ kiểm thử riêng | Hai tenant (đọc, ghi, truy vấn, purge chéo), token thu hồi, token hết hạn, nhãn giả mạo, giới hạn tốc độ, redaction log, admin token. Ma trận hai tenant (COL-12) ở internal/app/tenant_test.go: TestTwoTenantIsolationThroughIngestAndAdminAPI, TestTenantMatrixCrossCompanyCallsSeeNothing (mọi đường admin gọi chéo công ty, kiểm kê mang danh tính token), TestPurgeDropsSamplesInFlightAndForgetsAlerts, TestSeriesHonoursPlanRetentionPerCompany, TestCentralChecksReachOnlyTheirOwnCompany (cùng id máy ở hai công ty, check chỉ tới đúng công ty, tắt và xóa check đổi ETag, COL-20), TestCentralChecksAreServedFromTheSnapshotWhileTheHubIsDown; luật, silence, nhóm có kiểm thử hai tenant trong gói riêng (TestTenantIsolation, TestForgetTenantDropsGroupsOfThePurgedCompanyOnly, ...) |
| Retention (Q17) | Đơn vị, tích hợp với VictoriaMetrics thật | internal/retention (chính sách, ân hạn, janitor, lưới an toàn, hai tenant), TestRetentionJanitorPerCompany, TestSeriesDuringRetentionGraceReadsThePreviousRetention, TestSamplesOlderThanTheCompanyFloorAreNeverWritten, deploy/dev/vmcheck (TestVictoriaMetricsRetention, đo TestBenchRetention) |
| Tải | agentsim | Xem mục 4 |
| Hỗn loạn | agentsim + công cụ ngắt (toxiproxy) | Mất Redis, TSDB, Access Hub, node ingest, độ trễ mạng, mất gói |
3. Kiểm thử cho Access Hub (theo quy ước dự án)
- Pest, chạy
php artisan test --compactvới bộ lọc, chạy toàn bộ suite trước khi báo xong (lưu ý bài học về helper toàn cục Pest). - Mỗi endpoint mới có kiểm thử: quyền, cô lập công ty (CompanyScope), xác thực đầu vào, đường thành công, idempotency (
events), phân trangsince. - Kịch bản mẫu
tests/ApiSamples/NN_monitoring.phpđể sinh ví dụ chạy thật cho trang/docs/api-endpoints,API_SAMPLES_WRITE=1để làm mới. - Kiểm thử job purge, dọn dẹp, thông báo, và
queue:restartsau khi sửa job. - PHPStan và Pint, ESLint, vue-tsc cho các trang giao diện.
- Kiểm thử thực tế trình duyệt cho các trang mới (Tổng quan, Agents, Luật, tab sức khỏe), gồm trạng thái "Không có dữ liệu" khi collector không sẵn sàng.
4. Kiểm thử tải với agentsim
Công cụ nằm trong repo collector (cmd/agentsim, đã có từ 02/10/2026). Mô phỏng N agent với hành vi thật: enroll một lần (License sim-license-NNNNN do mockhub -sim-licenses N đăng ký), gửi metrics theo chu kỳ với pha xác định, tôn trọng Retry-After, backoff khi 5xx, in báo cáo JSON (độ trễ p50 đến p99, mã trạng thái, mẫu nhận và bỏ). Chưa có: gọi config định kỳ, mô phỏng lỗi mạng. Chỉ chạy vào collector dùng mockhub. Kết quả lưu ở docs/perf/.
| Kịch bản | Mô tả | Tiêu chí đạt |
|---|---|---|
| Tăng bậc | 1k, 5k, 10k, 20k agent | p99 ingest dưới 250 ms ở 10k trên 3 node 4 vCPU (NFR-01), không mất mẫu đã ack |
| Soak 24 giờ | 10k agent | Không rò rỉ bộ nhớ, độ sâu bus và outbox ổn định |
| Khởi động đồng loạt | Tất cả agent bật cùng lúc | Hệ thống hấp thụ nhờ jitter, không sập, không alert giả nhờ ân hạn |
| Mất Redis | Tắt Redis 10 phút | Ingest tiếp tục, agent_down tạm dừng, phục hồi không bão alert |
| Mất TSDB | Tắt TSDB 30 phút (GĐ 1 kiểm 5 phút) | Bus giữ (GĐ 3: 2 giờ), ghi bù đủ khi hồi phục |
| Mất Access Hub | Tắt 1 giờ | Ingest chạy bằng cache, outbox giữ, giao lại đầy đủ và đúng thứ tự khi hồi phục |
| Thu hồi hàng loạt | Thu hồi 1.000 agent | Hiệu lực trong 60 giây (FR-03) |
| Bão thử lại | Cho 5% agent gửi lỗi liên tục | Backoff hoạt động, không tăng tải |
| Cardinality | Một nhóm agent gửi nhãn lạ | Bị bỏ, không tăng series tổng, có cảnh báo |
| Sự cố diện rộng | 500 agent cùng mất | Đúng một sự kiện group_down |
Kết quả từng lần chạy lưu vào docs/perf/ (thiết bị, số liệu, kết luận) và cập nhật bảng cỡ tải ở 08.
5. Môi trường kiểm thử
| Môi trường | Mục đích |
|---|---|
| Cục bộ (Docker Compose) | Phát triển hằng ngày, kiểm thử tích hợp |
| CI | Kiểm thử đơn vị, tích hợp, hợp đồng, bảo mật, fuzz ngắn |
| Thử nghiệm (staging) | Access Hub thật + collector + máy ảo thật: Ubuntu 20.04/22.04/24.04, Debian 10/11/12, Rocky 8/9, CentOS 7, Amazon Linux 2, Windows 10, 11, Server 2016/2019/2022 |
| Hằng đêm | Tải rút gọn (1k agent), fuzz dài, quét phụ thuộc |
6. Kiểm thử chấp nhận cho từng giai đoạn
| Giai đoạn | Kịch bản chấp nhận |
|---|---|
| 1 | Cài agent trên máy Ubuntu bằng lệnh sinh từ giao diện, sau 1 phút thấy máy online, ngắt mạng 10 phút rồi nối lại thì dữ liệu bù, tắt agent thì trong 2 phút có alert agent.down đến chuông và email, thu hồi agent thì bị từ chối trong 60 giây |
| 2 | Cài MSI im lặng trên Windows Server, biểu đồ CPU và đĩa đúng so với công cụ hệ điều hành, luật đĩa 90% mở và đóng đúng, purge công ty xóa hết dữ liệu, 5k agent đạt tiêu chí |
| 3 | Rút một node ingest giữa tải không mất mẫu, cập nhật agent theo đợt 5% rồi 100%, quay lui tự động khi bản mới lỗi, chuyển agent sang collector khác không cần cài lại |
7. Chất lượng mã
gofmt,go vet,staticcheck,golangci-lint,govulncheck.- Độ phủ mục tiêu: 80% cho các gói lõi (
alert,ingest,registry,protocol), không đặt mục tiêu máy móc cho phần còn lại. - Rà soát mã bắt buộc, hai người duyệt cho thay đổi bảo mật, giao thức, khóa ký.