ฉันจะรู้ได้อย่างไรว่าฉันมีความครอบคลุมการทดสอบหน่วยเพียงพอที่จะลบการทดสอบการรวม?


15

ฉันทำงานในระบบเดิม (โดยที่ฉันหมายถึงมันเขียนโดยไม่มีการทดสอบ) เราได้ลองทดสอบระบบบางส่วนโดยการเขียนการทดสอบการรวมที่ทดสอบการทำงานจากภายนอก

สิ่งนี้ทำให้ฉันมั่นใจในการ refactor ส่วนของรหัสโดยไม่ต้องกังวลเกี่ยวกับการทำลายมัน แต่ปัญหาคือการทดสอบการรวมเหล่านี้จำเป็นต้องมีการปรับใช้ (2+ นาที) และหลายนาทีในการทำงาน นอกจากนี้พวกเขายังเจ็บปวดในการรักษา แต่ละรายการครอบคลุมรหัสหลายพันบรรทัดและเมื่อหนึ่งในนั้นหยุดพักอาจใช้เวลาหลายชั่วโมงในการดีบักสาเหตุ

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

ฉันจะรู้ได้อย่างไรว่าการทดสอบหน่วยที่ดีของฉันนั้นครอบคลุมการทดสอบการรวมที่ไม่ดีพอที่จะลบการทดสอบการรวมได้หรือไม่

คำตอบ:


18

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

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


3
+1 สำหรับการแนะนำการทดสอบเป็นไปโดยอัตโนมัติเนื่องจากนั่นนำไปสู่คำถามที่ชัดเจนว่า "ทำไมจึงต้องปิดการทดสอบอัตโนมัติ"

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

2
บางทีฉันควรเริ่มต้นคำถามใหม่สำหรับเรื่องนี้ แต่คุณแนะนำว่าเมื่อใดก็ตามที่การทดสอบการรวมกลุ่มล้มเหลวอย่างถูกกฎหมายฉันควรทราบวิธีการเขียนการทดสอบหน่วยที่ล้มเหลวและทำให้พวกเขาผ่านไปมาด้วย?
Daniel Kaplan

2
@tietyt: ใช่มันฟังดูเหมือนเป็นความคิดที่ดี การทดสอบหน่วยดี การทดสอบหน่วยสำหรับสิ่งที่คุณรู้ว่าเคยขาดมาก่อนดีกว่าแล้ว
Greg Hewgill

7

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


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

3
@tieTYT: การทดสอบบางอย่างผ่านทาง UI มักนำไปสู่โซลูชันที่ไม่เสถียร อย่างไรก็ตามการทดสอบโดย UI นั้นมีความสำคัญบางครั้งก็เป็นกรณีที่การทดสอบด้วยตนเองที่นี่มีความพยายามน้อยกว่าการพยายามทำให้การทดสอบนั้นเป็นแบบอัตโนมัติและทำให้มันเสถียร ดังนั้นเมื่อคุณคิดว่าเป็นกรณีนี้คุณอาจลบ "การทดสอบการรวม" ออกจากรายการการทดสอบอัตโนมัติและเพิ่มลงในแผนการทดสอบของการทดสอบด้วยตนเอง
Doc Brown

@DanielKaplan เป็นไปได้ไหมที่จะอัปเดตการทดสอบการรวมระบบเพื่อให้มีเสถียรภาพมากขึ้น? หากมันล้มเหลวเนื่องจากบางครั้งการเปลี่ยนแปลง HTML อาจเป็นไปได้ที่จะทดสอบบางอย่างเช่น "ชื่อผู้ใช้ปรากฏบนหน้าเว็บหลังจากเข้าสู่ระบบ" แทนที่จะเป็นชื่อที่เฉพาะเจาะจงมากขึ้นเช่น "ชื่อผู้ใช้ปรากฏใน div นี้หลังจากเข้าสู่ระบบ"
Jen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.