Những gì DAMP không phải là DRY không có nghĩa là gì khi nói về các bài kiểm tra đơn vị?


345

Tôi nghe ai đó nói rằng các bài kiểm tra đơn vị (ví dụ: nUnit, jUnit, xUnit) phải là

DAMP không DRY

(Ví dụ: kiểm tra đơn vị phải chứa "mã ẩm" chứ không phải "mã khô")

Bọn họ đang nói gì thế?


2
Không có gì đặc biệt về các bài kiểm tra đơn vị đảm bảo mã không DRY. Viết các bài kiểm tra không DRY là một cái cớ của các lập trình viên lười biếng để cố gắng khắc chế lãnh thổ vì sự lười biếng của họ. Nói một cách đơn giản, DRYness và khả năng đọc là mối quan tâm trực giao.
Acumenus

2
DRYness tăng khoảng cách điều hướng mã, từ đó dẫn đến tải trọng tinh thần cao hơn để hiểu. Điều này giữ trong một môi trường dựa trên văn bản "bình thường". Một trình soạn thảo hình chiếu có thể làm giảm tính trực giao của mã nhưng không phải trong mọi trường hợp.
Peter

Câu trả lời:


594

Đó là một sự cân bằng, không phải là một mâu thuẫn

DAMP và DRY không mâu thuẫn với nhau, thay vào đó chúng cân bằng hai khía cạnh khác nhau về khả năng duy trì của mã . Mã duy trì (mã dễ thay đổi) là mục tiêu cuối cùng ở đây.

DAMP (Cụm từ mô tả và có ý nghĩa) thúc đẩy tính dễ đọc của mã.

Để duy trì mã, trước tiên bạn cần hiểu mã. Để hiểu nó, bạn phải đọc nó. Hãy xem xét một lúc bạn dành bao nhiêu thời gian để đọc mã. Đó là rất nhiều. DAMP tăng khả năng bảo trì bằng cách giảm thời gian cần thiết để đọc và hiểu mã.

DRY (Đừng lặp lại chính mình) thúc đẩy tính trực giao của mã.

Loại bỏ trùng lặp đảm bảo rằng mọi khái niệm trong hệ thống có một biểu diễn có thẩm quyền duy nhất trong mã. Một thay đổi đối với một khái niệm kinh doanh duy nhất dẫn đến một thay đổi đối với mã. DRY tăng khả năng bảo trì bằng cách cách ly thay đổi (rủi ro) chỉ với những phần của hệ thống phải thay đổi.

Vì vậy, tại sao sự trùng lặp được chấp nhận hơn trong các thử nghiệm?

Các thử nghiệm thường chứa sự trùng lặp vốn có bởi vì chúng đang thử nghiệm cùng một thứ lặp đi lặp lại, chỉ với các giá trị đầu vào hoặc mã thiết lập hơi khác nhau. Tuy nhiên, không giống như mã sản xuất, sự trùng lặp này thường chỉ được tách biệt với các kịch bản trong một tập tin / tập tin thử nghiệm duy nhất. Bởi vì điều này, sự trùng lặp là tối thiểu và rõ ràng, điều đó có nghĩa là nó gây ra ít rủi ro cho dự án hơn các loại trùng lặp khác.

Hơn nữa, loại bỏ loại trùng lặp này làm giảm khả năng đọc của các bài kiểm tra. Các chi tiết được sao chép trước đây trong mỗi thử nghiệm hiện được ẩn đi trong một số phương thức hoặc lớp mới. Để có được bức tranh đầy đủ của bài kiểm tra, bây giờ bạn phải tinh thần đặt tất cả các phần này lại với nhau.

Do đó, vì sao chép mã kiểm tra thường mang ít rủi ro hơn và thúc đẩy khả năng đọc, dễ dàng thấy cách nó được coi là chấp nhận được.

Theo nguyên tắc, ưu tiên DRY trong mã sản xuất, ưu tiên DAMP trong mã kiểm tra. Trong khi cả hai đều quan trọng như nhau, với một chút khôn ngoan, bạn có thể nghiêng về sự cân bằng có lợi cho bạn.


18
Đây là một bản tóm tắt tuyệt vời, súc tích. Tôi cũng muốn chỉ ra rằng một bài kiểm tra DAMP có khả năng phục hồi tốt hơn khi đối mặt với các yêu cầu thay đổi và việc đo lường mức độ rõ ràng của bài kiểm tra là một lợi ích to lớn khi người khác được giao nhiệm vụ viết lại các bài kiểm tra của bạn để phù hợp với các yêu cầu mới. Jesper Lundberg cũng có một chuyên luận tốt về chủ đề này.
Jason

