ถ้า TDD เกี่ยวกับการออกแบบทำไมฉันถึงต้องใช้มัน? [ปิด]


10

กูรู TDD มากขึ้นและบอกเราว่าTDD ไม่ได้เกี่ยวกับการทดสอบมันเป็นเรื่องเกี่ยวกับการออกแบบ ดังนั้นฉันรู้ว่านักพัฒนาบางคนที่สร้างการออกแบบที่ยอดเยี่ยมจริงๆโดยไม่มี TDD พวกเขาควรฝึกซ้อม TDD ไหม?


14
หากพวกเขาทำได้ดีหากไม่มีมันก็ไม่จำเป็นต้องใช้ ไม่ใช่ "แนวปฏิบัติที่ดีที่สุด" ทุกงานสำหรับทุกคน
โกง

1
คำตอบของฉันสำหรับคำถามที่คล้ายกัน: programmers.stackexchange.com/questions/98485/…
Rei Miyasaka

คำตอบ:


18

TDD ไม่เพียงช่วยฉันในการออกแบบขั้นสุดท้ายที่ดีที่สุดเท่านั้น แต่ยังช่วยให้ฉันไปถึงที่นั่นด้วยความพยายามน้อยลง

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

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


4
ในความพยายามน้อยลงจริงเหรอ?
SiberianGuy

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

4
ดูสิมีคำนั้นอีกแล้ว, forced. ฉันไม่รู้ว่าทำไมคนทั่วไปถึงไม่ค่อยถูกรบกวนจากความถี่ของคำว่า "ถูกบังคับ" เพราะมันเกิดขึ้นในการอภิปรายเกี่ยวกับ TDD เราไม่จำเป็นต้องบังคับให้ออกแบบบางสิ่งอย่างถูกต้อง พวกเขาควรเรียนรู้วิธีออกแบบสิ่งต่าง ๆ อย่างถูกต้องแล้วดำเนินการต่อโดยไม่ถูกบังคับโดยเฉพาะอย่างยิ่งเมื่อการบังคับนั้นใช้เวลานานอย่างไม่น่าเชื่อ
Rei Miyasaka

3
@Rei: ผู้คนไม่ได้ถูกรบกวนบ่อยขึ้นเพราะพวกเขารู้ว่าอีกคนหมายถึง "ผลัก" หรือ "นำทาง" หรือ ... และนี่คือการเปิดเผยเมื่อคุณกำลังพูดถึงการทดสอบขับเคลื่อนการพัฒนา ... อาจเป็น "ขับเคลื่อน" . และใช่บางคนอาจพบว่าพวกเขาคิดอย่างนั้นอย่างเป็นธรรมชาติโดยไม่ถูกขับออกมาฉันพูดในโพสต์ แต่คุณยังต้องทดสอบซอฟต์แวร์ของคุณเพื่อที่คุณจะไม่ได้ดีไปกว่านี้อีก
pdr

3
เมื่อมีคนพูดว่า "การออกแบบแบบแยกส่วนกำลัง" พวกเขาถูกบังคับแน่นอน มันยากมาก (ถ้าไม่เป็นไปไม่ได้) ในการออกแบบที่ไม่สามารถคอมโพสิตกับ TDD และนั่นเป็นสิ่งที่ดี ปัญหานี้ไม่ได้เป็นผลมาจากการมีพลัง; มันเป็นปริมาณของความพยายามที่น่าเบื่อ การออกแบบที่เหมาะสมเป็นทักษะที่สามารถเรียนรู้ได้และเรียนรู้ได้และควรใช้เวลาในการเรียนรู้ นอกจากนี้การทดสอบที่เขียนขึ้นสำหรับ TDD นั้นดูไม่เหมือนการทดสอบที่เขียนขึ้นเพื่อดักจับข้อบกพร่อง ถ้าพวกเขาทำสิ่งที่ผิด
Rei Miyasaka

12

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

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

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

