ปัจจัยหนึ่งที่สำคัญที่ทำให้การทดสอบหน่วยที่มีประโยชน์มากคือการตอบรับอย่างรวดเร็ว
พิจารณาสิ่งที่เกิดขึ้นเมื่อคุณมีแอพของคุณเต็มไปด้วยการทดสอบการรวม / ระบบ / การทำงาน (ซึ่งเป็นสถานการณ์ที่เหมาะแล้วซึ่งห่างไกลจากความเป็นจริงในร้านค้าเพื่อการพัฒนาส่วนใหญ่) สิ่งเหล่านี้มักดำเนินการโดยทีมทดสอบเฉพาะ
- คุณส่งมอบการเปลี่ยนแปลง repo SCM
- บางครั้ง (อาจเป็นไปได้หลายวัน) หลังจากนั้นผู้ทดสอบได้รับการปล่อยตัวภายในใหม่และเริ่มการทดสอบ
- พวกเขาพบข้อบกพร่องและยื่นรายงานข้อผิดพลาด
- (ในกรณีที่เหมาะสมที่สุด) มีคนมอบหมายรายงานข้อผิดพลาดกลับมาให้คุณ
ทั้งหมดนี้อาจใช้เวลาเป็นวันหรือเป็นสัปดาห์ ถึงตอนนี้คุณได้ทำงานอื่น ๆ อยู่แล้วดังนั้นคุณจึงไม่มีรายละเอียดของรหัสที่เขียนไว้ในใจของคุณ ยิ่งกว่านั้นคุณมักจะไม่มีข้อพิสูจน์โดยตรงว่าข้อบกพร่องนั้นอยู่ที่ไหนดังนั้นจึงใช้เวลาพอสมควรในการค้นหาและแก้ไขข้อบกพร่อง
ในขณะที่การทดสอบหน่วย (TDD)
- คุณเขียนบททดสอบ
- คุณเขียนรหัสเพื่อตอบสนองการทดสอบ
- การทดสอบยังคงล้มเหลว
- คุณดูรหัสและโดยทั่วไปคุณมีประสบการณ์ "อุ๊ปส์" ในไม่กี่วินาที (เช่น "อุ๊ปส์ฉันลืมตรวจสอบเงื่อนไขนั้น!") จากนั้น
- แก้ไขข้อผิดพลาดทันที
ทั้งหมดนี้เกิดขึ้นในเรื่องของการนาที
นี่ไม่ได้เป็นการบอกว่าการทดสอบการรวมเข้าด้วยกัน / ระบบไม่มีประโยชน์ พวกเขาเพียงแค่ตอบสนองวัตถุประสงค์ที่แตกต่าง ด้วยการทดสอบหน่วยการเขียนที่ดีคุณสามารถตรวจจับข้อบกพร่องจำนวนมากในโค้ดก่อนที่จะเข้าสู่ขั้นตอนการรวมระบบซึ่งมีราคาแพงกว่ามากในการค้นหาและแก้ไข คุณมีสิทธิ์ที่จะต้องมีการทดสอบการรวมเพื่อจับข้อบกพร่องประเภทเหล่านั้นซึ่งยากหรือเป็นไปไม่ได้ที่จะจับด้วยการทดสอบหน่วย อย่างไรก็ตามในประสบการณ์ของฉันเหล่านั้นเป็นชนิดที่หายาก; ข้อบกพร่องส่วนใหญ่ที่ฉันเห็นมีสาเหตุมาจากการละเลยที่เรียบง่าย
ไม่ต้องพูดถึงว่าการทดสอบหน่วยยังทดสอบอินเทอร์เฟซของคุณสำหรับการใช้งาน / ความปลอดภัย ฯลฯ ดังนั้นจึงให้ข้อเสนอแนะที่สำคัญเพื่อปรับปรุงการออกแบบและ API ของคุณ IMHO ตัวใดที่สามารถลดโอกาสของข้อผิดพลาดในการรวมโมดูล / susbsystem ได้ง่ายขึ้นและยิ่งทำความสะอาด API ได้มากเท่าใดโอกาสที่จะเกิดความเข้าใจผิดหรือละเว้นน้อยลง
คุณมีประสบการณ์อย่างไรกับการทดสอบหน่วยอัตโนมัติการทดสอบการรวมอัตโนมัติและการทดสอบการยอมรับอัตโนมัติและจากประสบการณ์ของคุณสิ่งที่ให้ผลตอบแทนการลงทุนสูงสุด และทำไม?
ROI ขึ้นอยู่กับปัจจัยหลายอย่างอาจเป็นสิ่งสำคัญที่สุดของพวกเขาคือว่าโครงการของคุณเป็นสีเขียวหรือเป็นมรดก ด้วยการพัฒนากรีนฟิลด์คำแนะนำของฉัน (และประสบการณ์ที่ผ่านมา) คือทำการทดสอบรูปแบบ TDD ตั้งแต่ต้น ฉันมั่นใจว่านี่เป็นวิธีที่คุ้มค่าที่สุดในกรณีนี้
อย่างไรก็ตามในโครงการมรดกการสร้างความครอบคลุมการทดสอบหน่วยที่เพียงพอนั้นเป็นงานที่ใหญ่มากซึ่งจะช้ามากในการให้ผลประโยชน์ การพยายามครอบคลุมฟังก์ชันการทำงานที่สำคัญที่สุดนั้นมีประสิทธิภาพมากกว่าด้วยการทดสอบระบบ / ฟังก์ชันผ่าน UI ถ้าเป็นไปได้ (แอพ GUI บนเดสก์ท็อปอาจทดสอบได้ยากผ่านทาง GUI โดยอัตโนมัติแม้ว่าเครื่องมือสนับสนุนการทดสอบอัตโนมัติจะค่อยๆพัฒนาขึ้น ... ) สิ่งนี้จะช่วยให้คุณปลอดภัยอย่างหยาบ จากนั้นคุณสามารถเริ่มต้นสร้างการทดสอบหน่วยในส่วนที่สำคัญที่สุดของแอป
หากคุณต้องเลือกการทดสอบเพียงรูปแบบเดียวโดยอัตโนมัติในโครงการถัดไปของคุณ
นั่นเป็นคำถามเชิงทฤษฎีและฉันคิดว่ามันไร้ประโยชน์ การทดสอบทุกประเภทมีการใช้งานในกล่องเครื่องมือของวิศวกร SW ที่ดีและทั้งหมดนี้มีสถานการณ์ที่ไม่สามารถถูกแทนที่ได้