ค่าใช้จ่ายที่แท้จริงของ TDD เป็นอย่างไรเมื่อทั้งทีมคุ้นเคยกับมัน?


24

เปอร์เซ็นต์ของเวลาที่บันทึกและคิดต้นทุนในการทำ TDD

ฉันคิดว่าเปอร์เซ็นต์ของต้นทุนและการเปลี่ยนแปลงของรางวัลระหว่างวงจรชีวิตของโครงการ

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

ฉันได้ยินทุกที่จาก30-50% ของเวลาของคุณคือการเขียนการทดสอบหน่วย อย่างไรก็ตามนั่นไม่ได้คำนึงถึงเวลาที่บันทึกไว้จากการเขียนการทดสอบเหล่านั้น

ประสบการณ์ของทุกคนเกี่ยวกับสิ่งนี้คืออะไร

เวสสตรีท

แก้ไขสิ่งที่ประหยัดเวลาเช่นเดียวกับเวลา? ในการแก้ไขข้อผิดพลาดและ refactorablity?


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

1
@Chris เมื่อคุณเขียนการทดสอบก่อนอื่นคุณต้องออกแบบ API ล่วงหน้าแทนที่จะเป็นภายหลัง


3
@ Thorbjørn: เห็นด้วยกับการสังเกตของคุณแม้ว่ามันจะเป็นไปได้ทั้งหมดในการออกแบบ API โดยไม่ต้องใช้ TDD แทบจะไม่ในภายหลัง
Robert Harvey

2
@ สตีเว่น: ใช่ฉันรู้ว่า TDD คืออะไร เป็นเรื่องที่น่าสนใจที่คุณบอกว่าออกแบบ API ล่วงหน้า นั่นทำให้ฉันเป็นแนวทางเสียง ฉันไม่เคยขายอย่างสมบูรณ์ในความคิดที่ว่าคุณสามารถ "เติบโต" API ด้วยการเขียนการทดสอบจำนวนมาก
Robert Harvey

คำตอบ:


8

ฉันได้ยินทุกที่จาก 30-50% ของเวลาของคุณคือการเขียนการทดสอบหน่วย อย่างไรก็ตามนั่นไม่ได้คำนึงถึงเวลาที่บันทึกไว้

จากประสบการณ์ของฉันมันมากกว่า 50%

เมื่อคุณเขียนข้อสอบแล้ววิธีแก้ปัญหาก็มีแนวโน้มที่จะง่ายมาก ดังนั้นฉันไม่คิดว่ามันแปลกที่จะใช้ 70% - 75% ของการทดสอบการเขียนเวลาของคุณ แต่คุณใช้เวลาน้อยลงในการเขียน 'รหัสการผลิต' (การทดสอบการใช้รหัส) และแทบไม่ต้องเสียเวลาในการดีบัก .

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

สำหรับฉันแล้วมูลค่าที่แท้จริงคือการบำรุงรักษา การสืบทอดฐานรหัสด้วยการทดสอบทำให้คุณกลัวน้อยลงที่จะเปลี่ยนแปลง คุณรู้สึกว่าคุณไม่ได้ทำลายอะไรเลยเมื่อการทดสอบผ่านไป เนื่องจากคุณไม่กลัวที่จะทำการเปลี่ยนแปลงคุณยินดีที่จะสร้างใหม่หากมีบางอย่างไม่ถูกต้อง ซึ่งหมายความว่ารหัสสามารถทำความสะอาดได้ดีขึ้นการออกแบบสามารถทำได้ดีกว่าและในทางทฤษฎีแล้วการเปลี่ยนแปลงสามารถนำไปใช้ได้ ตรงกันข้ามกับรหัสวูดูที่ทุกคนกลัวที่จะสัมผัส


หากการทดสอบเป็นแบบทดสอบที่ดี อย่างไรก็ตามมีบางอย่างดีกว่าไม่มีเลยและโดยทั่วไปคุณสามารถบอกได้อย่างรวดเร็วว่าดูดีหรือไม่
Michael K

1
ดังนั้นคุณคิดว่ามีการประหยัดที่เป็นรูปธรรมในเวลาจริง (2 เดือน) สำหรับตัวอย่างของคุณ แต่ต้องใช้เวลานานเท่าไหร่ในการทดสอบ คำตอบที่ดี btw
Wes

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

