นี่เป็นหัวข้อที่ยอดเยี่ยมและฉันชอบทั้งคำตอบจาก @KAndy และ @fschmengler
ฉันต้องการเพิ่มความคิดเพิ่มเติมที่ฉันพบว่ามีค่าเมื่อถามคำถามเช่น "ฉันควรทดสอบ X หรือไม่" หรือ "ฉันจะทดสอบ X ได้อย่างไร"
มีอะไรผิดพลาด?
- ฉันสามารถพิมพ์ผิดโง่ (เกิดขึ้นตลอดเวลา)
นี้มักจะไม่ปรับการเขียนการทดสอบ
- ฉันจะคัดลอกรหัสที่ฉันต้องการจากคอร์หรือโมดูลอื่นแล้วปรับมันตามความต้องการของฉันได้หรือไม่?
ฉันพบว่าสิ่งนี้เป็นสิ่งที่อันตรายมากที่มักทำอย่างนั้นให้แมลงตัวเล็ก ๆ ในกรณีนี้ฉันชอบเขียนแบบทดสอบถ้ามันไม่แพงเกินไป การทำให้การกำหนดค่าโมเดลต้นทางนั้นเป็นจริงจะทำให้ IMO มีความเสี่ยงมากขึ้น
- จะมีข้อขัดแย้งกับโมดูลอื่นได้หรือไม่?
เกือบจะใช้กับรหัสการกำหนดค่าเท่านั้น ในกรณีเช่นนี้ฉันต้องการทดสอบการรวมระบบที่บอกฉันว่าเกิดอะไรขึ้น
- Magento เปลี่ยน API ในการเปิดตัวในอนาคตหรือไม่?
ในกรณีนี้ไม่น่าเป็นไปได้มากเนื่องจากรหัสของคุณขึ้นอยู่กับส่วนต่อประสานเท่านั้น แต่ยิ่งมีชั้นเรียนที่เป็นรูปธรรมมากขึ้นหรือถ้ารหัสของฉันขยายคลาสหลักสิ่งนี้จะกลายเป็นความเสี่ยงที่อาจเกิดขึ้น
- PHP เวอร์ชันใหม่อาจทำลายรหัสของฉันได้ หรือบางทีฉันต้องการสนับสนุน PHP 5.6 สำหรับปีต่อ ๆ ไป
อีกครั้งไม่น่าเป็นไปได้สูงที่นี่ แต่ในบางกรณีฉันต้องการทดสอบเพื่อเตือนฉันฉันควรเปลี่ยนรหัสในอนาคตเพื่อใช้ไวยากรณ์ที่เข้ากันไม่ได้
การทดสอบรหัสมีราคาแพงแค่ไหน
นี่มีสองด้าน:
- ระยะเวลาและความพยายามในการเขียนการทดสอบ
- จำนวนความพยายามและเวลาที่ใช้ในการทดสอบชิ้นส่วนของรหัสที่ฉันจะเขียนด้วยตนเอง
ในระหว่างการพัฒนาโค้ดบางส่วนฉันมักจะต้องรันโค้ดที่ฉันเขียนบ่อยๆจนกว่าฉันจะพิจารณาเสร็จ หลักสูตรนี้ง่ายกว่ามากเมื่อใช้การทดสอบหน่วย
ในกรณีของคุณการเขียนการทดสอบนั้นราคาถูก ไม่ต้องใช้เวลาหรือความพยายามมากนัก @KAndy ถูกต้องที่รหัสทั้งหมดจะต้องได้รับการบำรุงรักษา แต่จากนั้นอีกครั้งไม่จำเป็นต้องเก็บรักษาการทดสอบทั้งหมด
นี่อาจเป็นตัวอย่างที่ฉันจะเขียนการทดสอบหน่วยเพียงเพื่อตรวจสอบว่าฉันไม่ได้ทำผิดพลาดโง่แล้วลบมันเมื่อเรียนเสร็จแล้ว หากการทดสอบไม่ได้ให้คุณค่าระยะยาวฉันคิดว่าการลบการทดสอบนั้นสมเหตุสมผล
คำถามนี้มีความสำคัญในแง่ของการเลือกประเภทการทดสอบที่จะเขียน: หน่วยหรือการรวมตัวอย่างเช่น
รหัสที่ฉันเขียนมีค่าขนาดไหน
หากโค้ดที่ฉันกำลังเขียนมีความสำคัญสำหรับบริการที่โมดูลจัดให้ฉันจะทดสอบโดยไม่คำนึงว่าเป็นเรื่องเล็กน้อย
หากเป็นเพียงวิธีการใช้งานยูทิลิตี้เล็ก ๆ น้อย ๆ เช่น UI โฟกัสและไม่ได้เป็นส่วนหนึ่งของตรรกะทางธุรกิจ
รหัสจะต้องเปลี่ยนหรือไม่
เมื่อเวลาผ่านไปฉันคุ้นเคยกับการครอบคลุมการทดสอบการเปลี่ยนรหัสที่ไม่มีการเปิดจะรู้สึกไม่ปลอดภัยมาก ซึ่งรวมถึงสิ่งที่ง่ายมากเช่นการเพิ่มตัวเลือกให้กับโมเดลต้นทาง แต่ยังรวมถึงสิ่งต่าง ๆ เช่นการย้ายคลาสไปยังโฟลเดอร์ / เนมสเปซอื่นหรือเปลี่ยนชื่อเมธอด
มีการทดสอบในสถานที่สำหรับการเปลี่ยนแปลงดังกล่าวมีค่า
มันต้องการเอกสารประกอบไหม?
การใช้รหัสยากแค่ไหน? ในตัวอย่างของคุณมันไม่สำคัญ แต่ในบางกรณีที่ซับซ้อนมากขึ้นการทดสอบนั้นดีมากสำหรับวัตถุประสงค์ด้านเอกสารสำหรับนักพัฒนาอื่น ๆ (หรือตัวฉันเองในอีกไม่กี่เดือน)
การสำรวจและการเรียนรู้
ถ้าฉันทำงานกับรหัสบางอย่างและฉันไม่แน่ใจว่าจะทดสอบมันอย่างไรฉันคิดว่ามันมีค่ามากที่จะเขียนการทดสอบ กระบวนการมักจะทำให้ฉันเข้าใจอย่างลึกซึ้งยิ่งขึ้นเกี่ยวกับสิ่งที่ฉันกำลังทำอยู่
นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับนักพัฒนาที่ยังคิดว่าตนเองกำลังเรียนรู้การทดสอบ
นี่เป็นตัวอย่างที่อาจทำให้การลบแบบทดสอบในภายหลังนั้นเป็นไปได้เนื่องจากค่าหลักที่ให้ไว้คือการเรียนรู้
วินัยและความเครียด
การเกาะติดกับห่วงสีแดง - เขียว - ตัวทำซ้ำช่วยให้ฉันไปอย่างรวดเร็ว โดยเฉพาะอย่างยิ่งภายใต้ความกดดัน ดังนั้นแม้ว่ารหัสบางส่วนจะไม่ได้รับการทดสอบจริง ๆ ฉันอาจยังคงติดตาม TDD โดยเฉพาะอย่างยิ่งหากโค้ดนั้นมีความสำคัญต่อการทดสอบ
สิ่งนี้ทำให้ฉันอยู่ในกระแสและตื่นตัว
จะทดสอบอะไรและอย่างไร
พิจารณาว่าคุณสามารถเขียนการทดสอบด้วยความละเอียดที่แตกต่างกันมาก
- ทดสอบค่าส่งคืนที่แน่นอน
นี่จะเป็นการทดสอบที่เข้มงวดมากซึ่งจะต้องมีการปรับเปลี่ยนทุกครั้ง คุณต้องการให้การทดสอบแตกตัวอย่างเช่นถ้าลำดับของรายการในอาร์เรย์ส่งคืนมีการเปลี่ยนแปลงหรือไม่?
- ทดสอบโครงสร้างของค่าส่งคืน
สำหรับโมเดลต้นทางสิ่งนี้สามารถตรวจสอบแต่ละอาร์เรย์ย่อยเป็นสองเรคคอร์ดหนึ่งรายการที่มีlabel
และอีกหนึ่งรายการมีvalue
คีย์
ArrayInterface
การตรวจสอบการดำเนินการในชั้นเรียน
- การทดสอบคลาสให้
getOptions()
แม้ว่าวิธีนั้นจะไม่ได้เป็นส่วนหนึ่งของอินเตอร์เฟสที่ใช้งาน
สำหรับแต่ละสิ่งที่เป็นไปได้ที่สามารถทดสอบได้ให้พิจารณาคุณค่าการบำรุงรักษาและค่าใช้จ่าย
สรุป
ในการสรุป: ไม่มีคำตอบเดียวที่แท้จริงสำหรับคำถามว่าควรมีการทดสอบโค้ดบางส่วนหรือไม่ คำตอบจะแตกต่างกันไปสำหรับนักพัฒนาทุกคนขึ้นอยู่กับสถานการณ์