“ DAMP not DRY” หมายความว่าอย่างไรเมื่อพูดถึงการทดสอบหน่วย


345

ฉันได้ยินคนพูดว่าควรทดสอบหน่วย (เช่น nUnit, jUnit, xUnit)

DAMPไม่แห้ง

(เช่นการทดสอบหน่วยควรมี "รหัสชื้น" ไม่ใช่ "รหัสแห้ง")

พวกเขากำลังพูดเกี่ยวกับอะไร?


2
ไม่มีอะไรพิเศษเกี่ยวกับการทดสอบหน่วยที่รับประกันว่าไม่ใช่รหัส การเขียนการทดสอบที่ไม่ใช่ DRY เป็นข้อแก้ตัวโดยโปรแกรมเมอร์ขี้เกียจที่จะพยายามแกะสลักอาณาเขตสำหรับความขี้เกียจ พูดง่ายๆคือความแห้งและการอ่านเป็นเรื่องที่เกี่ยวข้องกัน
คิวเมนตัส

2
ความแห้งจะเพิ่มระยะทางในการนำรหัสซึ่งจะส่งผลให้เกิดภาระทางจิตที่สูงขึ้นเพื่อทำความเข้าใจ สิ่งนี้จะอยู่ในสภาพแวดล้อมที่เป็นข้อความ "ปกติ" ตัวแก้ไขโครงงานสามารถลดความเป็นเอกฐานของรหัสได้ แต่ไม่ใช่ในทุกกรณี
ปีเตอร์

ฉันแนะนำบทความนี้: enterprisecraftsmanship.com/posts/dry-damp-unit-tests
Vladimir

คำตอบ:


596

มันเป็นความสมดุลไม่ใช่ความขัดแย้ง

ชื้นและแห้งไม่ได้ขัดแย้งค่อนข้างจะสมดุลสองด้านที่แตกต่างกันของรหัสของการบำรุงรักษา รหัสที่รักษาได้ (รหัสที่เปลี่ยนแปลงได้ง่าย) คือเป้าหมายสูงสุดที่นี่

DAMP (วลีที่สื่อความหมายและมีความหมาย) ส่งเสริมการอ่านรหัส

ในการบำรุงรักษารหัสคุณต้องเข้าใจรหัสก่อน เพื่อให้เข้าใจคุณต้องอ่าน พิจารณาสักครู่ว่าคุณใช้เวลาอ่านโค้ดนานแค่ไหน มันเป็นจำนวนมาก. DAMP เพิ่มการบำรุงรักษาโดยการลดเวลาที่จำเป็นในการอ่านและทำความเข้าใจรหัส

DRY (อย่าทำซ้ำตัวเอง) ส่งเสริมการตั้งฉากของรหัส

การลบการทำซ้ำช่วยให้มั่นใจได้ว่าทุกแนวคิดในระบบมีการแสดงที่มีสิทธิ์เพียงหนึ่งเดียวในรหัส การเปลี่ยนแนวคิดทางธุรกิจเพียงอย่างเดียวส่งผลให้โค้ดมีการเปลี่ยนแปลงเพียงครั้งเดียว DRY เพิ่มการบำรุงรักษาโดยแยกการเปลี่ยนแปลง (ความเสี่ยง) ไปยังส่วนต่าง ๆ ของระบบที่ต้องเปลี่ยนเท่านั้น

ดังนั้นทำไมการทำซ้ำจึงเป็นที่ยอมรับมากขึ้นในการทดสอบ

การทดสอบมักจะมีการทำซ้ำโดยเนื้อแท้เพราะพวกเขากำลังทดสอบสิ่งเดียวกันซ้ำแล้วซ้ำอีกเฉพาะกับค่าอินพุตหรือรหัสการตั้งค่าที่แตกต่างกันเล็กน้อย อย่างไรก็ตามแตกต่างจากรหัสการผลิตการทำซ้ำนี้มักจะแยกเฉพาะกับสถานการณ์ในการทดสอบ / ไฟล์เดียว ด้วยเหตุนี้การทำสำเนาจึงมีน้อยและชัดเจนซึ่งหมายความว่ามีความเสี่ยงน้อยกว่าโครงการซ้ำกว่าประเภทอื่น ๆ