ย้ายสิ่งนี้ไปยังคำตอบที่ฉันยอมรับตอนนี้
Wes

15

ทุกครั้งที่คุณทำการทดสอบหน่วยคุณจะประหยัดเวลาที่ต้องทำการทดสอบด้วยตนเอง

30% ถึง 50% ของเวลาที่คุณอ้างว่าจำเป็นต้องใช้ในการเขียนการทดสอบของคุณนั้นยังชดเชยได้อย่างมากจากประโยชน์ของการออกแบบซอฟต์แวร์ที่ดีขึ้น (ทดสอบได้)


สมมติว่าใช้เวลานานสี่ครั้งในการเขียนการทดสอบอัตโนมัติเช่นเดียวกับที่จะทำการทดสอบด้วยตนเอง นั่นหมายความว่าครั้งที่สี่ที่คุณรันการทดสอบอัตโนมัตินั้นจะจ่ายให้เอง ทุกครั้งที่คุณทำการทดสอบอัตโนมัติหลังจากนั้นฟรี

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

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


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

6
การทดสอบหน่วยมีการทดสอบการถดถอย ฉันไม่แน่ใจว่าคุณกำลังพูดอะไร
Robert Harvey

2
การทดสอบหน่วยและการทดสอบการใช้งานเป็นทั้งการทดสอบการถดถอย ฉันคิดว่าเวสต์หมายถึงหลัง
Phil Mander

@Phil Mander ถูกต้องแล้ว @ Robert Harvey ฉันหมายถึงการทดสอบการทำงานสมองของฉันไม่พบคำที่เหมาะสม แม้ว่าฉันค่อนข้างแน่ใจว่าจิตใต้สำนึกของฉันทำตามที่ฉันใช้คำที่ใช้งานได้: S โอ้และแก้ไขได้ดี btw
Wes

ฉันไม่คิดว่าจะทำการทดสอบแบบเดียวกันทุกครั้งจริง ๆ แล้วเป็นบวกเพราะมันเป็นไปได้ที่จะพลาดการค้นหาปัญหาอย่างสม่ำเสมอ
Peter Ajtai

5

TDD มักจะถูกวัดต่อคุณภาพของรหัสแทนที่จะใช้เวลาและค่าใช้จ่าย อย่างไรก็ตามด้วยคุณภาพของรหัสที่ดีกว่านักพัฒนาและผู้ที่ทำงานกับพวกเขาสามารถทำงานได้ดีขึ้น (ใช้เวลาน้อยลงลดค่าใช้จ่ายลดความสุขและอื่น ๆ ) http://davidlongstreet.wordpress.com/2009/04/29/new-software-metric-wtfs-per-minute/

การทดสอบการเขียนนั้นดีมากสำหรับการช่วยในการตรวจสอบความถูกต้องของฟังก์ชั่นและการใช้งานโดยอัตโนมัติ วิดีโอหนึ่งที่ทำให้ฉันเชื่อว่าจะใช้ TDD (จริง ๆ แล้วคือ BDD, TDD ระดับสูง): http://video.google.com/videoplay?docid=8135690990081075324##

  • การเขียนการทดสอบการทำงานสามารถช่วยจำข้อบกพร่อง / ปัญหาก่อนหน้านี้ในระหว่างขั้นตอนการพัฒนา สมมติว่าคุณมีฐานรหัสขนาดใหญ่ ด้วยการทดสอบหน่วย /สเปคคุณจะต้องเห็น "การทดสอบทั้งหมดผ่าน" / "การทดสอบ 2 ล้มเหลวดูบรรทัด xyz" คุณต้องมีทีมผู้พัฒนาเพื่อทำการพัฒนาและทดสอบ หากไม่มีการทดสอบหน่วย / ข้อมูลจำเพาะคุณจะต้องเปรียบเทียบข้อความสั่งที่พิมพ์ด้วยคำสั่งที่คาดไว้ด้วยตนเองและติดตามด้วยตนเองว่าวิธีการใด / คลาสที่มีข้อบกพร่อง คุณอาจต้องการสองทีมแยกกัน (นักพัฒนาและผู้ทดสอบ)เพื่อทำสิ่งนี้

  • การทดสอบเป็นลายลักษณ์อักษรช่วยให้นักพัฒนาอธิบายความคืบหน้าและปัญหาที่ต้องเผชิญ

  • TDD ช่วยเติมเต็มการบำรุงรักษาการปรับตัวและความยืดหยุ่นของรหัส มันสนับสนุนให้นักพัฒนาเขียนชิ้นทดสอบที่มีขนาดเล็กและรวบรวมเข้าไว้ในกลุ่มทดสอบที่ใหญ่กว่า อีกวิธีหนึ่งรอบ (ส่วนหนึ่งของการปฏิบัติ refactoring) ยังทำงานโดยมีเงื่อนไขว่าเราได้เขียนการทดสอบที่เป็นของแข็ง ด้วยเหตุนี้เราจึงสามารถเขียนโค้ดแบบแยกส่วนได้อย่างดี

