Tôi đang làm nó là đúng? Nếu không chính xác những gì tôi phải thay đổi
Thật khó để nói chỉ từ mô tả ngắn đó, nhưng tôi nghi ngờ rằng, không, bạn không làm đúng. Lưu ý: Tôi không nói rằng những gì bạn đang làm không hoạt động hoặc theo một cách nào đó là xấu, nhưng bạn không làm TDD. Chữ "D" ở giữa có nghĩa là "Driven", các bài kiểm tra thúc đẩy mọi thứ, quá trình phát triển, mã, thiết kế, kiến trúc, mọi thứ .
Các bài kiểm tra cho bạn biết nên viết gì, khi nào nên viết nó, viết gì tiếp theo, khi nào nên dừng viết. Họ cho bạn biết thiết kế và kiến trúc. (Thiết kế và kiến trúc xuất hiện từ mã thông qua tái cấu trúc.) TDD không phải là về thử nghiệm. Nó thậm chí không phải là về việc viết bài kiểm tra trước: TDD là về việc để các bài kiểm tra thúc đẩy bạn, viết chúng trước tiên chỉ là điều kiện tiên quyết cần thiết cho việc đó.
Không quan trọng bạn thực sự viết mã xuống hay viết mã đầy đủ: bạn đang viết mã (bộ xương) trong đầu, sau đó viết bài kiểm tra cho mã đó. Đó không phải là TDD.
Buông bỏ thói quen đó thật khó . Thực sự, thực sự khó khăn. Nó dường như là đặc biệt khó khăn cho các lập trình viên có kinh nghiệm.
Keith Braithwaite đã tạo ra một bài tập mà anh gọi là TDD As If You Mete It . Nó bao gồm một bộ quy tắc (dựa trên Ba quy tắc TDD của chú Bob Martin , nhưng chặt chẽ hơn nhiều) mà bạn phải tuân thủ nghiêm ngặt và được thiết kế để hướng bạn áp dụng TDD chặt chẽ hơn. Nó hoạt động tốt nhất với lập trình cặp (để cặp của bạn có thể đảm bảo bạn không vi phạm các quy tắc) và một người hướng dẫn.
Các quy tắc là:
- Viết chính xác một bài kiểm tra mới, bài kiểm tra nhỏ nhất mà bạn có thể chỉ ra theo hướng của một giải pháp
- Thấy nó thất bại; thất bại biên dịch được tính là thất bại
- Làm cho bài kiểm tra từ (1) vượt qua bằng cách viết mã thực hiện ít nhất bạn có thể trong phương thức kiểm tra .
- Tái cấu trúc để loại bỏ trùng lặp, và nếu không theo yêu cầu để cải thiện thiết kế. Hãy nghiêm ngặt về việc sử dụng các động thái này:
- bạn muốn có một phương thức mới, hãy đợi cho đến khi tái cấu trúc thời gian, sau đó, bạn tạo ra các phương thức mới (không thử nghiệm) bằng cách thực hiện một trong những phương thức này và không có cách nào khác:
- ưa thích: thực hiện Phương thức trích xuất trên mã thực hiện được tạo theo (3) để tạo một phương thức mới trong lớp thử nghiệm, hoặc
- nếu bạn phải: di chuyển mã triển khai theo (3) sang một phương thức triển khai hiện có
- bạn muốn có một lớp mới chờ đợi cho đến khi tái cấu trúc thời gian, sau đó, bạn tạo các lớp không thử nghiệm để cung cấp đích cho Phương thức di chuyển và không vì lý do nào khác
- Tạo các lớp triển khai với các phương thức bằng cách thực hiện Phương thức di chuyển và không có cách nào khác
Thông thường, điều này sẽ dẫn đến các thiết kế rất khác so với "phương pháp giả TDD" đã thực hành trong đầu của bạn về thiết kế nên là gì, sau đó viết các bài kiểm tra để buộc thiết kế đó, thực hiện thiết kế mà bạn đã hình dung trước khi viết kiểm tra ".
Khi một nhóm người thực hiện một cái gì đó giống như trò chơi tic tac toe bằng cách sử dụng giả TDD, họ thường kết thúc với các thiết kế rất giống nhau liên quan đến một loại Board
lớp nào đó với mảng 3 × 3 Integer
s. Và ít nhất một phần các lập trình viên sẽ thực sự viết lớp này mà không cần kiểm tra vì họ "biết rằng họ sẽ cần nó" hoặc "cần một cái gì đó để viết bài kiểm tra của họ". Tuy nhiên, khi bạn buộc cùng nhóm đó áp dụng TDD As If You Mete It, họ sẽ thường kết thúc với sự đa dạng của các thiết kế rất khác nhau, thường không sử dụng bất cứ thứ gì thậm chí từ xa tương tự như a Board
.
Có cách nào bạn có thể xác định xem bài kiểm tra bạn đã viết có đủ không?
Khi họ bao gồm tất cả các yêu cầu kinh doanh. Các thử nghiệm là một mã hóa của các yêu cầu hệ thống.
Có phải là một thực hành tốt để viết bài kiểm tra cho chức năng rất đơn giản có thể tương đương với 1 + 1 = 2 hoặc nó chỉ là một trò chơi quá sức?
Một lần nữa, bạn có nó ngược: bạn không viết bài kiểm tra cho chức năng. Bạn viết chức năng cho các bài kiểm tra. Nếu chức năng để vượt qua bài kiểm tra hóa ra là tầm thường, thì thật tuyệt! Bạn vừa hoàn thành một yêu cầu hệ thống và thậm chí không phải làm việc chăm chỉ cho nó!
Có tốt để thay đổi chức năng và kiểm tra phù hợp nếu yêu cầu thay đổi?
Không. Cách khác vòng. Nếu một yêu cầu thay đổi, bạn thay đổi thử nghiệm tương ứng với yêu cầu đó, xem nó thất bại, sau đó thay đổi mã để thực hiện. Các bài kiểm tra luôn luôn đến đầu tiên.
Thật khó để làm điều này. Bạn cần hàng chục, có thể hàng trăm giờ luyện tập có chủ ý để xây dựng một loại "bộ nhớ cơ" nào đó để đi đến điểm, khi thời hạn xuất hiện và bạn phải chịu áp lực, bạn thậm chí không phải nghĩ về nó và làm điều này trở thành cách nhanh nhất và tự nhiên nhất để làm việc.