ข้อแก้ตัวหลักจากนักพัฒนาที่ไม่มีการทดสอบหน่วยที่ดีคือ "รหัสไม่ได้ถูกออกแบบในแบบทดสอบได้" ฉันพยายามที่จะเข้าใจประเภทของการออกแบบและรหัสที่ไม่สามารถทดสอบหน่วยได้
ข้อแก้ตัวหลักจากนักพัฒนาที่ไม่มีการทดสอบหน่วยที่ดีคือ "รหัสไม่ได้ถูกออกแบบในแบบทดสอบได้" ฉันพยายามที่จะเข้าใจประเภทของการออกแบบและรหัสที่ไม่สามารถทดสอบหน่วยได้
คำตอบ:
มีหลายปัจจัยที่อาจทำให้รหัสทดสอบได้ยาก ในกรณีนี้การปรับโครงสร้างใหม่จะช่วยในการปรับปรุงรหัสเพื่อให้สามารถทดสอบได้
ตัวอย่างของโค้ดที่อาจทดสอบได้ยาก:
function pGetDp_U(int i, int i2, string sText)
(รหัสตัวอย่างซึ่งใช้ชื่อตัวแปรเช่นโปรดทราบว่าการขาดสถาปัตยกรรมที่ชัดเจนนั้นไม่ทำให้การทดสอบหน่วยทำได้ยากเนื่องจากการทดสอบหน่วยเกี่ยวข้องกับส่วนเล็ก ๆ ของรหัส สถาปัตยกรรมที่ไม่ชัดเจนจะยังคงมีผลกระทบด้านลบต่อการรวมระบบและการทดสอบระบบ
มีหลายสิ่งที่ทำให้การทดสอบรหัสเป็นเรื่องยาก หลายคนบังเอิญทำให้รหัสยากที่จะรักษา:
ตัวอย่างทั่วไปของผู้ใช้รหัสไม่ต้องการทดสอบหน่วย:
โดยใช้กรอบการจำลองตัวอย่างทั้งหมดเหล่านี้สามารถทดสอบหน่วย เป็นเพียงการตั้งค่าการเปลี่ยนจำลองสำหรับการอ้างอิงภายใน
สิ่งที่ไม่สามารถทดสอบหน่วยได้อย่างแท้จริง:
มีบางพื้นที่ที่สามารถทำให้ยากต่อการเขียนการทดสอบหน่วยสำหรับ อย่างไรก็ตามฉันขอย้ำว่านั่นไม่ได้หมายความว่าคุณควรลดเทคนิคที่มีประโยชน์ออกจากมือเพียงเพราะพวกเขาอาจเพิ่มความซับซ้อนให้กับการทดสอบของคุณ เช่นเดียวกับการเขียนโค้ดใด ๆ ที่คุณควรทำการวิเคราะห์ของคุณเองเพื่อตรวจสอบว่าผลประโยชน์เกินค่าใช้จ่ายและไม่สุ่มสี่สุ่มห้ายอมรับสิ่งที่บางคนโพสต์แบบสุ่มในสุทธิ
ค่าใช้จ่ายสำหรับเกลียวส่วนใหญ่ไม่สามารถควบคุมได้เว้นแต่คุณจะรู้ว่าคุณกำลังทำ น่าเสียดายที่หลายคนมักไม่รู้วิธีการใช้เทคนิคเหล่านี้ในการลดสิ่งต่าง ๆ เช่นการทดสอบความซับซ้อน
ไม่มีสิ่งใดที่เป็นรหัสที่ไม่สามารถทดสอบได้ อย่างไรก็ตามมีบางตัวอย่างของรหัสที่เป็นจริงยากที่จะทดสอบ (จนถึงจุดที่อาจไม่คุ้มค่าความพยายาม):
การโต้ตอบของฮาร์ดแวร์ - หากรหัสจัดการกับฮาร์ดแวร์โดยตรง (ตัวอย่างเช่นเขียนไปที่การลงทะเบียนเพื่อย้ายอุปกรณ์ทางกายภาพ) ดังนั้นการทดสอบหน่วยอาจยากหรือมีราคาแพงเกินไป หากคุณใช้ฮาร์ดแวร์จริงสำหรับการทดสอบที่อาจได้รับราคาแพงเพื่อรับข้อเสนอแนะที่เหมาะสมในชุดควบคุมการทดสอบ (แต่มีอุปกรณ์มากกว่า!) และถ้าคุณไม่ทำคุณต้องเลียนแบบพฤติกรรมที่แน่นอนของวัตถุทางกายภาพ - ไม่มีเล่ห์เหลี่ยมเล็ก ๆ บางกรณี
การโต้ตอบกับนาฬิกา - ปกติแล้วจะง่ายกว่านี้เพราะมันเป็นไปได้ที่จะเยาะเย้ยฟังก์ชั่นนาฬิกาของระบบค่อนข้างเล็กน้อย แต่เมื่อคุณทำไม่ได้การทดสอบเหล่านี้จะไม่สามารถจัดการได้ - การทดสอบที่อิงตามเวลาจริงมักใช้เวลานานในการรันและจากประสบการณ์ของฉันพวกเขามักจะมีความเปราะบางเนื่องจากภาระของระบบทำให้สิ่งต่าง ๆ ใช้เวลานานกว่าที่ควร ทำให้การทดสอบ phantom ล้มเหลว
สามกลุ่มหลักของฉันคือ:
รหัสที่อาศัยบริการภายนอก
ระบบที่ไม่อนุญาตให้ผู้ทดสอบทำการแก้ไขสถานะโดยไม่ขึ้นกับแอปพลิเคชัน
สภาพแวดล้อมการทดสอบที่ไม่ทำซ้ำการตั้งค่าการผลิต
นี่คือสิ่งที่ฉันได้รับประสบการณ์มากที่สุดในฐานะนักพัฒนาที่เปลี่ยนวิศวกร QA