3
@Jason, Btw có liên kết đến "Jesper Lundberg cũng có một chuyên luận tốt về chủ đề này" ?
Pacerier

2
@JohnSaunders, bạn có thể tránh một số trùng lặp đó bằng cách sử dụng mẫu trình tạo dữ liệu thử nghiệm: natpryce.com/articles/000714.html
si618

2
Mã kiểm tra DRYing có khả năng tạo ra một thử nghiệm tối nghĩa bằng cách giới thiệu một vị khách bí ẩn
jayeff

1
Tôi cũng nói thêm rằng các bài kiểm tra viết tốt về cơ bản là tài liệu / nhận xét cho ứng dụng của bạn. Vì vậy, mô tả nhiều hơn giúp giải thích ý định của bạn cho các nhà phát triển khác. Và như OP nói, chúng được chứa trong mỗi bài kiểm tra nên mức độ nguy hiểm cho ứng dụng của bạn là rất nhỏ. Trường hợp xấu hơn là bạn có một thiết lập thử nghiệm hoặc kiểm tra dự phòng và mất nhiều thời gian hơn để chạy bộ thử nghiệm. Tôi khá sai lầm về phía bảo hiểm thử nghiệm tốt.
Lee McAlilly

60

DAMP - Các cụm từ mô tả và có ý nghĩa.

Giá trị "DAMP not DRY" dễ đọc hơn khi sử dụng lại mã. Ý tưởng của DAMP không DRY trong các trường hợp thử nghiệm là các thử nghiệm phải dễ hiểu, ngay cả khi điều đó có nghĩa là các trường hợp thử nghiệm đôi khi có mã lặp lại.

Xem thêm Mã trùng lặp có dễ chấp nhận hơn trong các bài kiểm tra đơn vị không? cho một số thảo luận về giá trị của quan điểm này.

Nó có thể đã được đặt ra bởi Jay Field , liên quan đến Ngôn ngữ cụ thể miền.


1
Câu trả lời tốt và liên kết đến câu hỏi liên quan. Không có sự lựa chọn DAMP vs DRY hoàn hảo. Chúng tôi muốn mã càng khô càng tốt và trong thử nghiệm có nghĩa là không khô đến mức thử nghiệm trở nên khó hiểu. Khi thử nghiệm thất bại, tôi muốn lý do rõ ràng để nhà phát triển có thể bắt đầu sửa SUT, điều đó có nghĩa là tôi nghiêng về mã DAMP trong các thử nghiệm. Giống như hầu hết các khái niệm lập trình, luôn luôn có thể đưa một cái gì đó quá xa. Nếu mã kiểm tra đơn vị của bạn quá khô đến nỗi phải mất một thời gian dài để xác định cách thức và lý do tại sao thử nghiệm thất bại, nó có thể "quá khô".
Gerald Davis

29

"DRY" là "Đừng lặp lại chính mình"

Đây là một thuật ngữ được sử dụng để bảo mọi người viết mã có thể sử dụng lại, để cuối cùng bạn không viết mã tương tự lặp đi lặp lại.

"DAMP" là "Cụm từ mô tả và có ý nghĩa".

Thuật ngữ này nhằm bảo bạn viết mã có thể dễ dàng hiểu được bởi một người đang xem nó. Nếu bạn đang tuân theo nguyên tắc này, bạn sẽ có các tên hàm và biến dài và mô tả, v.v.


15
AIUI, DRY không chỉ là vấn đề tiết kiệm thời gian thông qua khả năng sử dụng lại - nó cũng ngăn chặn các đường dẫn mã khác nhau "không đồng bộ". Nếu bạn sao chép-dán cùng một logic trên nhiều lớp, mọi phiên bản của mã đó sẽ cần được cập nhật khi cần thay đổi. (Và chắc chắn một trong số họ sẽ không, và sẽ nổ tung khi tập thể dục.)
Andrzej Doyle

20

Damp = 'Cụm từ mô tả và có ý nghĩa' - bài kiểm tra đơn vị của bạn sẽ có thể được 'đọc':

Khả năng đọc quan trọng hơn việc tránh mã thừa.

Từ bài viết:

