2009-03-03 31 views
31

Trong số notorious Stack Overflow #38 podcastJoel Spolsky nói về việc TDD sẽ khó khăn như thế nào đối với một thứ như nén JPEG. Bob Martin wanted to cover làm thế nào để thực hiện TDD cho một ví dụ như trong podcast # 41, nhưng tôi không nghĩ rằng họ đã từng làm điều đó. Do đó:Nén TDD và JPEG

Làm cách nào để sử dụng TDD để phát triển và thử nghiệm nén JPEG?

+1

Và xin vui lòng, có thể chúng ta từ nay * luôn * coi nó như 'The Notorious Stackoverflow # 38' hoặc TNS # 38 ;-) –

Trả lời

70

Câu hỏi của Joel giống như thế này. Giả sử bạn muốn đặt một chút ở đâu đó khiến hình ảnh có độ phân giải thấp được hiển thị thay vì hình ảnh có độ phân giải cao. Làm thế nào bạn sẽ sử dụng TDD để có được điều đó để làm việc? Bạn có viết một bài kiểm tra đã cạo màn hình để cho biết rằng hình ảnh có độ phân giải thấp không?

Tất nhiên là không. Bạn đã biết rằng thư viện JPEG hoạt động. Bạn đã biết rằng nếu bạn gọi nó với các đối số đúng, nó sẽ hiển thị ở độ phân giải thấp. Những gì bạn cần kiểm tra là bit bạn đặt được dịch sang các cuộc gọi thích hợp vào thư viện JPEG. Vì vậy, bạn giả lập thư viện JPEG với một mô-đun rất đơn giản được kiểm soát bởi thử nghiệm của bạn. Sau đó, bạn đặt bit và yêu cầu hiển thị. Thư viện JPEG Mocked sẽ nhớ nó được gọi như thế nào, và sau đó kiểm tra có thể kiểm tra để chắc chắn rằng nó được gọi chính xác.

OK, vậy làm cách nào bạn kiểm tra nội bộ của thư viện JPEG? Tôi không biết nhiều về dựng hình JPEG, nhưng tôi đoán nó là về nén, giải nén và bitmap. Nén và giải nén chỉ là thuật toán. Thuật toán có kết quả đầu ra có thể dự đoán được từ các đầu vào đã cho.Vì vậy, bạn thiết lập một loạt các đầu vào rất đơn giản và đảm bảo bạn nhận được các kết quả đầu ra có thể dự đoán được. Bạn thiết lập các đầu vào để các phần bên trong của các thuật toán JPEG được bao phủ. Logic tương tự giữ cho các bitmap. Bạn không phải hiển thị chúng trên màn hình. Các bitmap đơn giản có thể được đưa vào bộ nhớ đệm mà các kiểm tra có thể kiểm tra. Đơn giản, tôi có nghĩa là SIMPLE. 3X3, 5X5, 8X8. Đơn giản. Một lần nữa, bạn cấu trúc dữ liệu đầu vào của mình để bao gồm phần lớn mã.

Không ai trong số này là khoa học tên lửa. Không có gì nếu nó là hoàn hảo. Nhưng một bộ 50 bài kiểm tra chứng minh rằng 90% logic của bạn là chính xác có thể tạo ra sự khác biệt lớn khi bạn muốn thay đổi.

Bạn có bao giờ loại bỏ hoàn toàn việc kiểm tra thủ công không? Tất nhiên là không. Nhưng bạn có thể giảm thiểu đáng kể nó. Bạn có thể giảm thử nghiệm thủ công đối với một vài bài kiểm tra rất chiến lược thay vì hàng ngàn kế hoạch kiểm tra đau đớn tẻ nhạt.

+16

Tuyệt vời, tôi đã nhờ chú Bob tham gia stackoverflow. Nên có một huy hiệu cho việc này. – stimms

+1

Haha ... vì bạn sẽ không nhận được huy hiệu cho nó, ít nhất tôi sẽ đưa ra câu hỏi của bạn +1. –

+0

Bạn có thể hiển thị nhiều hình ảnh phức tạp hơn và sau đó tính toán tổng kiểm tra MD5 để so sánh với kết quả đã biết. –

4

Nếu bạn nghĩ TDD có nghĩa là kiểm tra đến trước bất kỳ mã nào hoặc bất kỳ thiết kế nào, thì phần lớn là không thể. Đối với các thuật toán phức tạp, bạn cần một số kết quả. Và trong trường hợp nén, kết quả là khó để sản xuất bằng tay. Không phải là không thể, nhưng khó.

Hơn nữa, nén đòi hỏi một thuật toán hiệu suất rất cao. Đơn giản chỉ cần vượt qua một bài kiểm tra là không đủ tốt. Nhiều thuật toán hiệu suất thấp có thể vượt qua kiểm tra "chính xác" cơ bản.

Để di chuyển vượt ra ngoài tính chính xác, bạn cần bằng chứng cho thấy thuật toán của bạn là tối ưu. Điều này chỉ có thể được phát triển bên ngoài thế giới thử nghiệm. Bạn cần phân tích phức tạp bằng cách sử dụng O (điều gì đó), đây không phải là kết quả của thử nghiệm; cũng không phải nó có thể được xác định rõ là kết quả của một thử nghiệm.

Nếu, mặt khác, bạn nghĩ rằng "khả năng thử nghiệm" xuất hiện trước phần lớn mã, sau đó thật dễ dàng.

  • Thiết kế thuật toán của bạn. Viết một bằng chứng rằng nó tối ưu.

  • Viết một số mã hiển thị các phần quan trọng trong thuật toán của bạn làm mô-đun có thể kiểm tra.

  • Trong một số trường hợp, hãy viết mã để tạo kết quả kiểm tra cho thuật toán tổng thể. Điều này có thể là tối ưu, mã brute-force tạo ra câu trả lời đúng thông qua các thuật toán thực sự rõ ràng, nhưng chậm.

  • Lắp ráp một cách không thể thực hiện để cho thấy rằng việc triển khai của bạn tạo ra kết quả thử nghiệm mong đợi.

  • Lắp ráp một giấy kỹ thuật để chứng minh rằng nó cũng tối ưu.

Nó không phải là thử nghiệm đầu tiên. Nhưng nó là thử nghiệm.

0

Test Driven Development không chỉ là lập trình, có rất nhiều điều khác mà bạn có thể thực hiện sử dụng thử nghiệm đầu tiên, ví dụ là với sự chấp nhận tdd vv

suy nghĩ đầu tiên như thế nào bạn muốn nó để hành xử, đây là điều. Đối với một thuật toán, ví dụ có thể là một cái gì đó như:

  • "Nó phải hoàn thành 5 cuộc gọi trong 10 giây"
  • "Nó phải giảm đến 10% kích thước của hình ảnh"
  • khác.

Tôi tin rằng nó chỉ là một cách sống để suy nghĩ rõ ràng những gì bạn muốn đạt được: D