กรอบการทดสอบหน่วยใดสำหรับเกมที่ใช้ c ++ [ปิด]


13

เครื่องมือการทดสอบแบบใดที่คุณรู้สึกว่าดีที่สุด? ให้กรอบ / ไลบรารีที่คุณเลือกคุณอาจพิจารณา:


หมายเหตุ: ในขณะนี้อาจเป็นคำถามทั่วไปเช่นเดียวกับใน SOฉันจะยืนยันว่าการพัฒนาเกมมักจะผูกพันกับกระบวนการทำงานที่เฉพาะเจาะจงซึ่งมีอิทธิพลต่อทางเลือกสำหรับการทดสอบ สำหรับมุมมองในระดับสูง, ดูคำถามทดสอบของเกมอัตโนมัติ


ในขณะที่ฉันไม่เห็นอะไรผิดปกติกับคำถามนี้ฉันคิดว่ามันจะได้ประโยชน์จากการทำ Community Wiki ตัวอย่างเช่น: gamedev.stackexchange.com/questions/480/…
Jesse Dorsey

ฉันทำมัน CW อย่างไรก็ตามฉันคิดว่าแนวทางในการตั้งคำถาม CW ดูเหมือนจะไม่ค่อยชัดเจนสำหรับฉันในฐานะผู้มาใหม่โดยเฉพาะอย่างยิ่งเนื่องจากเป็นที่ถกเถียงกันโดยทั่วไป ( meta.stackexchange.com/questions/55888 ) บางทีเราอาจระบุนโยบาย gamedev อย่างชัดเจนเกี่ยวกับเรื่องนี้ในคำถามที่พบบ่อย?
jmp97

คำตอบ:


7

ฉันพบว่าUnitTest ++ใช้งานง่ายมาก ฉันยังจะต้องลองamopควบคู่ไปกับมันซึ่งได้รับการกล่าวถึงว่าเป็นสหายที่ดีสำหรับ UnitTest ++ สำหรับการทำงานของวัตถุจำลอง มิฉะนั้นGoogle Mockเป็นตัวเลือกยอดนิยม นอกจากนี้คุณอาจต้องการอ่านบนUnitTest ++ และ Mock Objectsและวัตถุจำลอง

UnitTest ++ สามารถตั้งค่าด้วยวิธีการรวมอย่างต่อเนื่องของคุณเช่นกับฮัดสัน

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


UnitTest ++ เป็นกรอบการทดสอบเพียงอย่างเดียวที่คุณควรได้รับโดยเฉพาะอย่างยิ่งเนื่องจากมันง่ายต่อการแก้ไขและขยาย หากคุณพบว่าตัวเองกำลังเขียนโปรแกรม Java ในภายหลัง JUnit จะโจมตีคุณซ้ำแล้วซ้ำอีกโดยใช้ค้อนที่มีความไม่แน่นอนที่สุดที่จะแสดง
dash-tom-bang

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

4

โหวตอีกครั้งสำหรับUnitTest ++++ ง่ายมากที่จะรวมและรวบรวมสำหรับแพลตฟอร์มแบบฝังตัวของเราเป้าหมายได้อย่างง่ายดายตรงไปตรงมาและใช้งานง่าย เราได้รวมเข้ากับฮัดสันด้วย เราดูที่ GoogleTest แต่ปฏิเสธ (ฉันคิดว่ามันมีปัญหาในการรวบรวมสำหรับแพลตฟอร์มเป้าหมายของเรา) แต่มีชุดคุณลักษณะที่คล้ายกันและอาจเหมาะสำหรับคุณ

นอกจากนี้คุณอาจต้องการตรวจสอบกรอบการทดสอบควันบางประเภท จากประสบการณ์ของฉันมันยากที่จะได้รับความคุ้มครองการทดสอบที่เพียงพอสำหรับเกมที่มีการทดสอบหน่วยเพียงอย่างเดียว โดยเฉพาะอย่างยิ่งถ้าคุณกำลังแนะนำการทดสอบหน่วยกับ codebase ที่มีอยู่และแม้แต่ moreso สำหรับทีมขนาดใหญ่ การทดสอบควันจะเป็นการทดสอบในระดับสูงเช่น "ตรวจสอบให้แน่ใจว่าโหลดทุกระดับ" ทฤษฎีของฉันคือถ้าฉันมีการทดสอบทั้งสองแบบในบางครั้งพวกเขาอาจพบตรงกลาง :)


2

กลับมาเมื่อผมได้ทำงานใน C ++ (คำเตือน: นี่คือประมาณ 2005) ผมใช้แก้ไขเล็กน้อยรุ่นของTUT (แม่แบบทดสอบหน่วยกรอบ) ฉันชอบมันเพราะมันมีน้ำหนักเบามากซึ่งทำให้ง่ายต่อการปรับเปลี่ยนและหมายความว่าต้องใช้ "กาว" น้อยมากเมื่อเขียนข้อสอบ

นี่คือการดัดแปลงแบบง่าย ๆ อย่างหนึ่งที่ฉันทำซึ่งทำให้ผู้เขียน / ผู้ทำความสะอาดสามารถเขียนแบบทดสอบได้:

static int BogusFunction() { return __COUNTER__; } // Increment the __COUNTER__ to the correct position for the begining of the tests
#define TEST template<> template<> void object::test<__COUNTER__>()
#define ENSURE(msg, cond) ensure(msg, cond, __FILE__, __LINE__)
#define ENSURE_EQUALS(msg, actual, expected) ensure_equals(msg, actual, expected, __FILE__, __LINE__)
#define ENSURE_DISTANCE(msg, actual, expected, distance) ensure_distance(msg, actual, expected, distance, __FILE__, __LINE__)
#define FAIL(msg) fail(msg, __FILE__, __LINE__)

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