DAMP là viết tắt của cụm từ mô tả và ý nghĩa, và trái ngược với DRY, không phải theo nghĩa mà nó nói là mọi thứ giống như một đống rác và không thể đọc được, vì điều đó dễ đọc hơn là tránh được mã thừa.

Điều này có nghĩa là gì và sử dụng nó ở đâu?

DAMP chủ yếu áp dụng khi viết mã kiểm tra. Mã kiểm tra phải rất dễ hiểu đến mức có thể chấp nhận được một số dự phòng.



11

Đã có một vài câu trả lời ở đây, nhưng tôi muốn thêm một câu khác vì tôi không nghĩ họ nhất thiết phải giải thích nó tốt nhất có thể.

Ý tưởng về DRY (Đừng lặp lại chính mình) là trong mã ứng dụng của bạn, bạn muốn tránh mã thừa hoặc lặp lại. Nếu bạn đã có một cái gì đó mà mã của bạn cần thực hiện nhiều lần, bạn nên có một hàm hoặc lớp cho nó, thay vì lặp lại mã tương tự ở một vài nơi.

Đây là một khái niệm lập trình khá nổi tiếng.

DAMP (Cụm từ mô tả và có ý nghĩa) dành cho các bài kiểm tra đơn vị của bạn. Ý tưởng ở đây là các tên phương thức kiểm tra đơn vị của bạn phải dài và mô tả - các câu ngắn có hiệu quả mô tả những gì bạn đang kiểm tra.

ví dụ: testWhenIAddOneAndOneIShouldGetTwo() { .... }

Khi bạn đọc một tên phương thức DAMP như thế này, bạn sẽ hiểu chính xác những gì người viết bài kiểm tra đang cố gắng đạt được, thậm chí không cần phải đọc mã kiểm tra (mặc dù mã kiểm tra cũng có thể tuân theo khái niệm này, tất nhiên cũng có tên biến từ, Vân vân).

Điều này là có thể bởi vì một phương pháp thử nghiệm đơn vị có đầu vào rất cụ thể và đầu ra dự kiến, vì vậy nguyên tắc DAMP hoạt động tốt cho chúng. Các phương thức trong mã ứng dụng chính của bạn dường như không đủ cụ thể để đảm bảo các tên như thế này, đặc biệt nếu bạn đã viết nó với nguyên tắc DRY trong tâm trí.

DAMP và DRY không mâu thuẫn với nhau - chúng bao gồm các khía cạnh khác nhau về cách viết mã của bạn - nhưng dù sao chúng thường không được sử dụng cùng nhau bởi vì các phương pháp được viết theo nguyên tắc DRY sẽ có mục đích chung và không phù hợp để tên phương pháp cụ thể cao. Do đó, nói chung, như đã giải thích ở trên, mã ứng dụng của bạn phải là DRY và mã thử nghiệm đơn vị DAMP của bạn.

Tôi hy vọng điều đó sẽ giúp giải thích nó tốt hơn một chút.


5

Tôi đồng ý với Chris Edwards ở chỗ bạn cần đạt được sự cân bằng giữa hai người. Một điều cần lưu ý là nếu trong nỗ lực loại bỏ trùng lặp, cuối cùng bạn sẽ thêm rất nhiều cấu trúc bổ sung vào mã kiểm tra đơn vị của mình (tức là khi đưa DRY đến cực trị), bạn có nguy cơ đưa ra các lỗi trong đó. Trong tình huống như vậy, bạn sẽ phải kiểm tra đơn vị kiểm tra đơn vị của mình hoặc để lại các bit cấu trúc chưa được kiểm tra.


0

Tôi không muốn nhân đôi nỗ lực ở đây, nhưng bạn có thể có các bài kiểm tra là DAMP nhưng có lợi ích của DRY. Mặt khác, các thử nghiệm DRY sẽ không đáp ứng các thử nghiệm DAMP trong một số trường hợp.

Tôi đã viết về DRY vs DAMP bao gồm một số ví dụ.

Không phải cách tiếp cận nào cũng là giải pháp duy nhất của bạn, đôi khi DAMP là quá mức cần thiết, đôi khi lại là một bổ sung rất hay.

Theo nguyên tắc chung, bạn nên áp dụng quy tắc ba. Nếu bạn phát hiện sao chép lần thứ ba, có thể đáng để xem xét việc viết các bài kiểm tra kiểu DAMP, nhưng ngay cả khi đó không phải tất cả các bản sao đều xấu . Các vấn đề bối cảnh.

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.