TL; DR
การเขียนแบบทดสอบที่ดีและมีประโยชน์นั้นยากและมีค่าใช้จ่ายสูงในภาษาซีพลัสพลัส นักพัฒนาที่มีประสบการณ์คุณสามารถแบ่งปันเหตุผลของคุณเกี่ยวกับอะไรและเวลาที่จะทดสอบ?
เรื่องยาว
ฉันเคยทำการพัฒนาที่ขับเคลื่อนด้วยการทดสอบทั้งทีมจริง ๆ แล้ว แต่มันก็ไม่ได้ผลสำหรับเรา เรามีการทดสอบมากมาย แต่ดูเหมือนว่าพวกเขาจะไม่ครอบคลุมกรณีที่เรามีข้อบกพร่องและการถดถอยจริงซึ่งมักจะเกิดขึ้นเมื่อมีการโต้ตอบหน่วยไม่ใช่จากพฤติกรรมที่แยกได้
นี่เป็นเรื่องยากมากที่จะทดสอบในระดับหน่วยที่เราหยุดทำ TDD (ยกเว้นส่วนประกอบที่ทำให้การพัฒนาเร็วขึ้น) และใช้เวลาเพิ่มการครอบคลุมการทดสอบการรวมแทน ในขณะที่การทดสอบหน่วยขนาดเล็กไม่เคยตรวจจับข้อบกพร่องจริง ๆ และเป็นเพียงค่าบำรุงรักษา แต่การทดสอบการรวมนั้นคุ้มค่ากับความพยายาม
ตอนนี้ฉันได้รับโปรเจ็กต์ใหม่และฉันสงสัยว่าจะลองทำอย่างไร มันเป็นแอพพลิเคชั่น C ++ / OpenGL ดั้งเดิมดังนั้นการทดสอบการรวมเข้าด้วยกันจึงไม่ใช่ทางเลือก แต่การทดสอบหน่วยใน C ++ นั้นค่อนข้างยากกว่าใน Java (คุณต้องทำสิ่งต่าง ๆ อย่างชัดเจนvirtual
) และโปรแกรมไม่ได้เน้นวัตถุมากดังนั้นฉันจึงไม่สามารถเยาะเย้ย / ทำอะไรบางอย่างได้
ฉันไม่ต้องการแยกออกจากกันและ OO-ize ทุกสิ่งเพียงเพื่อเขียนการทดสอบเพื่อประโยชน์ในการเขียนการทดสอบ ดังนั้นฉันถามคุณ: ฉันควรเขียนทดสอบอะไร เช่น:
- ฟังก์ชั่น / คลาสที่ฉันคาดว่าจะเปลี่ยนบ่อย?
- ฟังก์ชั่น / คลาสที่ยากต่อการทดสอบด้วยตนเอง?
- ฟังก์ชั่น / คลาสที่ง่ายต่อการทดสอบ?
ฉันเริ่มตรวจสอบฐานรหัส C ++ ที่น่านับถือเพื่อดูว่าพวกเขาดำเนินการทดสอบอย่างไร ตอนนี้ฉันกำลังดูโครเมี่ยมซอร์สโค้ด แต่ฉันพบว่ามันยากที่จะแยกเหตุผลการทดสอบออกจากโค้ด หากใครมีตัวอย่างที่ดีหรือโพสต์ว่าผู้ใช้ C ++ ยอดนิยม (คนจากคณะกรรมการผู้แต่งหนังสือ Google, Facebook, Microsoft, ... ) เข้าหาสิ่งนี้ได้อย่างไรนั่นจะเป็นประโยชน์อย่างมาก
ปรับปรุง
ฉันได้ค้นหาเส้นทางของฉันรอบ ๆ ไซต์นี้และเว็บตั้งแต่เขียนสิ่งนี้ พบสิ่งที่ดี:
- เมื่อใดจึงเหมาะสมที่จะไม่ทำการทดสอบหน่วย
- /programming/109432/what-not-to-test-when-it-comes-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
น่าเสียดายที่ทั้งหมดนี้เป็น Java / C # centric การเขียนการทดสอบจำนวนมากใน Java / C # ไม่ใช่ปัญหาใหญ่ดังนั้นประโยชน์มักจะมีมากกว่าค่าใช้จ่าย
แต่อย่างที่ฉันเขียนข้างต้นมันยากกว่าใน C ++ โดยเฉพาะอย่างยิ่งหากฐานรหัสของคุณไม่ดีดังนั้นคุณต้องทำเรื่องยุ่ง ๆ เพื่อให้ครอบคลุมการทดสอบหน่วยที่ดี ตัวอย่างเช่น: แอปพลิเคชันที่ฉันสืบทอดมามีGraphics
พื้นที่ชื่อที่เป็นเลเยอร์บาง ๆ เหนือ OpenGL เพื่อที่จะทดสอบเอนทิตีใด ๆ - ซึ่งทั้งหมดใช้ฟังก์ชั่นโดยตรง - ฉันต้องเปลี่ยนมันให้เป็นอินเทอร์เฟซและคลาสและฉีดเข้าไปในเอนทิตีทั้งหมด นั่นเป็นเพียงตัวอย่างเดียว
ดังนั้นเมื่อตอบคำถามนี้โปรดจำไว้ว่าฉันต้องลงทุนค่อนข้างมากสำหรับการเขียนข้อสอบ