คุณใช้เวลาเท่าไหร่ในการทดสอบหน่วย


27

ใน บริษัท ที่ฉันเคยทำงานให้ผู้บริหารยืนยันว่าการครอบคลุมโค้ดด้วยการทดสอบหน่วยต้องเป็น 99% หรือมากกว่า ส่งผลให้มีการเขียนการทดสอบมากกว่าโค้ด เราใช้เวลา 3 วันในการเขียนแบบทดสอบสำหรับชั้นเรียนเดียวที่ต้องใช้เวลาทั้งวัน

อย่างไรก็ตามฉันได้เรียนรู้เกี่ยวกับ TDD เครื่องมือทดสอบแนวปฏิบัติและอื่น ๆ มากมาย

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

ตอนนี้เป็นของตนเองผมสงสัย - วิธีการมากเวลามันจำเป็นที่จะต้องใช้จ่ายในการทดสอบหน่วย? การพัฒนาส่วนใหญ่เป็น iPhone / Android ส่วนใดของรหัสที่ควรครอบคลุมในการทดสอบ


ใน บริษัท ก่อนหน้าของฉันมันเป็น Java EE, บั้งและเฟรม อย่างที่ฉันได้กล่าวไปตอนนี้มันเป็นการพัฒนา iPhone และ Android เป็นหลัก
Maggie

TDD หมายความว่าคุณเขียนการทดสอบก่อนรหัส ดูเหมือนว่านี่คือการทดสอบ "หลังจากข้อเท็จจริง" ซึ่งเป็นอย่างอื่น

ผู้จัดการไม่สนใจเทคนิคนี้หัวหน้าทีมของฉันยืนยันกับ TDD มันลงเอยด้วยการรวมกันของทั้งคู่ :)
แม็กกี้

Maggie คุณอาจพบว่าบทความนี้น่าสนใจ: fastcompany.com/magazine/06/writestuff.html

มี metrcis ในการประมาณเวลาบ้างไหม? เครื่องมือสำหรับรหัส JS / .NET?
hellboy

คำตอบ:


16

จำนวนการทดสอบหน่วยที่ต้องการขึ้นอยู่กับปัจจัยหลายประการ:

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

10

ในกลุ่มผลิตภัณฑ์ของเราเราตั้งเป้าหมายรหัสครอบคลุม 50-70% จากการทดสอบหน่วยและ 90% + ความครอบคลุมจากการทดสอบหน่วยและการทดสอบอัตโนมัติรวมกัน เวลาโดยทั่วไปในการเขียนการทดสอบหน่วยจะใช้เวลาประมาณ 1 วันสำหรับทุกฟีเจอร์ที่ใช้เวลาในการเขียนโค้ดลง 3-4 วัน แต่นั่นอาจแตกต่างกันไปตามปัจจัยหลายอย่าง

การครอบคลุมโค้ด 99% นั้นยอดเยี่ยม การทดสอบหน่วยดีมาก แต่ครอบคลุมรหัส 99% จากการทดสอบหน่วยเพียงอย่างเดียว ฉันพบว่ายากที่จะเชื่อว่าคุณจะได้รับความครอบคลุมมากจากการทดสอบหน่วยเพียงอย่างเดียว

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

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

TDD ทำให้คุณคิดในแง่ของส่วนต่อประสานและส่วนต่อประสาน คลาสเดี่ยวนั้นที่ใช้ UI, ระบบเครือข่ายและไฟล์ / io สำหรับฟีเจอร์เดียวอาจแบ่งได้ดีกว่าหลายคลาส - คลาสสำหรับเครือข่าย, สำหรับไฟล์ / io และ UI แบ่งเป็นการออกแบบตัวควบคุมโมเดล จากนั้นคุณสามารถใช้การทดสอบที่เหมาะสมสำหรับแต่ละรายการด้วยวัตถุจำลองอย่างง่ายสำหรับการอ้างอิง แน่นอนว่าทั้งหมดนี้ใช้เวลามากขึ้น ดังนั้นแทนที่จะใช้รหัส 1 วันและ 3 วันในการเขียนการออกแบบประเภทนี้อาจต้องใช้การเข้ารหัส 3 วันและการทดสอบการเขียน 1 วัน แต่รหัสจะสามารถบำรุงรักษาได้ดีกว่าและสามารถนำกลับมาใช้ใหม่ได้


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

