หนึ่งจะทำการทดสอบหน่วยในเครื่องมือเกมได้อย่างไร


23

สิ่งที่น่าละอายเป็นอย่างมากฉันไม่เคยเขียนแบบทดสอบหน่วยที่เหมาะสมมีเพียงโปรแกรมทดสอบขนาดเล็กที่ไม่มีการรวบรวมกันซึ่งฉันจะทิ้งหลังจากการทดสอบประสบความสำเร็จ ฉันไม่มีความคิดที่ชัดเจนว่าจะทำการทดสอบหน่วยในโครงการเกมอย่างไร (ภาษาของฉันคือ C ++)

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


คำถามที่น่าสนใจเมื่อคุณพัฒนาเอ็นจิ้นคุณจะทดสอบการใช้งานได้ง่าย แต่โครงการขนาดใหญ่ในการทดสอบเกม
Yevhen

2
ไม่ใช่เรื่องน่าอาย: การทดสอบหน่วยไม่ใช่เรื่องดีโดยอัตโนมัติ
o0 '

1
หากคุณไม่เคยลองใช้การทดสอบหน่วยนี่เป็นความอัปยศอย่างแน่นอน
Kristopher Johnson

คำตอบ:


18

ก่อนอื่นคุณต้องมีกรอบการทดสอบหน่วย ในอดีตผมเคยใช้UnitTest ++และGoogle ทดสอบ อดีตมีน้ำหนักเบามากและรุ่นหลังมีจุดเด่นมากกว่า แต่ค่อนข้างยุ่งยากกว่า มันทำงานร่วมกันได้ดีกับGoogle Mockหากคุณต้องการสิ่งนั้น มีตัวเลือกอื่น ๆ อีกมากมายแน่นอน: ดูรายการนี้ (โดยผู้เขียนในที่สุดของ UnitTest ++) และWikipediaเป็นต้น

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

สิ่งสำคัญคือต้องจำไว้ว่าการทดสอบแบบอัตโนมัติใด ๆ นั้นดีกว่าการทดสอบแบบอัตโนมัติ ดังนั้นคุณไม่ควรเครียดมากไปกว่าความจริงที่ว่าการทดสอบของคุณไม่ใช่ "การทดสอบหน่วยที่แท้จริง" และภูมิใจที่คุณมีการทดสอบ เฟรมเวิร์กการทดสอบหน่วยมักจะมีประโยชน์สำหรับการสร้างการทดสอบแบบ "ไม่ใช่หน่วย" เนื่องจากมันมีฟังก์ชันการทำงานสำหรับการทดสอบบรรจุภัณฑ์และการรายงานความล้มเหลวอย่างสม่ำเสมอ

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

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

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


3
If you have to [...] spend significantly more time writing the tests [...] than it took you to author the module... จากนั้นโมดูลของคุณซับซ้อนเกินไป ทำให้มันง่ายขึ้นในตอนนี้คุณจะขอบคุณตัวเองในอนาคต!
Jess Telford

3
@Jess โมดูลที่ยากต่อการทดสอบไม่จำเป็นต้องทำให้ง่ายขึ้น มีหลายพื้นที่ที่การทดสอบหน่วยไม่ได้ใช้เวลาอย่างคุ้มค่า ซึ่งรวมถึงกราฟิกซึ่งผลลัพธ์อาจแตกต่างกันมากและยังคงเป็นที่ยอมรับ รหัสที่ไม่น่าจะมีการเปลี่ยนแปลงในอนาคต หรือรหัสที่มีรูปแบบนามธรรมการออกแบบแบบคู่ที่จำเป็นในการอำนวยความสะดวกในการทดสอบหน่วยเป็นสิ่งที่น่าเกลียดมากผิดพลาดง่ายขึ้นมีประสิทธิภาพน้อยกว่าหรือใช้งานง่ายกว่า
Casey Rodarmor

@rodarmor - เห็นด้วย มีขนาดเลื่อนของสิ่งที่เหมาะสมและสิ่งที่ไม่เป็น เช่นเดียวกับชนิดเหล่านี้ของทุกคำตอบหนึ่งขนาดไม่พอดีทั้งหมด :)
เจสนาว

สำหรับ UnitTest ++ ไปgithub.com/unittest-cpp/unittest-cpp ทุกอย่างอื่นล้าสมัย
Markus


4

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

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

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

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