หน่วยทดสอบโครงการเกม C # / XNA


13

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

ในโลกธุรกิจ (บน Microsft web-dev stack) ASP.NET MVC กำลังเป็นที่นิยมอย่างมากเนื่องจากความง่ายในการทดสอบหน่วยวิธีการทำงานของอินเตอร์เฟส

ฉันสงสัยว่ารูปแบบการออกแบบใด (MVC, MVP, MVVM และอื่น ๆ ) ที่สามารถใช้เขียนเกมที่ตรรกะของเกมทั้งหมดสามารถทดสอบได้อย่างง่ายดาย เป็นไปได้หรือเป็นไปได้? ฉันเสียเวลาของฉันดีกว่าไหมในการสร้างแบบเต็มและเรียกใช้การทดสอบชนิด "รวม" แทนการทดสอบหน่วย?

โค้ดตัวอย่างจะดีมาก แต่การเขียนก็มีประโยชน์เช่นกัน

(ฉันพยายามเพิ่มแท็กการทดสอบหน่วย แต่ไม่จำเป็นต้องมีตัวแทน ... )

คำตอบ:


17

นี่เป็นบทความที่ดีที่ฉันพบว่าอธิบายสถาปัตยกรรมสำหรับการแยกฟังก์ชันการทำงานเพื่อให้ไม่เพียง แต่นำมาใช้ซ้ำได้ง่าย แต่ยังอาจทดสอบการทดสอบหน่วยได้ง่ายขึ้น:

http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

เกมบางเกมจะได้รับประโยชน์จากรูปแบบ MVC เกมกระดานเช่นเกมหมากรุกและไพ่เป็นสิ่งสำคัญ ในกรณีส่วนใหญ่อย่างไรก็ตามนี่เป็น overkill มาก

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

(สิ่งที่ดีเลิศจะถูกสร้างขึ้นในกรอบงานของบุคคลที่สามเพื่อให้คุณไม่ต้องเขียนหรือทดสอบ!)

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


คำตอบที่ดี. ฉันต้องการโพสต์บทความนั้น ๆ ด้วย ระบบองค์ประกอบของ Game Object เป็นวิธีที่ยอดเยี่ยมในการแยกลอจิกและสามารถทดสอบแต่ละหน่วยได้ อย่างไรก็ตามการทดสอบหน่วยใดที่ไม่สามารถทำได้คือการโต้ตอบที่ซับซ้อนของหลายเส้นทางของตรรกะเกมที่มีการโต้ตอบแบบเรียลไทม์ตามลำดับแบบสุ่ม นั่นเป็นเหมือนการพยายามทดสอบหน่วยพยากรณ์อากาศ :)
LearnCocos2D

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

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

เกือบสี่ปีและฉันรู้สึกว่าฉันพัฒนาความเข้าใจที่ดีขึ้นว่าทำไม "การทดสอบหน่วยภาพ" ทำงานได้ดี: การทดสอบหน่วยเป็นเครื่องมือในการพัฒนา โดยทั่วไปการทดสอบหน่วยอัตโนมัติสามารถบอกคุณได้ว่าสิ่งที่จะเสีย แต่การทดสอบหน่วยภาพสามารถช่วยให้คุณสำรวจอัลกอริทึมที่ซับซ้อนมากและช่วยให้คุณระบุได้อย่างรวดเร็วว่าเหตุใดบางอย่างจึงขาด (โดยเฉพาะเมื่อรวมกับการแก้ไขรหัสสด) บ่อยครั้งที่การทดสอบด้วยภาพสามารถระบุปัญหาที่คุณต้องคาดหวังในการทดสอบด้วยรหัสหรือปัญหาที่ไม่มีคำตอบ "ถูกต้อง" (เช่น: ปรับแต่ง)
Andrew Russell

และแนวคิดที่ว่าการทดสอบหน่วยจะต้องเรียกใช้ "บ่อยครั้งพอ" (เหมือนใน: เสมอในวิธีอัตโนมัติ) คือปลอม รหัสที่ไม่เปลี่ยนแปลงเห็นได้ชัดว่าไม่จำเป็นต้องมีการทดสอบอีกครั้ง และเมื่อรหัสจะถูกแก้ไขนักพัฒนาทำปรับเปลี่ยนควรจะทำดังนั้นในขณะที่ใช้ทดสอบสามารถใช้ได้ที่เหมาะสม (ภาพรหัสตามหรืออื่น ๆ ) เห็นได้ชัดว่ามีรหัสที่มีโปรไฟล์ความเสี่ยงบางอย่างที่การทดสอบอัตโนมัติเป็นการลงทุนที่คุ้มค่า แต่สถานการณ์ดังกล่าวหายากโดยเฉพาะอย่างยิ่งในการพัฒนาเกม
Andrew Russell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.