kinh-nghiem-lap-trinh tdd - It costs 12 mins to read

Bài viết Test Driven Development (TDD), why? của Blog http://programmable.banphim.net/ là bài viết về TDD hay và dễ hiểu nhất mà mình từng đọc. Post lại cho nhu cầu lưu trữ và chia sẻ

Red Green Refactor

Test Driven Development (TDD), why?

Lưu ý:


Trước khi bắt đầu…

Câu chuyện từ ngành y

Khi nghe ai đó nói họ vừa đi gặp bác sĩ, bạn sẽ hình dung ngay một chu trình:

Một câu chuyện khác

Một ngày kia, có một người bạn kể cho bạn một câu chuyện khác:

Tớ vừa từ bệnh viện về. Tay bác sĩ nghe tớ kể về bệnh tình xong không khám xét gì mà đưa cho tớ một đơn thuốc và tống tớ vào phòng điều trị. Tớ không thấy mặt hắn cho đến tận khi đợt điều trị kết thúc. Sau đó tớ nhận được một kết luận “Còn chạy được” đủ để ra viện. Ơn trời là tớ còn sống!

Bạn sẽ phá lên cười:

Bạn thân mến, bạn đọc quá nhiều Azit Nexin rồi. Làm gì có cái chuyện khôi hài đó. Dù ở những bệnh viện quá tải nhất Việt Nam thì người ta vẫn khám trước khi cho thuốc!

Bạn có thể nghĩ tôi đang kể một câu chuyện cười quá lố. Vâng, tôi nghĩ câu chuyện trên đây không có ở bất kì bệnh viện nào. Tuy nhiên, những câu chuyện tương tự lại đang diễn ra rất phổ biến trong ngành CNTT của chúng ta: việc kiểm thử (nghĩa hẹp mà từ “test” đang được hiểu) chỉ được thực hiện sau khi chương trình viết hoàn chỉnh!

Phải chăng vì ngành CNTT không có những “lời thề Turing”, “lời thề Church” nên chúng ta không đủ nghiêm túc khi phát triển phần mềm?

Alan Turing và Alonzo Church là những người sáng lập ra khoa học máy tính. Câu nói ngầm so sánh với “Lời thề Hippocrates” của ngành y.


Có một cách làm khác!

Test trước hay test sau?

“Test trước” là dấu hiệu quan trọng của TDD. Quy trình đầy đủ sẽ là “test trước, trong và sau”. Mô hình “ba test” này gọi là Test-Driven Development (TDD).

==TDD = TFD + Refactor==

(Các khác niệm sẽ được giải thích cụ thể trong bài viết về Quy trình. Nhưng bạn chưa cần đọc chúng ngay đâu!)

Trong thực tiễn phát triển phần mềm, test dần thể hiện được vai trò của nó. Năm 1994, Kent Beck viết test framework đầu tiên cho môi trường ngôn ngữ SmallTalk. Với ưu thế rõ rệt, TDD nhanh chóng được tiếp thu và hầu như các ngôn ngữ lớn trên thế giới đều đã có test framework của mình. Ngày nay, TDD đã trở thành một chuẩn mực trong việc phát triển phần mềm.

TDD được hiểu là việc phát triển phần mềm có sự tham gia (nếu không muốn nói là đóng vai trò định hướng) chặt chẽ của test. Về mặt triển khai, TDD là mô thức phát triển phần mềm đã được quy trình hoá.

Test Driven Development v.s tư duy cũ

Trước khi bắt đầu, hãy nhớ khái niệm test trong TDD đã được mở rộng hơn so với lập trình truyền thống.

Phân biệt test với dò lỗi (bug)

(Cái này kết hợp tốt với User Stories và User Scenario thành Behavior Driven Development)

Tư duy giải quyết vấn đề

Hiểu “test” theo nghĩa rộng của nó trong TDD, bạn sẽ không còn thấy nó ngược đời nữa. Trái lại, TDD còn rất tự nhiên, vì đó là quy trình được thiết kế cho con người:

Tiết kiệm thời gian?

Sẽ có người cho rằng:

==Với TDD tôi phải viết thêm cả test nữa, làm sao nói là tiết kiệm thời gian hơn được?==

1 - Tìm kiếm các thư viện sẵn có (thế mạnh của nguồn mở là đây!) 2 - Thuê ngoài một bên thứ ba triển khai 3 - Thành lập đội chuyên trách

[1]:

==Khẩu hiệu của ngành CNTT là “Nothing is impossible!”, nhưng chọn cái impossible nào để hiện thực hoá thì cần phải thực tế.==

Phòng bệnh hơn chữa bệnh

Với việc sử dụng TDD kết hợp với functional programming style, nhà phát triển có thể tránh được hầu hết lỗi khi chương trình được viết xong! Lập trình viên tuân thủ quy trình TDD sẽ không mất phần lớn thời gian cho việc dò lỗi giống như các đồng nghiệp truyền thống. – Để hiểu giá trị của việc làm rõ yêu cầu, hãy hỏi những người đã đầu tư cả triệu USD vào một mặt hàng không bán được. – Để hiểu giá trị của việc vạch ra hướng giải chung, hãy hỏi những người hàng ngày tham gia giao thông Hà Nội về quy hoạch đô thị. – Để hiểu giá trị của việc refactor, hãy hỏi người đã bỏ tiền ra mua những “chung cư cao cấp” về sự hợp tác của chủ đầu tư!

Tài liệu cho nhà phát triển

Kết luận

Tóm tắt
Thực hành
Nếu bạn chưa thành công, đừng ngần ngại!