Some checks failed
CI / Lint → Typecheck → Test → Build (22) (push) Failing after 18s
CI / E2E Tests (push) Has been skipped
CodeQL Analysis / CodeQL (javascript-typescript) (push) Failing after 2m15s
Deploy / Build API Image (push) Failing after 28s
Deploy / Build Web Image (push) Failing after 16s
Deploy / Build AI Services Image (push) Failing after 17s
E2E Tests / Playwright E2E (push) Failing after 31s
Security Scanning / Dependency Audit (pnpm) (push) Failing after 3s
Security Scanning / Trivy Scan — API Image (push) Failing after 1m46s
Security Scanning / Trivy Scan — Web Image (push) Failing after 1m7s
Security Scanning / Trivy Scan — AI Services Image (push) Failing after 53s
Security Scanning / Trivy Filesystem Scan (push) Failing after 35s
Deploy / Deploy to Staging (push) Has been skipped
Deploy / Smoke Test Staging (push) Has been skipped
Deploy / Deploy to Production (push) Has been skipped
Deploy / Smoke Test Production (push) Has been skipped
Security Scanning / Security Gate (push) Failing after 0s
Deploy / Rollback Staging (push) Has been skipped
Deploy / Rollback Production (push) Has been skipped
Hoàn tất đợt cuối của nhiệm vụ chuyển toàn bộ tài liệu sang tiếng Việt. Đã dịch 22 file `.md` còn sót (~9.7k dòng) — gồm RUNBOOK, audits, docs/architecture, docs/load-testing, libs READMEs và các quick references. Giữ nguyên code blocks, đường dẫn, identifier kỹ thuật, URL và biến môi trường. Co-Authored-By: Paperclip <noreply@paperclip.ing>
404 lines
14 KiB
Markdown
404 lines
14 KiB
Markdown
# Tài Liệu K6 Load Testing cho GoodGo Platform
|
||
|
||
Hướng dẫn đầy đủ để hiểu và triển khai K6 load tests cho GoodGo Platform API.
|
||
|
||
---
|
||
|
||
## 📚 Các File Tài Liệu
|
||
|
||
Thư mục này chứa ba hướng dẫn toàn diện về K6 load testing:
|
||
|
||
### 1. **K6_LOAD_TESTING_GUIDE.md** (Tham Khảo Chính)
|
||
Khám phá toàn diện cấu trúc GoodGo Platform API cho load testing.
|
||
|
||
**Nội dung:**
|
||
- Cấu trúc module API (auth, listings, payments, search)
|
||
- Tài liệu endpoint chi tiết với HTTP method, rate limit và yêu cầu auth
|
||
- Đặc tả DTO đầy đủ với hình dạng request/response body
|
||
- Tham khảo cấu hình database và environment
|
||
- Thiết lập test hiện có (Playwright, Vitest, CI/CD)
|
||
- Mẫu kiến trúc (CQRS, DDD)
|
||
- Tham khảo nhanh vị trí file
|
||
- Khuyến nghị triển khai K6
|
||
|
||
**Khi nào sử dụng:** Khi cần đào sâu vào các endpoint cụ thể, hiểu luồng xác thực, kiểm tra biến môi trường
|
||
|
||
### 2. **K6_ENDPOINTS_SUMMARY.md** (Tham Khảo Nhanh)
|
||
Tham khảo endpoint cô đọng với hình dạng dữ liệu để tra cứu ngay lập tức.
|
||
|
||
**Nội dung:**
|
||
- Tất cả endpoint dưới dạng bảng (method, path, auth, rate limit)
|
||
- Module Authentication (register, login, refresh, profile)
|
||
- Module Listings (CRUD, kiểm duyệt, upload media)
|
||
- Module Payments (create, list, callback, refund)
|
||
- Module Search (full-text, geo)
|
||
- Ví dụ request/response body (JSON)
|
||
- Các kịch bản test K6 (search, auth, listings, payments, webhook)
|
||
- Tóm tắt rate limit
|
||
- Ví dụ luồng xác thực (cookies vs tokens)
|
||
|
||
**Khi nào sử dụng:** Tra cứu nhanh chi tiết endpoint, sao chép payload mẫu, hiểu rate limit
|
||
|
||
### 3. **K6_QUICK_START.md** (Ví Dụ Chạy Được)
|
||
Hướng dẫn từng bước với script K6 sẵn sàng chạy và hướng dẫn thiết lập.
|
||
|
||
**Nội dung:**
|
||
- Hướng dẫn cài đặt (macOS, Linux, Docker)
|
||
- Thiết lập môi trường (khởi động API, seed database)
|
||
- Năm script K6 chạy được:
|
||
- Search load test (công khai, lưu lượng cao)
|
||
- Auth load test (đăng ký bị giới hạn rate)
|
||
- Tạo listing (đã xác thực, giới hạn quota)
|
||
- Xử lý payment (đã xác thực)
|
||
- Tất cả kịch bản kết hợp
|
||
- Tích hợp CI với GitHub Actions
|
||
- Tùy chọn tạo báo cáo (JSON, Grafana Cloud, CSV)
|
||
- Các check K6 và mẫu phổ biến
|
||
- Debug và xử lý sự cố
|
||
|
||
**Khi nào sử dụng:** Bắt đầu nhanh, chạy test ngay, thiết lập CI/CD
|
||
|
||
---
|
||
|
||
## 🚀 Bắt Đầu Nhanh (3 Phút)
|
||
|
||
### 1. Cài Đặt K6
|
||
```bash
|
||
brew install k6 # macOS
|
||
# or
|
||
apt-get install k6 # Linux
|
||
```
|
||
|
||
### 2. Khởi Động API & Database
|
||
```bash
|
||
pnpm install
|
||
pnpm db:generate
|
||
pnpm db:migrate:dev
|
||
pnpm db:seed
|
||
pnpm dev
|
||
```
|
||
|
||
### 3. Chạy Load Test
|
||
```bash
|
||
# Copy this from K6_QUICK_START.md Step 3
|
||
k6 run load-tests/search.k6.js
|
||
```
|
||
|
||
### 4. Xem Kết Quả
|
||
K6 in tóm tắt ra console. Để xem báo cáo chi tiết hơn, xem mục tạo báo cáo trong K6_QUICK_START.md.
|
||
|
||
---
|
||
|
||
## 📊 Các Kịch Bản Test Đã Triển Khai
|
||
|
||
| Kịch Bản | File | Trọng Tâm | VUs | Thời Lượng | Endpoint Chính |
|
||
|----------|------|-------|-----|----------|--------------|
|
||
| Search Load | `load-tests/search.k6.js` | Hiệu suất tìm kiếm công khai | 50 | 4m | `GET /search`, `GET /search/geo` |
|
||
| Authentication | `load-tests/auth.k6.js` | Throughput auth & rate limit | 10 | 2m | `POST /auth/register`, `POST /auth/login` |
|
||
| Tạo Listing | `load-tests/listings.k6.js` | CRUD listing đã xác thực | 5 | 2m | `POST /listings`, `GET /listings/:id` |
|
||
| Payments | `load-tests/payments.k6.js` | Khởi tạo & trạng thái thanh toán | 10 | 2m | `POST /payments`, `GET /payments/:id` |
|
||
| Combined | `load-tests/all-scenarios.k6.js` | Tải hỗn hợp thực tế | 50 | 5m | Nhiều endpoint |
|
||
|
||
---
|
||
|
||
## 🔐 Phương Thức Xác Thực
|
||
|
||
### Tùy Chọn 1: Dựa Trên Cookie (Khuyến nghị cho test giống trình duyệt)
|
||
```javascript
|
||
const loginRes = http.post(`${BASE_URL}/auth/login`, { phone, password });
|
||
// Cookies automatically managed by K6
|
||
const profileRes = http.get(`${BASE_URL}/auth/profile`);
|
||
```
|
||
|
||
### Tùy Chọn 2: Bearer Token (Khuyến nghị cho test chỉ API)
|
||
```javascript
|
||
const loginRes = http.post(`${BASE_URL}/auth/login`, { phone, password });
|
||
const { accessToken } = loginRes.json();
|
||
const headers = { Authorization: `Bearer ${accessToken}` };
|
||
const profileRes = http.get(`${BASE_URL}/auth/profile`, { headers });
|
||
```
|
||
|
||
Xem K6_ENDPOINTS_SUMMARY.md để xem ví dụ đầy đủ.
|
||
|
||
---
|
||
|
||
## 🎯 Endpoint Chính Theo Mức Ưu Tiên
|
||
|
||
### Ưu Tiên Cao (Chức Năng Cốt Lõi)
|
||
| Endpoint | Ưu Tiên | Tại sao |
|
||
|----------|----------|-----|
|
||
| `GET /search` | ⭐⭐⭐ | Công khai, truy vấn lưu lượng cao |
|
||
| `GET /search/geo` | ⭐⭐⭐ | Địa không gian, dùng thường xuyên |
|
||
| `GET /listings` | ⭐⭐⭐ | Tìm/lọc công khai |
|
||
| `GET /listings/:id` | ⭐⭐⭐ | Tải trang chi tiết |
|
||
| `POST /auth/login` | ⭐⭐ | Tạo phiên người dùng |
|
||
| `POST /auth/register` | ⭐⭐ | Bị giới hạn rate, quan trọng |
|
||
|
||
### Ưu Tiên Trung Bình (Tính Năng Cụ Thể)
|
||
| Endpoint | Ưu Tiên | Tại sao |
|
||
|----------|----------|-----|
|
||
| `POST /listings` | ⭐⭐ | Bị giới hạn quota, đã xác thực |
|
||
| `POST /payments` | ⭐⭐ | Tích hợp bên ngoài |
|
||
| `GET /payments` | ⭐⭐ | Lịch sử giao dịch người dùng |
|
||
| `POST /payments/callback/:provider` | ⭐⭐ | Webhook handler, then chốt |
|
||
|
||
### Ưu Tiên Thấp (Admin/Chuyên Biệt)
|
||
| Endpoint | Ưu Tiên | Tại sao |
|
||
|----------|----------|-----|
|
||
| `PATCH /listings/:id/moderate` | ⭐ | Chỉ admin |
|
||
| `GET /listings/pending` | ⭐ | Chỉ admin |
|
||
| `POST /search/reindex` | ⭐ | Chỉ admin, có lịch |
|
||
|
||
---
|
||
|
||
## 📍 Tổng Quan Cấu Trúc API
|
||
|
||
```
|
||
API Base: http://localhost:3001/api/v1
|
||
|
||
Modules:
|
||
├── /auth # User authentication & profiles
|
||
├── /listings # Property CRUD & moderation
|
||
├── /search # Full-text & geo search
|
||
├── /payments # Payment processing & webhooks
|
||
├── /subscriptions # Plans & quotas (not focused for load tests)
|
||
├── /admin # Admin operations (low priority for load tests)
|
||
└── /analytics # Market data (low priority for load tests)
|
||
```
|
||
|
||
---
|
||
|
||
## 🗄️ Cấu Hình Database
|
||
|
||
### Phát Triển Cục Bộ
|
||
```bash
|
||
DATABASE_URL=postgresql://goodgo:password@localhost:5432/goodgo
|
||
REDIS_URL=redis://localhost:6379
|
||
TYPESENSE_HOST=localhost
|
||
TYPESENSE_PORT=8108
|
||
```
|
||
|
||
### Môi Trường Test (CI)
|
||
```bash
|
||
DATABASE_URL=postgresql://goodgo:goodgo_test_secret@localhost:5432/goodgo_test
|
||
REDIS_URL=redis://localhost:6379
|
||
TYPESENSE_HOST=localhost
|
||
TYPESENSE_PORT=8108
|
||
```
|
||
|
||
Xem K6_LOAD_TESTING_GUIDE.md để biết đầy đủ biến môi trường.
|
||
|
||
---
|
||
|
||
## ⚡ Rate Limit
|
||
|
||
Tôn trọng các giới hạn này trong load test của bạn:
|
||
|
||
| Endpoint | Limit | Cửa Sổ | Hành Động Khi Vượt |
|
||
|----------|-------|--------|-------------------|
|
||
| `/auth/register` | 5 | mỗi giờ | Trả về 429 |
|
||
| `/auth/login` | 5 | mỗi giờ | Trả về 429 |
|
||
| `/auth/refresh` | 5 | mỗi giờ | Trả về 429 |
|
||
| `/payments/callback/*` | 20 | mỗi phút | Trả về 429 |
|
||
| Tất cả khác | Không có | N/A | Quota gate áp dụng cho thao tác ghi |
|
||
|
||
**Xử Lý K6:**
|
||
```javascript
|
||
check(res, {
|
||
'status not rate limited': (r) => r.status !== 429,
|
||
'status success or expected': (r) => [200, 201, 400, 404].includes(r.status),
|
||
});
|
||
```
|
||
|
||
---
|
||
|
||
## 🏗️ Cấu Trúc Test Đề Xuất
|
||
|
||
```
|
||
load-tests/
|
||
├── search.k6.js # High-volume public search
|
||
├── auth.k6.js # Authentication flow with rate limit handling
|
||
├── listings.k6.js # Authenticated listing creation
|
||
├── payments.k6.js # Payment processing
|
||
├── all-scenarios.k6.js # Combined realistic mix
|
||
├── helpers/
|
||
│ ├── data-generators.js # Generate test data (users, listings)
|
||
│ ├── auth-flows.js # Reusable login/register functions
|
||
│ └── assertions.js # Custom check functions
|
||
└── config.js # Base URL, env, thresholds
|
||
```
|
||
|
||
Cấu trúc helper mẫu được cung cấp trong K6_QUICK_START.md.
|
||
|
||
---
|
||
|
||
## 🧪 Tích Hợp Với Các Test Hiện Có
|
||
|
||
### Bổ Sung, Không Thay Thế
|
||
|
||
K6 dành cho **load testing** (hiệu suất dưới tải đồng thời).
|
||
Các test hiện có phục vụ các mục đích khác:
|
||
|
||
| Loại Test | Công Cụ | Mục Đích | Khi Nào |
|
||
|-----------|------|---------|------|
|
||
| Unit Tests | Vitest | Xác minh logic hàm | Trong quá trình phát triển |
|
||
| E2E Tests | Playwright | Xác minh luồng người dùng hoạt động | Trước khi triển khai |
|
||
| Load Tests | K6 | Xác minh hiệu suất ở quy mô lớn | Theo lịch, theo yêu cầu |
|
||
|
||
### Chạy Tất Cả Test
|
||
|
||
```bash
|
||
# Unit tests (API only)
|
||
pnpm test
|
||
|
||
# E2E tests (API + Web)
|
||
pnpm test:e2e
|
||
|
||
# Load tests (new)
|
||
k6 run load-tests/search.k6.js
|
||
|
||
# All in sequence
|
||
pnpm test && pnpm test:e2e && k6 run load-tests/all-scenarios.k6.js
|
||
```
|
||
|
||
---
|
||
|
||
## 📈 Tích Hợp CI/CD
|
||
|
||
### Workflow GitHub Actions
|
||
|
||
Tạo `.github/workflows/load-test.yml` (mẫu trong K6_QUICK_START.md mục 🔟):
|
||
|
||
```bash
|
||
# Runs on schedule (daily at 2 AM)
|
||
# Or manually via workflow_dispatch
|
||
# Reports results as artifacts
|
||
```
|
||
|
||
### Báo Cáo Thủ Công
|
||
|
||
```bash
|
||
# Export JSON
|
||
k6 run load-tests/search.k6.js --summary-export=results.json
|
||
|
||
# View CSV (with extension)
|
||
k6 run load-tests/search.k6.js --out csv=results.csv
|
||
|
||
# Upload to Grafana Cloud
|
||
K6_CLOUD_TOKEN=xxx k6 run load-tests/search.k6.js --out cloud
|
||
```
|
||
|
||
---
|
||
|
||
## 🔗 Hướng Dẫn Tham Chiếu Chéo
|
||
|
||
### Đang tìm kiếm...?
|
||
|
||
| Cần | Tìm trong |
|
||
|------|----------|
|
||
| Tất cả URL & method endpoint | K6_ENDPOINTS_SUMMARY.md |
|
||
| Hình dạng JSON request/response | K6_ENDPOINTS_SUMMARY.md (📊 Key Data Shapes) |
|
||
| DTO & quy tắc validation | K6_LOAD_TESTING_GUIDE.md (Controllers & DTOs) |
|
||
| Chi tiết rate limit | K6_ENDPOINTS_SUMMARY.md (📌 Important Rate Limits) |
|
||
| Luồng xác thực | K6_ENDPOINTS_SUMMARY.md (🔗 Authentication Flow for K6) |
|
||
| Biến database | K6_LOAD_TESTING_GUIDE.md (🗄️ Database & Environment) |
|
||
| Script sẵn sàng chạy | K6_QUICK_START.md (Steps 3-8️⃣) |
|
||
| Thiết lập CI/CD | K6_QUICK_START.md (Step 🔟) |
|
||
| Xử lý sự cố | K6_QUICK_START.md (✅ Troubleshooting) |
|
||
| Chi tiết kiến trúc | K6_LOAD_TESTING_GUIDE.md (📊 Architecture Patterns) |
|
||
| Vị trí file | K6_LOAD_TESTING_GUIDE.md (📁 File Locations Quick Reference) |
|
||
|
||
---
|
||
|
||
## 🛠️ Công Việc Phổ Biến
|
||
|
||
### Công Việc: Load Test Endpoint Search
|
||
1. Đọc: K6_ENDPOINTS_SUMMARY.md (mục 🔍 Search)
|
||
2. Sử dụng: K6_QUICK_START.md (Bước 3️⃣ - Search Load Test)
|
||
3. Chạy: `k6 run load-tests/search.k6.js`
|
||
|
||
### Công Việc: Hiểu Luồng Payment
|
||
1. Đọc: K6_LOAD_TESTING_GUIDE.md (💳 PAYMENTS MODULE)
|
||
2. Kiểm tra: K6_ENDPOINTS_SUMMARY.md (mục 💳 Payments)
|
||
3. Sử dụng: K6_QUICK_START.md (Bước 7️⃣ - Payment Test)
|
||
|
||
### Công Việc: Thêm Endpoint Mới Vào Load Tests
|
||
1. Tìm endpoint trong: K6_LOAD_TESTING_GUIDE.md hoặc K6_ENDPOINTS_SUMMARY.md
|
||
2. Lấy hình dạng dữ liệu từ: K6_ENDPOINTS_SUMMARY.md (📊 Key Data Shapes)
|
||
3. Kiểm tra auth từ: K6_LOAD_TESTING_GUIDE.md (mỗi mục module)
|
||
4. Triển khai sử dụng ví dụ trong: K6_QUICK_START.md
|
||
|
||
---
|
||
|
||
## ✅ Danh Sách Kiểm Tra Xác Minh
|
||
|
||
Trước khi chạy load test, hãy xác minh:
|
||
|
||
- [ ] API đang chạy: `pnpm dev` (port 3001)
|
||
- [ ] Database đã seed: `pnpm db:seed`
|
||
- [ ] K6 đã cài đặt: `k6 version`
|
||
- [ ] Có thể truy cập API: `curl http://localhost:3001/api/v1/docs`
|
||
- [ ] Biến ENV đã set: `JWT_SECRET`, `CORS_ORIGINS`, v.v.
|
||
- [ ] File load test tồn tại: `load-tests/*.k6.js`
|
||
- [ ] Có sẵn dữ liệu test: Kiểm tra seed trong `prisma/seed.ts`
|
||
|
||
---
|
||
|
||
## 📞 Hỗ Trợ & Tham Khảo
|
||
|
||
### Tài Liệu Nội Bộ
|
||
- **Kiến Trúc Đầy Đủ**: K6_LOAD_TESTING_GUIDE.md
|
||
- **Tham Khảo Endpoint**: K6_ENDPOINTS_SUMMARY.md
|
||
- **Bắt Đầu**: K6_QUICK_START.md
|
||
|
||
### Tài Nguyên Bên Ngoài
|
||
- **Tài Liệu Chính Thức K6**: https://k6.io/docs
|
||
- **Tham Khảo K6 API**: https://k6.io/docs/javascript-api
|
||
- **Cộng Đồng K6**: https://community.k6.io
|
||
- **Ví Dụ K6**: https://github.com/grafana/k6-templates
|
||
|
||
### File Dự Án
|
||
- **API Controllers**: `apps/api/src/modules/*/presentation/controllers/`
|
||
- **DTOs**: `apps/api/src/modules/*/presentation/dto/`
|
||
- **E2E Tests**: `e2e/api/`
|
||
- **Seed Data**: `prisma/seed.ts`
|
||
|
||
---
|
||
|
||
## 🎓 Lộ Trình Học
|
||
|
||
### Người Mới Bắt Đầu (30 phút)
|
||
1. Đọc K6_QUICK_START.md (Bước 1-4)
|
||
2. Cài đặt K6
|
||
3. Chạy: `k6 run load-tests/search.k6.js`
|
||
|
||
### Trung Cấp (1-2 giờ)
|
||
1. Đọc K6_ENDPOINTS_SUMMARY.md
|
||
2. Hiểu luồng auth
|
||
3. Chạy test auth: `k6 run load-tests/auth.k6.js`
|
||
4. Chạy test listing: `k6 run load-tests/listings.k6.js`
|
||
|
||
### Nâng Cao (2-4 giờ)
|
||
1. Đọc K6_LOAD_TESTING_GUIDE.md đầy đủ
|
||
2. Xem xét triển khai controller trong source
|
||
3. Tạo script load test tùy chỉnh
|
||
4. Thiết lập CI/CD với GitHub Actions (K6_QUICK_START.md Bước 🔟)
|
||
5. Tạo và phân tích báo cáo
|
||
|
||
---
|
||
|
||
## 📝 Ghi Chú
|
||
|
||
- **Chưa có thiết lập K6 nào** — Tài liệu này cung cấp hướng dẫn đầy đủ
|
||
- **Ba tài liệu bổ sung cho nhau** — Khám phá các tài liệu khác nhau cho các nhu cầu khác nhau
|
||
- **Ví dụ chạy được** — Script K6_QUICK_START.md hoạt động ngay
|
||
- **Rate limit quan trọng** — Hãy xem xét chúng trong thiết kế test
|
||
- **Quota gate** — Một số thao tác (listings, payments) bị giới hạn theo subscription
|
||
- **Dữ liệu test** — Sử dụng dữ liệu seed hoặc tạo người dùng test duy nhất cho mỗi VU
|
||
- **Sẵn sàng cho production** — Hướng dẫn tuân theo các thực hành tốt nhất của K6
|
||
|
||
---
|
||
|
||
Đã tạo: 2026-04-09
|
||
Cập nhật lần cuối: K6_QUICK_START.md mới nhất
|