Việc mã hóa và kiểm tra đơn vị có vi phạm nguyên tắc DRY không


8

Nguyên tắc khô quy định:

"Mỗi phần kiến ​​thức phải có một đại diện duy nhất, rõ ràng, có thẩm quyền trong một hệ thống."

Tuy nhiên, khi viết các bài kiểm tra cho mã, bạn đang mô tả hành vi dự kiến ​​cho hệ thống hai lần (một lần trong mã và một lần trong kiểm tra). Tôi biết cả hai mô tả là từ một quan điểm khác nhau nhưng chia sẻ rất nhiều ý tưởng cơ bản.

Bất kỳ suy nghĩ về điều này?

Nói chung, tôi nghĩ rằng cả hai bài kiểm tra đơn vị và nguyên tắc DRY đều là những ý tưởng hay và tôi cố gắng áp dụng chúng càng nhiều càng tốt. Câu hỏi này nhiều hơn ở cấp độ triết học, nhưng tôi tự hỏi liệu có ai cũng đã nghĩ về điều này.


4
1. Mã không phải là hành vi dự kiến, nó là hành vi thực tế. 2. Kiểm tra không thuộc về hệ thống, vì vậy DRY vẫn đứng.
mouviciel

Câu trả lời:


12

Bạn đang hoạt động trên một tiền đề bị lỗi.

Mã không phải là một mô tả về hành vi dự kiến, chỉ có các yêu cầu và trường hợp thử nghiệm là. Và thậm chí sau đó, các yêu cầu và kiểm tra xác định hai mặt của hành vi. Các yêu cầu xác định các đặc điểm và chức năng của toàn bộ hệ thống phần mềm và kiểm tra xác định kết quả mong đợi sẽ là gì và phù hợp với yêu cầu. Mã này là một giải thích của nhà phát triển về các yêu cầu đó và kiến ​​trúc của hệ thống.


Tôi đang suy nghĩ theo cùng một dòng, tuy nhiên một lưu ý khác biệt: các bài kiểm tra đơn vị cũng dựa trên sự giải thích các yêu cầu và kiến ​​trúc của nhà phát triển, do đó không thể có sự hiểu lầm về cấp độ này giữa các bài kiểm tra đơn vị và mã (ít nhất là với TDD trường xanh - mã di sản là một vấn đề khác nhau). Đây là các thử nghiệm chấp nhận được / nên dựa trên định nghĩa về yêu cầu của khách hàng.
Péter Török

@ PéterTörök Đối với các bài kiểm tra đơn vị, nó phụ thuộc vào người viết bài kiểm tra. Điều đó hoàn toàn đúng nếu cùng một nhà phát triển viết các bài kiểm tra và mã. Nếu một nhà phát triển viết các bài kiểm tra và một người viết mã, thì bạn có hai cách hiểu của nhà phát triển và có thể thấy vấn đề sớm hơn. Đối với các cấp độ thử nghiệm khác nhau, tôi đang sử dụng thuật ngữ "thử nghiệm" để chỉ các thử nghiệm đơn vị, tích hợp, hệ thống và chấp nhận, mỗi thử nghiệm được viết bởi một người hoặc nhóm thích hợp cho mục đích nhất định. Nếu người sai viết bài kiểm tra (ví dụ: nhà phát triển viết bài kiểm tra chấp nhận), bài kiểm tra đó không hữu ích.
Thomas Owens

6

Không, nó không vi phạm nguyên tắc DRY vì các kiểm tra đơn vị không tái tạo chức năng, họ chỉ đảm bảo chức năng (trách nhiệm) hoạt động đúng. Trong trường hợp kiểm tra đơn vị, phương pháp bạn đang kiểm tra vẫn duy trì authoritative representation. Mã kiểm tra của bạn có thể trông rất giống với mã thực hiện phương thức trong phiên bản sản xuất, nhưng nó có mục đích rõ ràng của riêng nó (để khẳng định thử nghiệm).


3

Loại. Nếu chúng quá giống nhau, thì đúng, đó là một điều xấu. Thử nghiệm của bạn không nên được mã hóa giống như mã mà nó đang thử nghiệm. Vì vậy, bạn nên xác định (1) một kỳ vọng và (2) thực hiện.

Tôi muốn nghĩ rằng nó tương tự như kế toán kép . Một hệ thống kế toán luôn thực hiện ít nhất 2 mục (ghi nợ và tín dụng). Đây là một biện pháp kiểm tra lỗi. Vào cuối ngày, các khoản ghi nợ và các khoản tín dụng phải cân bằng, nếu không thì có lỗi. Bạn không thể có một hệ thống phát hiện lỗi mà không có một số hình thức dự phòng.

Hãy xem xét một CRC chẳng hạn. Byte CRC của bạn là một dạng dự phòng. Nó đủ để phát hiện bất kỳ lỗi nhỏ trong tín hiệu. Tương tự, CD âm thanh có rất nhiều thông tin dư thừa để chúng vẫn phát hoàn hảo nếu chúng bị trầy xước. Điều đó có vi phạm nguyên tắc DRY không? Có thể, nhưng đó là cách bạn có được độ tin cậy.

Có một cách khác để xem xét nó quá:

Bài kiểm tra của bạn là câu trả lời có thẩm quyền. Mã mà nó kiểm tra chỉ là tự động được tạo bởi bạn, khỉ mã. Nếu chúng tôi có thể tự động tạo mã dựa trên các thử nghiệm đơn vị (như chúng tôi tự động tạo các lớp truy cập dữ liệu dựa trên lược đồ cơ sở dữ liệu) thì chúng tôi sẽ không vi phạm nguyên tắc DRY (hoặc ít nhất không phải là nguyên tắc OAOO).


3

Tuy nhiên, khi viết các bài kiểm tra cho mã, bạn đang mô tả hành vi dự kiến ​​cho hệ thống hai lần (một lần trong mã và một lần trong kiểm tra).

Không hẳn. Mã không phải là mô tả của hành vi dự kiến, nhưng thực hiện nó . Mà có thể chứa lỗi, đó là lý do tại sao chúng ta cần các bài kiểm tra.

Việc thực hiện ngay cả một thuật toán khá đơn giản hoặc trừu tượng cũng khó hơn nhiều so với mô tả nó. Bất kỳ lập trình viên tử tế nào cũng có thể mô tả trong một vài câu về cách tìm kiếm nhị phân hoạt động - vẫn vậy, Jon Bentley báo cáo rằng trong các thí nghiệm của mình, hơn 70% các lập trình viên có kinh nghiệm tham gia khóa học của mình đã không thực hiện đúng.

Đây là lý do tại sao chúng ta cần kiểm tra đơn vị. Không ai thích làm việc nhiều gấp đôi để đạt được kết quả tương tự, nhưng tất cả những nhà phát triển đã xây dựng và truyền giáo thực hành này nhận ra từ kinh nghiệm khó kiếm của chính họ mà họ cần. Họ là những người thông minh muốn phát triển phần mềm nhanh nhất có thể - đòi hỏi phải loại bỏ tất cả các công việc trùng lặp và vô dụng khỏi quá trình phát triển. Kiểm tra đơn vị không phải là một công việc trùng lặp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.