คุณไม่สามารถรู้ได้ว่าคุณกำลังออกแบบเพื่อการทดสอบจริง ๆ หรือไม่ถ้าคุณไม่เขียนการทดสอบและ "การทดสอบคุณสมบัติ" โดยไม่ส่งผลต่อการครอบคลุมโค้ดเพียง 15%

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


1
จุดประสงค์ของการออกแบบที่ดีนั้นไม่เพียง แต่ถูกทดสอบ แต่ใช่ TDD เป็นเครื่องมือที่ดีในการสังเกตการออกแบบที่บกพร่อง
deadalnix

4

คำตอบแบบง่ายๆมาจากคนที่พยายามเรียนรู้ TDD: คุณไม่ต้องการแต่ข้อดีหลัก ๆ ที่ให้คุณคือความมั่นใจค่อนข้างง่ายมั่นใจได้ว่าใบสมัครของคุณทำงานได้ มั่นใจได้ว่ากรณีใช้งานมีความพึงพอใจ มั่นใจว่าตรรกะของคุณจะเป็นเสียงสำหรับโมดูล "Foobar" ความมั่นใจว่ารหัสของคุณมีโครงสร้างที่เหมาะสมเพื่อให้สามารถบำรุงรักษาและขยายออกไปได้ถึงหกเดือนเมื่อ CEO ต้องการเพิ่มฟีเจอร์ใหม่ ๆ ที่เขาอ่าน ความมั่นใจว่าเมื่อแอปพลิเคชันของคุณเติบโตขึ้นฐานรากได้ถูกวางไว้เพื่อให้สถาปัตยกรรมไม่กระจุยหรือต้องมีแฮ็กแฮ็กที่ยุ่งเหยิงเพื่อให้ลูกเล่นใหม่ ๆ

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


+1 TDD คือข้อเสนอแนะ เนื่องจากข้อเสนอแนะส่วนใหญ่เป็นไปตามวัตถุประสงค์และเป็นไปโดยอัตโนมัติอย่างสมบูรณ์ดังนั้นจึงสามารถแบ่งปันให้กับสมาชิกในทีมทุกระดับความสามารถ ก่อน TDD รหัสที่ดีคือสิ่งที่คุณ "รู้สึก" หรือได้รับการยืนยันหลังจากผู้ใช้ได้รับซอฟต์แวร์ ยิ่งห่วงสั้นเท่าไหร่คุณยิ่งรู้สึกมั่นใจมากเท่านั้น น่าเสียดายที่ TDD มีแนวโน้มที่จะเกิดความมั่นใจมากเกินไปว่า "รู้สึก" การออกแบบที่ดี แต่มันง่ายกว่าที่จะแก้ไขด้วยตนเอง
Steve Jackson