นอกจากนี้การลบการทำสำเนาชนิดนี้จะลดความสามารถในการอ่านของการทดสอบ รายละเอียดที่เคยทำซ้ำในการทดสอบแต่ละครั้งจะถูกซ่อนไว้ในวิธีการหรือคลาสใหม่ เพื่อให้ได้ภาพเต็มของการทดสอบคุณต้องนำชิ้นส่วนเหล่านี้กลับมารวมกัน

ดังนั้นเนื่องจากการทำสำเนารหัสทดสอบมักมีความเสี่ยงน้อยกว่าและส่งเสริมความสามารถในการอ่านจึงง่ายที่จะดูว่ามันถือว่าเป็นที่ยอมรับได้อย่างไร

ตามหลักการให้ใช้ DRY ในรหัสการผลิตโปรดปราน DAMP ในรหัสทดสอบ ในขณะที่ทั้งสองมีความสำคัญเท่าเทียมกันด้วยภูมิปัญญาเล็กน้อยคุณสามารถทิปยอดเงินในความโปรดปรานของคุณ


18
นี่เป็นบทสรุปที่ยอดเยี่ยมและกระชับ ฉันชอบที่จะชี้ให้เห็นว่าการทดสอบ DAMP นั้นมีความยืดหยุ่นมากขึ้นเมื่อเผชิญกับความต้องการที่เปลี่ยนแปลงและการวัดความชัดเจนของการทดสอบนั้นเป็นประโยชน์อย่างมากเมื่อมีคนมอบหมายให้เขียนการทดสอบของคุณเพื่อให้สอดคล้องกับข้อกำหนดใหม่ Jesper Lundberg ยังมีบทความที่ดีในเรื่องนี้
เจสัน

3
@ Jason, Btw มีลิงก์ไปยัง"Jesper Lundberg ยังมีบทความที่ดีเกี่ยวกับเรื่องนี้"หรือไม่?
Pacerier

2
@JohnSaunders คุณสามารถหลีกเลี่ยงการทำซ้ำบางส่วนได้โดยใช้รูปแบบเครื่องมือสร้างข้อมูลทดสอบ: natpryce.com/articles/000714.html
si618

2
การทดสอบรหัสออกมีความเป็นไปได้ที่จะสร้างแบบทดสอบที่คลุมเครือโดยการแนะนำแขกลึกลับ
jayeff

1
ฉันยังเพิ่มว่าการทดสอบที่เขียนอย่างดีนั้นเป็นเอกสาร / ความคิดเห็นสำหรับใบสมัครของคุณ ดังนั้นการอธิบายเพิ่มเติมช่วยอธิบายความตั้งใจของคุณต่อผู้พัฒนารายอื่น และอย่างที่ OP บอกว่าพวกมันบรรจุตัวเองในการทดสอบแต่ละครั้งดังนั้นอันตรายของการสมัครของคุณจึงน้อยมาก สถานการณ์กรณีที่เลวร้ายยิ่งคือคุณมีการทดสอบซ้ำซ้อนหรือการตั้งค่าการทดสอบและใช้เวลานานกว่าในการเรียกใช้ชุดทดสอบ ฉันควรทำผิดด้านการทดสอบที่ดี
Lee McAlilly

60

DAMP - วลีที่สื่อความหมายและมีความหมาย

ค่า "DAMP not DRY" สามารถอ่านได้มากกว่าการใช้รหัสซ้ำ แนวคิดของ DAMP ไม่ใช่ DRY ในกรณีทดสอบคือการทดสอบควรเข้าใจง่ายถึงแม้ว่านั่นหมายความว่าบางครั้งกรณีทดสอบมีรหัสซ้ำ

ดูเพิ่มเติมรหัสซ้ำกันได้ดีกว่าในการทดสอบหน่วยหรือไม่ สำหรับการอภิปรายเกี่ยวกับข้อดีของมุมมองนี้

อาจมีการประกาศใช้โดยเจย์ฟิลด์ในเรื่องภาษาเฉพาะโดเมน


1
คำตอบที่ดีและเชื่อมโยงกับคำถามที่เกี่ยวข้อง ไม่มีตัวเลือก DAMP vs DRY ที่สมบูรณ์แบบ เราต้องการโค้ดที่แห้งที่สุดและในการทดสอบซึ่งหมายความว่าไม่แห้งจนการทดสอบยากที่จะเข้าใจ เมื่อการทดสอบล้มเหลวฉันต้องการเหตุผลที่ชัดเจนเพื่อให้นักพัฒนาสามารถเริ่มต้นในการแก้ไข SUT ซึ่งหมายความว่าฉันพึ่งพารหัส DAMP ในการทดสอบ เช่นเดียวกับแนวคิดการเขียนโปรแกรมส่วนใหญ่มันเป็นไปได้เสมอที่จะทำอะไรที่ไกลเกินไป หากรหัสทดสอบหน่วยของคุณแห้งจนต้องใช้เวลานานในการพิจารณาว่าทำไมการทดสอบจึงล้มเหลวอาจเป็น "แห้งเกินไป"
เจอรัลด์เดวิส

