← Quay lại mục lục

Bài 7 — Login với khóa tài khoản tạm thời

Login form: sai 5 lần liên tiếp → khóa 30 phút (demo: 30 giây). Sau unlock có thể thử 5 lần mới. State Transition + Time-based testing.

Khó #state-transition #login #lockout #timer #counter-reset

🔒 Bài 7: Login với khóa tài khoản tạm thời

Yêu cầu nghiệp vụ:

  • Người dùng đăng nhập vào hệ thống bằng account và mật khẩu.
  • Người dùng nhập sai mật khẩu 5 lần liên tiếp thì tài khoản sẽ bị khóa 30 phút.
  • Sau 30 phút họ có thể thử lại 5 lần và tuân theo quy luật trên.
⏱️ Để tiện demo, lock duration trong bài này là 30 GIÂY (thay vì 30 phút). Mọi logic khác giữ nguyên. Khi bạn đếm ngược về 0 → tài khoản unlock và có thể thử lại 5 lần.

📌 Test data

  • Account đúng: admin
  • Password đúng: Pass123!
  • Max attempts: 5
  • Lock duration: 30 giây (demo) / 30 phút (spec gốc)

🔄 State Transition Diagram

Trạng thái hiện tại Sự kiện Trạng thái kế tiếp Output mong đợi
S0 — Khởi tạo Login đúng SUCCESS Login successfully + form lock
S0 Login sai (lần 1) S1 Wrong password. 4 attempts remaining
S1 Login sai (lần 2) S2 Wrong password. 3 attempts remaining
S2 Login sai (lần 3) S3 Wrong password. 2 attempts remaining
S3 Login sai (lần 4) S4 Wrong password. 1 attempt remaining
S4 Login sai (lần 5) LOCKED Khóa 30s + countdown Account locked. Try again in 30 seconds
S1, S2, S3, S4 Login đúng SUCCESS + reset counter về 0 Login successfully
LOCKED Submit (kể cả đúng) LOCKED (giữ nguyên) Không xử lý — form bị disable + countdown đang chạy
LOCKED Hết 30 giây countdown S0 (unlock + reset counter về 0) Form mở lại, có thể thử 5 lần mới

📝 Message expected

Trường hợpMessage
Account để trốngPlease input account
Password để trốngPlease input password
Sai cặp account/passwordWrong password. N attempts remaining (số ít: 1 attempt remaining)
Tài khoản bị khóaAccount locked. Try again in N seconds (số ít: 1 second)
Login thành côngLogin successfully

🎯 Yêu cầu công việc

  1. Vẽ State Transition Diagram đầy đủ (S0–S4 + LOCKED + SUCCESS).
  2. Thiết kế test case cover ít nhất các transition sau:
    • S0 → SUCCESS (login đúng ngay lần đầu).
    • S0 → S1 → S2 → S3 → S4 → LOCKED (5 lần sai liên tiếp).
    • Sx → SUCCESS với x = 1, 2, 3, 4 (login đúng giữa chừng — counter có reset không?).
    • LOCKED → S0 sau khi hết countdown (counter có reset về 0 không?).
    • LOCKED → submit (có bị disable không?).
  3. Test các edge case:
    • Account/Password để trống → có bị tính như 1 attempt không?
    • Login đúng sau khi đã sai vài lần → có reset counter không?
    • Sau khi unlock (30s đã qua) → counter có thực sự về 0 chưa? Hay vẫn giữ 5 và sai 1 lần là block tiếp?
    • Countdown timer hiển thị: 1 second (số ít) vs 2 seconds (số nhiều).
    • Refresh trang khi đang lock → state bị mất hay vẫn lock?
  4. Sang tab "🧪 Form thực hành" để thực hiện test.
  5. Ghi nhận các bug phát hiện được.
💡 Gợi ý kỹ thuật test cho bài này:
  • State Transition Testing với chú ý đặc biệt vào TIME-based transition (LOCKED → S0 sau 30s).
  • Counter reset logic: spec yêu cầu "thử lại 5 lần" sau khi unlock — nghĩa là counter phải reset về 0. Test kỹ điều này.
  • Login đúng sau khi sai vài lần: counter có reset không? Spec không nói rõ — nhưng chuẩn bảo mật yêu cầu reset (otherwise bị tính tích lũy lâu dài).
  • Boundary của counter: test attempts = 4 (nên còn cho thử) và attempts = 5 (phải lock).
  • Pluralization: 1 attempt vs 2 attempts; 1 second vs 2 seconds.
  • Form behavior khi LOCKED: input và button có bị disable không?
⚠️ Lưu ý: Form có cài cắm bug ở các vùng: counter logic, time-based unlock, counter reset behavior, message text, form disable state. Đây là bài có nhiều logic time-based, hãy test kiên nhẫn và đợi countdown.
🔐

Vui lòng đăng nhập để nộp bài.

Đăng nhập
🔐

Tab dành cho giảng viên

Tab này chứa danh sách các lỗi đã cài cắm trong form. Vui lòng nhập mã giảng viên để mở khóa. Mã sẽ ghi nhớ trong phiên làm việc — chỉ cần nhập 1 lần cho cả 3 bài.