มันโอเคที่จะหลีกเลี่ยงการทดสอบคลาสพื้นฐานหรือไม่


15

ฉันมีคลาสพื้นฐานพร้อมกับจำนวนที่เหมาะสมของ "การเขียนโปรแกรมเมตา" เพื่อให้ความยืดหยุ่น / นามธรรมมันต้องค่อนข้างทั่วไป

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

ตกลงหรือข้ามการทดสอบคลาสพื้นฐานหรือไม่


1
สิ่งหนึ่งที่บางครั้งฉันทำเมื่อฉันเริ่มถามตัวเองคำถามนี้คือพยายามที่จะทำลายรหัส โยนอินพุตที่ไม่ถูกต้องใส่ค่ากำหนดผิด ฯลฯ
Zymus

คำตอบ:


31

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

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

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

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


ใช่ฉันเห็นด้วยกับการทดสอบหน่วยโดยตรงในชั้นฐานสำหรับวิธีการที่กำหนดไว้อย่างเป็นรูปธรรมมากขึ้น สิ่งที่ฉันไม่ต้องการทำคือทดสอบการเขียนโปรแกรมเมตาทั้งหมดตั้งแต่การทดสอบหน่วยในคลาสย่อยโดยนัยเป็นการทดสอบสิ่งนั้น
นาธาน

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

@MichaelT: อ๋อ คำตอบของฉันดูเหมือนว่าฉันมีความคิดเห็นที่ต่างออกไปไหม
Doc Brown เมื่อ

@DocBrown ไม่ได้เลย - คุณพูดชัดเจนประเด็นนั้น ฉันแค่เพิ่มคำอธิบายเพิ่มเติมที่ฉันจะเขียนในคำตอบของฉันเอง (ถ้าคุณยังไม่ได้ระบุไว้) ฉันไม่ต้องการเขียนคำตอบที่จะเริ่มต้นขึ้น "ฉันเห็นด้วยกับทุกสิ่งที่หมอพูด แต่ต้องการโทรออกโดยเฉพาะและเขียนเพิ่มเติมเกี่ยวกับ ... "

2

การทดสอบอัตโนมัติถูกสร้างขึ้นเพื่อประโยชน์ของโปรแกรมเมอร์โปรแกรมเมอร์ไม่ได้ถูกสร้างขึ้นเพื่อให้บริการการทดสอบ

เรามีการทดสอบเพื่อทำให้เรามีประสิทธิผลมากขึ้นและเพื่อลดจำนวนของ "ปัญหา" ที่ลูกค้าร้องเรียน

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

จากนั้นเราจะถูกถามว่าการทดสอบจะทำให้คุณมีประสิทธิผลมากขึ้นหรือไม่ สิ่งนี้สามารถเกิดขึ้นได้สองสามวิธี

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

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

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