(ความสามารถในการทำเรียงลำดับของสิ่งนี้หมายถึงว่ามันสามารถทำเพื่อให้พอดีกับกระบวนการ TDD / CI ของคุณแทนที่จะบังคับให้คุณเพื่อให้พอดีกับมัน.)

นี่คือตัวอย่างทดสอบ (จาก command-stack จากโปรแกรมแก้ไขของฉัน):

TEST // Undoing a command
{
    cs.AddCommand(new TestCommand);
    cs.AddCommand(new TestCommand(od));

    ENSURE("Undo success", cs.Undo());
    ENSURE_EQUALS("Stack size", cs.size(), 2);
    ENSURE_EQUALS("Command's Undo() was called", od.undo, 1);
    ENSURE_EQUALS("Command's Redo() not called", od.redo, 0);

    ACommandStack::const_iterator it = cs.end();
    ENSURE("Command is redoable", cs.GetUndoPos() == --it);
}

(ในรหัสข้างต้นcsและodมีการติดตั้งต่อโมดูลและTestCommandเป็นวัตถุจำลอง)


2

เมื่อมาถึง C ++ ฉันได้พยายามและใช้กรอบ googletest, http://code.google.com/p/googletest/ ติดตั้งง่ายใช้งานง่ายและใช้งานได้ดี


2

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

ผมชอบการทดสอบ Google มันมีคุณสมบัติที่ดีที่สุดทั้งหมดของกรอบการทดสอบหน่วยล่าสุดในขณะที่ทำให้มันทั้งหมดอยู่ในส่วนต่อประสานที่มีลำธารน้อยที่สุด

ถัดไปในรายการของฉันคือBoost ทดสอบ API การทดสอบของ Google นั้นทันสมัยกว่า Boost.Test เล็กน้อย แต่ Boost Test ได้ทำงานที่ยอดเยี่ยมในการเพิ่มฟีเจอร์ใหม่ ๆ

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

ฉันชอบที่จะใช้คุณสมบัติขั้นสูง แต่ถ้าคุณเป็นมินิมัลลิสต์คุณจะไม่เห็นความแตกต่างระหว่างทั้งสาม เพื่อนร่วมงานของฉันส่วนใหญ่จะมีความสุขกับกรอบการทดสอบหน่วยที่รองรับการทดสอบการลงทะเบียนอัตโนมัติ (ในลักษณะที่เปิดเผย) และมีมาโคร CHECK_EQUALS (a, b) บางประเภท


1

ห้องสมุดทดสอบที่ฉันชอบคือ QuickCheck http://en.wikipedia.org/wiki/QuickCheck มีเวอร์ชันทดลองของ C ++ แต่มันดูหนักเกินไป แต่ถึงแม้จะไม่มีไลบรารี่เฉพาะ แต่หลักการก็ใช้งานง่าย

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

มันไม่ได้แทนที่การทดสอบหน่วยแบบดั้งเดิม (มันลดความจำเป็นในการทดสอบหน่วยที่อาจเกิดขึ้นได้หลายอย่าง) แต่มันเป็นวิธีที่ดีในการค้นหาข้อบกพร่องและช่วยทดสอบความเครียดกลยุทธ์การจัดสรรหน่วยความจำของฉัน (พร้อมกับ Valgrind) มันยอดเยี่ยมมากที่ได้เฝ้าดูการจัดสรรกว่าล้านครั้งออกมา Valgrind pure :)

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


0

ด้วย Java มีไลบรารีที่ดีมากมาย ... ไม่ใช่กรณีของ C ++

สำหรับผู้ใช้ C ++ มีเครื่องมือลูกโซ่จาก Kitware ที่น่าสนใจมาก:

  • CMake: สร้างเครื่องมือ
  • CDash: เครื่องมือการรวมอย่างต่อเนื่อง

Kitware เขียนรหัส C ++ สำหรับวิทยาการคอมพิวเตอร์

สำหรับโครงการส่วนบุคคลฉันใช้ไลบรารีทดสอบหน่วย Boost (บนแพลตฟอร์มเดสก์ท็อป) สำหรับการรวมอย่างต่อเนื่องฉันใช้ฮัดสัน:

  • ติดตั้งง่ายบน Tomcat
  • สคริปต์

0

ฉันจะทำกรอบสองTUT (ทดสอบหน่วยเทมเพลต) ; มันมีน้ำหนักเบาสุด ๆ และมีความยืดหยุ่นสูงไม่ต้องพูดถึงเรื่องการติดตั้งและใช้งานได้ง่าย (ส่วนหัวเดียวประกอบด้วยรหัสหลัก / การตั้งค่าเล็กน้อยและ 24 บรรทัดของรหัสทดสอบในภายหลังคุณจะต้องทำการทดสอบหน่วย) ฉันได้รวมเข้ากับbinfmtc (เรียกใช้โปรแกรม C ++ เป็นสคริปต์)สำหรับแม่แบบการสร้างต้นแบบอย่างรวดเร็ว / TDD / การเรียนรู้เพื่อความสำเร็จที่ยิ่งใหญ่รวมถึงการพัฒนาซอฟต์แวร์ฝังตัว เนื่องจากมันสามารถส่งออกไปยัง XML ได้จึงมีการประกบกับ Jenkins (CI) และ Sonar ในโครงการที่ต่อเนื่องของฉัน

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