Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
TDD (Test-Driven Development) nghe có vẻ ngược đời: viết test trước khi viết code. Nhưng khi thử qua một vòng nhỏ, bạn sẽ thấy nó giúp bạn nghĩ rõ yêu cầu và viết code đơn giản hơn. Bài này đi qua nhịp đỏ - xanh - refactor bằng một ví dụ cụ thể.
Sau đó lặp lại với hành vi tiếp theo. Mỗi vòng thường chỉ vài phút.
Yêu cầu: hàm isStrongPassword(pw) trả về true nếu mật khẩu có ít nhất 8 ký tự, có chữ hoa và có chữ số. Ta làm từng bước nhỏ với Jest.
Đỏ, viết test trước:
const { isStrongPassword } = require('./password');test('mật khẩu ngắn hơn 8 ký tự là yếu', () => {expect(isStrongPassword('Ab1')).toBe(false);});Chạy sẽ lỗi vì hàm chưa tồn tại. Xanh, viết code tối thiểu:
function isStrongPassword(pw) {return pw.length >= 8;}module.exports = { isStrongPassword };Test qua. Chưa cần refactor.
Đỏ:
test('thiếu chữ hoa là yếu', () => {expect(isStrongPassword('abcdefg1')).toBe(false);});Test này thất bại vì hàm hiện tại trả true. Xanh:
function isStrongPassword(pw) {return pw.length >= 8 && /[A-Z]/.test(pw);}test('thiếu chữ số là yếu', () => {expect(isStrongPassword('Abcdefgh')).toBe(false);});test('mật khẩu đủ điều kiện là mạnh', () => {expect(isStrongPassword('Abcdefg1')).toBe(true);});Sau khi code qua, ta refactor cho dễ đọc, test vẫn xanh:
const MIN_LENGTH = 8;function isStrongPassword(pw) {const longEnough = pw.length >= MIN_LENGTH;const hasUpper = /[A-Z]/.test(pw);const hasDigit = /[0-9]/.test(pw);return longEnough && hasUpper && hasDigit;}jest --watch) để có phản hồi tức thì.TDD không phải phép màu, mà là một kỷ luật: nghĩ trước, làm đủ dùng, dọn dẹp sau. Hãy thử với một hàm nhỏ trong tuần này và xem nó thay đổi cách bạn suy nghĩ về code ra sao.
Nếu bạn muốn thực hành kiểm thử và thiết kế code với bài tập cụ thể, có thể tham khảo các khóa học trên codebem.com.
Nguyễn Đình Cường
0 comment