29

"DRY" คือ "อย่าทำซ้ำตัวเอง"

นี่เป็นคำที่ใช้บอกให้คนเขียนโค้ดที่สามารถนำมาใช้ซ้ำได้เพื่อที่คุณจะได้ไม่ต้องเขียนโค้ดที่คล้ายกันซ้ำแล้วซ้ำอีก

"DAMP" คือ "วลีที่สื่อความหมายและมีความหมาย"

คำนี้มีวัตถุประสงค์เพื่อบอกให้คุณเขียนโค้ดซึ่งสามารถเข้าใจได้ง่ายโดยคนที่กำลังดูอยู่ หากคุณปฏิบัติตามหลักการนี้คุณจะมีชื่อตัวแปรและฟังก์ชั่นที่ยาวและละเอียดเป็นต้น


15
AIUI, DRY ไม่ได้เป็นเพียงเรื่องของการประหยัดเวลาผ่านการนำกลับมาใช้ใหม่ แต่ยังป้องกันไม่ให้รหัสเส้นทางที่แตกต่างกัน "ซิงค์" หากคุณคัดลอก - วางเขาตรรกะเดียวกันในหลายคลาสทุกอินสแตนซ์ของรหัสนั้นจะต้องได้รับการปรับปรุงเมื่อจำเป็นต้องมีการเปลี่ยนแปลง (และอย่างใดอย่างหนึ่งอย่างใดอย่างหนึ่งของพวกเขาจะไม่และจะระเบิดเมื่อออกกำลังกาย)
Andrzej Doyle

20

Damp = 'วลีเชิงพรรณนาและสื่อความหมาย' - การทดสอบหน่วยของคุณควรจะเป็น 'อ่าน':

การอ่านมีความสำคัญมากกว่าการหลีกเลี่ยงรหัสซ้ำซ้อน

จากบทความ:

DAMP ย่อมาจาก“ วลีที่สื่อความหมายและมีความหมาย” และเป็นสิ่งที่ตรงกันข้ามกับ DRY ไม่ใช่ในแง่ที่ว่า“ ทุกสิ่งควรมีลักษณะเหมือนกองขยะและเป็นไปไม่ได้ที่จะอ่าน” ในการอ่านนั้นสำคัญกว่าการหลีกเลี่ยงรหัสซ้ำซ้อน

สิ่งนี้หมายความว่าอย่างไรและจะใช้ที่ไหน?

ส่วนใหญ่จะใช้ DAMP เมื่อเขียนรหัสทดสอบ รหัสทดสอบควรเข้าใจได้ง่ายจนถึงจุดที่มีความซ้ำซ้อนบางอย่างเป็นที่ยอมรับ


11

DAMP ย่อมาจาก“ วลีที่สื่อความหมายและมีความหมาย” และเป็นสิ่งที่ตรงกันข้ามกับ DRY ไม่ใช่ในแง่ที่ว่า“ ทุกสิ่งควรมีลักษณะเหมือนกองขยะและเป็นไปไม่ได้ที่จะอ่าน” ในการอ่านนั้นสำคัญกว่าการหลีกเลี่ยงรหัสซ้ำซ้อน

http://codeshelter.wordpress.com/2011/04/07/dry-and-damp-principles-when-developing-and-unit-testing/


11

มีหลายคำตอบอยู่ที่นี่แล้ว แต่ฉันต้องการเพิ่มอีกเพราะฉันไม่คิดว่าพวกเขาจำเป็นต้องอธิบายให้ดีเท่าที่จะทำได้

แนวคิดของ DRY (อย่าทำซ้ำตัวเอง) คือในรหัสแอปพลิเคชันของคุณคุณต้องการหลีกเลี่ยงรหัสซ้ำซ้อนหรือ reptetive หากคุณมีบางสิ่งที่รหัสของคุณต้องทำหลาย ๆ ครั้งคุณควรมีฟังก์ชั่นหรือคลาสแทนรหัสซ้ำที่คล้ายกันในหลาย ๆ ที่