2
นั่นคือเหตุผลที่คุณควรเขียนแบบทดสอบก่อน จากนั้นคุณสามารถค้นหาสถานที่ตามธรรมชาติที่ตรรกะนั้นติดกัน

10

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

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


3
และคุณดูไม่ดีเมื่อคุณแก้ไขบั๊ก A เพื่อแนะนำบั๊ก B & C เท่านั้น
JeffO

ขึ้นอยู่กับว่าจะทำการทดสอบ B และ C หรือไม่

"คุณจะใช้เวลาในการบำรุงรักษามากกว่าที่คุณคิดตอนนี้" โดยเฉพาะอย่างยิ่งเมื่อคำนึงถึงว่าผลิตภัณฑ์ SW มักจะมีอายุการใช้งานที่วางแผนไว้นานกว่าปกติ
PéterTörök

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

1
@Eran ดังนั้นคุณควรวางแผนสำหรับความล้มเหลวดังนั้นคุณไม่จำเป็นต้องใช้งบประมาณสำหรับการทดสอบ?

4

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

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


ใช่สำหรับฉันนี่เป็นความจริง (อันที่จริงฉันมักจะวนรอบระหว่างการทำงานกับการทดสอบและการทำงานกับรหัสผลิตภัณฑ์ทุก ๆ สองสามวินาทีไม่ใช่นาที) ดังนั้นฉันจึงพยายามทำการทดสอบ 100% ของเวลา
Jonathan Hartley

2

หากคุณจะไม่ใช้เวลาในการทดสอบคุณจะใช้เวลามากขึ้นในการดีบักรหัสสด
ดังนั้นใช้เวลามากเท่าที่จำเป็นสำหรับการทดสอบเพื่อครอบคลุมทั้งหมด (หรือ 99% ของรหัส)


4
ทำไมผู้คนถึงมีความหวาดระแวงในการดีบัก? หากคุณรู้ว่าเครื่องมือต่าง ๆ คุณจะพบปัญหาที่ทำให้การดีบักนานกว่า 5 นาที ปัญหาที่ยากต่อการตรวจแก้จุดบกพร่องส่วนใหญ่เกี่ยวข้องกับเธรด แต่การทดสอบหน่วยไม่มีประโยชน์อยู่ดี
Coder

3
@Coder เพราะผู้คนมีประสบการณ์และรู้ว่าการทดสอบนั้นมีประโยชน์มากกว่าการดีบักแบบตาบอด
OZ_

2
ขึ้นอยู่กับ การทดสอบหน่วยมักจะต่อต้านประสิทธิผลและเพิ่มความปลอดภัย และในรหัสที่มีโครงสร้างที่ดีคุณจะไม่ได้รับปัญหา "การดีบักตาบอด" คุณได้รับปัญหาคุณรู้ว่าจะมองที่ไหน ถ้าคุณทำไม่ได้ทำรหัส / ตรวจสอบการออกแบบที่สมบูรณ์ โปรดดูเพิ่มเติมที่: programmers.stackexchange.com/questions/86636/…
Coder

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

1
"ถ้าคุณรู้เครื่องมือต่าง ๆ คุณจะพบปัญหาบ่อยครั้งซึ่งใช้เวลาแก้ปัญหามากกว่า 5 นาที" - @Coder ฉันสงสัยว่าแอปพลิเคชันประเภทใดที่คุณกำลังดูอยู่
Kirk Broadhurst

2

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

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

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


คุณมีประสบการณ์เกี่ยวกับแอพมือถือหรือไม่? อัตราส่วนทดสอบ / พัฒนาที่ยอมรับได้สำหรับแอปพลิเคชันมือถืออย่างง่ายคืออะไร
Maggie

@ Maggie แต่น่าเสียดายที่ไม่ได้ (ดังนั้นถ้าฉันต้องการเขียนหนึ่งฉันอาจจะใช้เวลามากกว่าปกติในการทดสอบหน่วย :-)
PéterTörök
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.