2

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

  • TDD ทำให้ฉันคิดว่าก่อนที่ฉันจะนำไปใช้ซึ่งโดยทั่วไปมักจะเป็นแนวปฏิบัติที่ดีมากซึ่งป้องกันการยิงและลืมวิธีแก้ไขปัญหา
  • มันทำให้ฉันคิดว่าในส่วนเล็ก ๆ ของปัญหาบังคับให้ฉันแยกทางแก้ปัญหากับชิ้นเล็ก ๆ ที่เข้าด้วยกัน
  • มันทำให้ฉันเขียนรหัส decoupled มากเพราะเมื่อใดก็ตามที่ฉันต้องสตับ / เยาะเย้ย / บางสิ่งบางอย่างที่ไม่เหมาะสมกับปัญหาที่ฉันโยนหนึ่ง "WTF ทำไมฉันต้องทำอย่างนี้ถ้าฉันไม่ต้องอยู่คู่กับมัน" . และมันทำให้ฉันตระหนักถึงความเชื่อมโยงระหว่างสิ่งต่าง ๆ ดีขึ้น
  • มันให้ชุดการตรวจสอบที่เรียกใช้งานได้ง่ายสำหรับรหัสของฉันดังนั้นฉันจึงไม่ต้องผ่านความเจ็บปวด "var_dump", "p", "pp", "echo" สไตล์ของการดีบักรหัส มันแค่รายงานสิ่งที่ผิดเมื่อผิด และถ้าฉันยังไม่มีการตรวจสอบมันเป็นเรื่องของการเพิ่มการทดสอบง่าย ๆ เพื่อตรวจสอบซ้ำแล้วซ้ำอีก
  • มันทำให้ฉันแน่ใจว่ารหัสของฉันทำงานถ้าการทดสอบทั้งหมดผ่านก่อนที่เราจะปรับใช้ จากนั้นแทนที่จะกินเล็บของฉันฉันไปกินเค้กและดื่มกาแฟและเพลิดเพลินกับช่วงบ่ายของฉัน
  • การทดสอบระดับสูงนั้นดีมากในกรณีที่คุณต้องปรับโครงสร้างบางอย่าง หากโมดูลของฉันมีหน้าที่บางอย่างให้กับโลกภายนอกและฉันได้พัฒนาการทดสอบการทำงาน / การรวมตัว / แตงกวาเพื่อพิสูจน์ว่ามันทำงานอย่างถูกต้องฉันจะกล้ามากที่จะปรับสภาพนรกออกจากรหัสนั้น หลายครั้งที่ฉันต้องเผชิญกับรหัสที่ไม่มีการทดสอบและจำเป็นต้องปรับโครงสร้างใหม่ ในกรณีนั้นมีวิธีปฏิบัติสองวิธี 1) วางโค้ด 2) ข้ามการเปลี่ยนแปลงและปล่อยไว้ตามที่เป็น

มีสิ่งหนึ่งที่ TDD ไม่สามารถแก้ไขได้ หากคุณไม่ทราบวิธีการสร้างสิ่งที่คุณกำลังสร้าง TDD จะไม่สร้างทางออกให้คุณ คุณต้องมี "การออกแบบ" อย่างคร่าวๆหรือภาพรวมของปัญหาและวิธีแก้ไข TDD จะทำให้คุณใช้งานได้อย่างสวยงามและบำรุงรักษามากขึ้นด้วยรหัสที่มีคุณภาพสูงขึ้น

ในที่สุดฉันชอบคิดในแง่ BDD ซึ่งพึ่งพาวิธีปฏิบัติของ TDD BDD ทำให้ฉันใช้โซลูชันโดยใช้คำศัพท์ของโดเมนและทำให้ซอฟต์แวร์เหมาะสมกับปัญหาได้ดีขึ้น


1

อาจมีหลายวิธีในการบรรลุการออกแบบที่ยอดเยี่ยมและมีการตีความที่แตกต่างกันอย่างมากมายในสิ่งที่ถือว่า "ยอดเยี่ยม" - หรือแม้แต่ "ดี" ฉันสงสัยว่า TDDers ส่วนใหญ่จะไม่เห็นด้วยกับคุณเกี่ยวกับคำจำกัดความ - ว่าถ้าเราดูโค้ดที่คุณรู้สึกว่ายอดเยี่ยมเราจะพิจารณามันน้อยกว่าดี TDD ทำให้เรามีคุณสมบัติที่เฉพาะเจาะจงมากและคุณภาพเหล่านี้ไม่ค่อยพบในรหัสที่ไม่ใช่ TDD

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


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

@Aaraught บอกกับทีมงานClimate Orbe ของMars :-)
Eric King

ฉันมีประสบการณ์บางอย่างเกี่ยวกับกระบวนการน้ำตกในโครงการทางทหารที่ไม่ใช่อาวุธในช่วงทศวรรษ 90 และยังมีการพูดคุยเกี่ยวกับเครื่องทำน้ำเย็นกับทหารผ่านศึกของการใช้งานทางทหารอื่น ๆ อีกมากมาย ฉันทามติทั่วไปคือวิธีการน้ำตกและการเรียกเก็บเงินค่าใช้จ่ายบวกผลิตระบบบักกี้ที่ยากมากที่จะรักษา
kevin cline
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.