นี่เป็นแนวคิดการเขียนโปรแกรมที่รู้จักกันค่อนข้างดี

DAMP (วลีที่สื่อความหมายและวลีที่มีค่าน้อย) สำหรับการทดสอบหน่วยของคุณ แนวคิดนี้คือชื่อวิธีการทดสอบหน่วยของคุณควรมีความยาวและอธิบายได้อย่างมีประสิทธิภาพประโยคสั้น ๆ ที่อธิบายสิ่งที่คุณกำลังทดสอบ

เช่น: testWhenIAddOneAndOneIShouldGetTwo() { .... }

เมื่อคุณอ่านชื่อเมธอด DAMP เช่นนี้คุณควรเข้าใจอย่างถ่องแท้ว่าผู้เขียนแบบทดสอบพยายามทำอะไรโดยไม่ต้องอ่านโค้ดทดสอบ (แม้ว่ารหัสทดสอบจะสามารถทำตามแนวคิดนี้ได้เช่นเดียวกันกับชื่อตัวแปรที่ใช้คำ ฯลฯ )

สิ่งนี้เป็นไปได้เนื่องจากวิธีการทดสอบหน่วยมีอินพุตเฉพาะและเอาต์พุตที่คาดหวังดังนั้นหลักการ DAMP ทำงานได้ดีสำหรับพวกเขา วิธีการในรหัสแอปพลิเคชันหลักของคุณไม่น่าจะมีความเฉพาะเจาะจงมากพอที่จะรับประกันชื่อเช่นนี้โดยเฉพาะถ้าคุณเขียนด้วยหลักการ DRY ในใจ

DAMP และ DRY ไม่ได้ขัดแย้งกัน - พวกเขาครอบคลุมด้านต่าง ๆ ของวิธีการเขียนโค้ดของคุณ - แต่โดยทั่วไปแล้วพวกเขาไม่ได้ใช้ร่วมกันเพราะวิธีการที่เขียนด้วยหลักการ DRY ในใจจะเป็นวัตถุประสงค์ทั่วไปและไม่น่าจะเหมาะสม ถึงชื่อเมธอดที่เจาะจงมาก โดยทั่วไปตามที่อธิบายไว้ข้างต้นรหัสแอปพลิเคชันของคุณควรเป็น DRY และรหัสทดสอบหน่วยของคุณ DAMP

ฉันหวังว่าจะช่วยอธิบายได้ดีขึ้นเล็กน้อย


5

ฉันเห็นด้วยกับคริสเอ็ดเวิร์ดในการที่คุณจะต้องสร้างความสมดุลระหว่างทั้งสอง อีกสิ่งหนึ่งที่ควรทราบก็คือหากในความพยายามที่จะลบการทำซ้ำคุณจะต้องเพิ่มโครงสร้างเพิ่มเติมจำนวนมากในรหัสทดสอบหน่วยของคุณ (เช่นเมื่อนำ DRY ไปยังจุดสูงสุด) คุณจะเสี่ยงต่อการแนะนำบั๊กในนั้น ในสถานการณ์เช่นนี้คุณจะต้องทดสอบหน่วยการทดสอบหน่วยของคุณหรือปล่อยให้บิตของโครงสร้างยังไม่ได้ทดสอบ


0

ฉันไม่ต้องการทำซ้ำความพยายามที่นี่ แต่คุณสามารถทดสอบที่ DAMP แต่ได้ประโยชน์จาก DRY ในทางกลับกันการทดสอบ DRY จะไม่ตอบสนองการทดสอบ DAMP ในบางกรณี

ฉัน blogged เกี่ยวกับ DRY vs DAMP ซึ่งรวมถึงตัวอย่าง

ทั้งสองวิธีไม่ควรเป็นทางออกเดียวของคุณบางครั้ง DAMP ก็ overkill บางครั้งก็เป็นการเพิ่มที่ดีมาก

ตามกฎทั่วไปคุณควรใช้กฎสามข้อ หากคุณพบการทำซ้ำเป็นครั้งที่สามอาจจะมีมูลค่าการมองเข้าไปในการเขียนชื้นทดสอบสไตล์ แต่แม้แล้วทำซ้ำไม่ได้ทั้งหมดจะไม่ดี ประเด็นบริบท

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.