แผนและชุดทดสอบสมรรถนะระบบ อิงตาม Non-Functional Requirements (BRD §5) — ทดสอบว่าระบบรองรับผู้ใช้พร้อมกันได้ตามเป้าและเร็วพอ
Zeabix × Prime Car Rent · นำเสนอทีมพัฒนา| โหมด | Concurrent Users | Page Load (p95) |
|---|---|---|
| Normal Traffic | 100 users | ≤ 3.0 วินาที |
| Peak Traffic | 200 users | ≤ 5.0 วินาที |
ตัวเลขทั้งหมดอ้างอิงจาก เอกสาร BRD — Non-Functional Requirements
เทสเส้นทางที่ลูกค้าใช้จริง & โดน traffic หนักสุด
โหลดแต่ละรอบ: ramp-up 2 นาที → คงโหลด 10 นาที → ramp-down 1 นาที (จำลองผู้ใช้ค้างต่อเนื่อง ไม่ใช่ยิงรัวครั้งเดียว)
เลือกเฉพาะ service บนเส้นทางจอง (in-scope) — ทุกตัวเรียกผ่าน gateway เดียว /api/proxy/{service}/...
| Service | หน้าที่ในเส้นทาง | Endpoint ที่เทส | น้ำหนักโหลด |
|---|---|---|---|
| catalog-service | ค้นหารถ + คำนวณราคา | POST /public/search | หนักสุด |
| booking-service | สร้างการจอง (guest) | POST /public/booking | ปานกลาง |
| payment-service | เริ่มชำระเงิน | POST /public/payments/initiate | ปานกลาง |
ccr-perf-test/k6/
lib/
options.js # สลับโหมด+เกณฑ์
tokens.js # จัดการ auth
scenarios/
search.js # ค้นหา
booking.js # จอง
payment.js # จ่าย
results/ # HTML report
MODE → กำหนด VU (100/200) + threshold (p95 3s/5s) ตาม NFR// search.js — หัวใจของทุก scenario เหมือนกัน export const options = buildOptions('Search'); // ← VU+threshold ตาม MODE const res = http.post(`${BASE_GATEWAY}/catalog-service/public/search`, body, { tags: { API: 'Search' } }); // ← tag แยกวัดต่อ API check(res, { 'status is 200': (r) => r.status === 200 }); // ← นับ pass/fail sleep(3~5); // ← think time จำลองคนจริง
ฝั่งสคริปต์เทสพร้อมแล้ว — ที่เหลือต้องอาศัยทีมพัฒนา/ระบบ
/public/search คืน HTTP 500 ทุก request (ผ่าน validation แล้ว แต่ logic ฝั่ง server พัง) → ต้องแก้ก่อนx-turnstile-token) — บอทยิงเองไม่ได้ → ปิด/ออก bypass token บน env เทส| Scenario | สถานะ | เหลืออะไร |
|---|---|---|
| Search | ✓ payload ถูกต้อง | รันได้ทันทีเมื่อ endpoint ถูกแก้ (branch code จริง + date format ผ่าน validation แล้ว) |
| Booking | โครงพร้อม | เติม car/price/addon จาก search response + ปลด Turnstile |
| Payment | โครงพร้อม | เติม fields ของ initiate + ชี้ sandbox (chain จาก booking-token แล้ว) |
| Harness k6+report+threshold | ✓ ทดสอบแล้วใช้ได้ | พิสูจน์กับ branches/list = ผ่าน 100% |
ทุกรอบที่ยิง ออกเป็นไฟล์ HTML เปิดในเบราว์เซอร์ — เห็นทันทีว่าผ่าน/ไม่ผ่านเกณฑ์ NFR (ตัวอย่างด้านล่างเป็นตัวอย่างค่าจำลอง)
| Metric | ค่า | เกณฑ์ NFR | ผล |
|---|---|---|---|
http_req_duration p(95) | 4,210 ms | < 5,000 ms | ✓ ผ่าน |
http_req_failed | 0.42% | < 1% | ✓ ผ่าน |
checks succeeded | 99.6% | — | ✓ 24,100/24,200 |
# macOS brew install k6 # Windows choco install k6
ติดตั้งครั้งเดียว ไม่ต้องลง dependency อื่น
# เช็ค script ก่อน (1 VU) k6 run -e MODE=smoke \ -e BASE_ORIGIN=https://<env> \ scenarios/search.js # วัดจริง: normal=100 / peak=200 k6 run -e MODE=peak ... search.js
MODE = smoke / normal / peak — VU + เกณฑ์เปลี่ยนตาม NFR อัตโนมัติ ไม่ต้องแก้โค้ดresults/ (หน้าตาตามสไลด์ก่อนหน้า)k6 run -e MODE=peak \ -e BASE_ORIGIN=https://<uat> \ scenarios/search.js
ไม่ต้องแก้โค้ด → ได้ HTML report เทียบเกณฑ์ NFR ทันที
ccr-perf-test/ · แผนเต็ม: PERFORMANCE_TEST_PLAN.md