ด้วย TDD เรายินดีที่จะรู้ว่า:

  • ลูกค้าร้องขอเปลี่ยนแปลงข้อกำหนด (เป็นไปตามข้อกำหนด)
  • ค้นพบวิธีการเขียนโค้ดที่ดีขึ้น
  • เพื่อนร่วมทีมมีข้อเสนอแนะสำหรับการปรับปรุงรหัส
  • เราต้องอธิบาย / ส่งรหัสของเราให้ผู้อื่น

TDD นั้นน่าเบื่อเพราะกระบวนการพัฒนานั้นมีขั้นตอนเล็ก ๆ น้อย ๆ ดังนั้นมันจึงสามารถคาดเดาได้


4

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


นี่คือตัวสร้างโค้ดที่ปลูกเองหรือตัวสร้างโค้ดโอเพนซอร์ซที่มีให้ในรุ่นไวด์
Robert Harvey

มันเป็นวิธีการรีดด้วยมือโดยอ้างอิงจากคลาส. NET CodeDOM
TMN

3

การวัดระยะยาวที่สำคัญไม่เพียง แต่คุณภาพของรหัสและความมั่นใจของโค้ดเท่านั้น แต่ถึงแม้ moreso จะไม่ทำให้ทีมหมดความสนใจในการทดสอบ

มาตรการระยะสั้นคือ ROI ของการทดสอบอัตโนมัติ

ตัวอย่างเช่น: เมื่อสัปดาห์ที่แล้วฉันทำการเปลี่ยนแปลงรหัสมากกว่า 1,000 รายการเนื่องจากการเปลี่ยนแปลงภายในสถาปัตยกรรมเริ่มชุดทดสอบอัตโนมัติและเข้าสู่โหมดสลีป

การทดสอบใช้เวลา 28 นาทีในการทำงาน พวกเขาทั้งหมดผ่านไป การทดสอบที่ได้รับการยอมรับมากกว่า 40 แบบด้วยตนเองจะใช้เวลาประมาณ 6 ชั่วโมง

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

ไม่มีวิธีคำนวณ ROI ล่วงหน้าของการทดสอบอัตโนมัติเนื่องจากคุณไม่สามารถทราบได้อย่างแน่นอนว่าคุณจะต้องทำการทดสอบกี่ครั้ง

แต่สำหรับฉัน ROI ของการทดสอบอัตโนมัติเกือบจะไม่มีที่สิ้นสุด


1
โอ้มันอยู่ในจุดที่น่าสนใจ ฉันคิดว่าการตรวจสอบความถูกต้องของ DB ควรเป็นการทดสอบนอกหน่วย คุณทำการทดสอบแบบใดนอกเหนือจากการทดสอบหน่วยแบบอัตโนมัติ?
Wes

1
@Wes: การทดสอบใน TDD เรียกว่าการทดสอบ "หน่วย" แต่อย่าให้ชื่อที่โชคร้ายนั้น จำกัด ขอบเขตไว้ วัตถุประสงค์ของพวกเขาคือการทดสอบคุณสมบัติ คุณลักษณะอาจเป็น 'ฟังก์ชัน foo ส่งคืนค่า null เสมอ' หรืออาจเป็น 'เวลาแฝงของระบบโดยรวมภายใต้โหลดสูงสุดต้องน้อยกว่า 12 picoseconds'
Steven A. Lowe

0

มันสามารถช่วยได้มากในการ จำกัด การทดสอบหน่วยให้กับอัลกอริทึมที่ซับซ้อนกรณีที่สามารถสร้างได้โดยอัตโนมัติและการถดถอย

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

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

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