ฉันจะทดสอบการแสดงผลหน่วยได้อย่างไร


19

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

ฉันจะเริ่มต้นด้วยตัวอย่างที่เป็นรูปธรรมเพื่อให้เราทราบว่าฉันต้องการทดสอบประเภทใด สมมติว่าฉันต้องการสร้างคิวบ์ยูนิตที่หมุนรอบแกนบางส่วนและฉันต้องการให้แน่ใจว่าสำหรับเฟรมจำนวนหนึ่งเฟรมแต่ละเฟรมจะแสดงผลอย่างถูกต้อง

ฉันจะสร้างกรณีทดสอบอัตโนมัติได้อย่างไร โดยเฉพาะอย่างยิ่งฉันยังสามารถเขียนกรณีทดสอบก่อนที่จะเขียนรหัสใด ๆ เพื่อแสดงผล cube (ตามวิธีปฏิบัติ TDD ตามปกติ) เหนือสิ่งอื่นใดฉันต้องการตรวจสอบให้แน่ใจว่าขนาดตำแหน่งและการวางแนวของลูกบาศก์ แก้ไขในแต่ละเฟรมที่แสดงผล ฉันอาจต้องการตรวจสอบให้แน่ใจว่าสมการแสงในเฉดสีของฉันนั้นถูกต้องในแต่ละเฟรม

วิธีเดียวที่มีประโยชน์จากระยะไกลสำหรับสิ่งนี้ที่ฉันได้พบเกี่ยวข้องกับการเปรียบเทียบผลลัพธ์ที่แสดงผลไปยังเอาต์พุตอ้างอิงซึ่งโดยทั่วไปจะกีดกันการฝึกฝน TDD และยุ่งยากมาก

ฉันสามารถทำตามข้อกำหนดอื่น ๆ ที่ต้องการได้ แต่ฉันเกรงว่าสิ่งที่ฉันได้ระบุไว้ไม่สามารถเข้าถึงได้


3
ปัญหาทั้งหมดที่นี่คือกรณีทดสอบของคุณจะถูกกำหนดโดยผลลัพธ์ที่ดี แต่เกิดอะไรขึ้นถ้าเอาท์พุทที่เป็นรถ (บวกเท็จ)? ไม่ว่าฉันจะเริ่มด้วยการตรวจสอบ wireframes ก่อน จากนั้นย้ายไปยังฉากที่แสดงผลล่วงหน้าและเลื่อนออกไปในที่สุด (หากคุณใช้ฉากนั้น) คุณสามารถ XOR ภาพทั้งหมดเพื่อทำการเปรียบเทียบอย่างรวดเร็ว (ผ่านสีดำทั้งหมด) GPU เป็นพื้นที่ที่ไม่ดีในการใช้ TDD แต่ถ้าคุณคิดอะไรที่ฉลาดฉันก็อยากจะรู้
Jonathan Dickinson

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


@ อดัมขอบคุณสำหรับการแบ่งปัน แต่น่าเสียดายที่มันวิธีออกจากการเข้าถึงสำหรับอินดี้อย่างผมทำงานเกี่ยวกับเกมมือถือ :) นอกจากนี้ยังล้มเหลวที่สุดของความต้องการขั้นพื้นฐานของฉัน
notlesh

@ อดัมคุณควร 'ตอบ' ลิงก์นั้นอย่างแน่นอน นวนิยายค่อนข้างมาก
Jonathan Dickinson

คำตอบ:


8

ดูเหมือนว่าจะเป็นการใช้งานที่ดีของเฟรมเวิร์กการทดสอบการอนุมัติหรืออะไรทำนองนั้น

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

เนื่องจากคุณใช้ OpenGL ฉันถือว่าการอนุมัติจะไม่เหมาะกับคุณโดยตรง แต่แนวคิดนั้นฟังดูดี เพียงตรวจสอบแฮชของไฟล์และหากมันแตกต่างกันแสดงความล้มเหลวในโปรแกรมดูภาพ diff ที่เหมาะสม (เช่นโปรแกรม diff ภาพ) หากคุณอนุมัติเวอร์ชันใหม่ให้อัปเดตไฟล์ "อนุมัติ" เพื่อให้ตรงกับผลลัพธ์ใหม่


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

การทดสอบการอนุมัติไม่ใช่การทดสอบอัตโนมัติ
zwcloud

@zwcloud: คุณหมายถึงอะไร มันเป็นแบบอัตโนมัติเมื่อมีการเขียนเช่นเดียวกับการทดสอบใด ๆ เป็นเพียงการอนุมัติครั้งแรกเป็นส่วนหนึ่งของกระบวนการเขียน
John Gietzen

@JohnGietzen ฉันไม่เข้าใจว่าจากคำตอบของคุณ ฉันคิดว่าคุณควรอธิบายแนวคิดของการทดสอบการอนุมัติให้ชัดเจนยิ่งขึ้น ฉันจะลบ downvote เมื่อคำตอบอัพเดทแล้ว
zwcloud

6

ฉันไม่ได้เข้าสู่ธุรกิจเกมดังนั้นโปรดรับรู้ความคิดที่โง่และไร้เดียงสา

สำหรับฉันแล้วการทดสอบการเขียนที่เปรียบเทียบภาพที่แสดงเต็มนั้นไม่ใช่การทดสอบหน่วยแต่เป็นการทดสอบการรวมแบบเต็มเพราะทุกอย่างต้องทำงานได้ดีสำหรับการทดสอบที่ประสบความสำเร็จ

แล้วชั้นกลางที่คุณสามารถตรวจสอบได้ว่าทุกอย่างเรียบร้อยดี มีสองสิ่งที่อยู่ในใจของฉัน:

  1. อย่าวาดโดยตรง แต่ออกคำสั่งสตรีมที่เปลี่ยนเป็นการแสดงการโทรไปตามทาง สตรีมคำสั่งสามารถตรวจสอบความถูกต้องได้ นี่ไม่ใช่การทดสอบแบบครบวงจรแต่คุณต้องการการทดสอบหน่วยไม่ใช่การทดสอบแบบรวม

  2. นี่คือรูปแบบที่แตกต่างกันใน 1. ตัด OpenGL จับการโทรทั้งหมดถอดสิ่งนี้ลงไปที่สิ่งที่คุณต้องการทดสอบและตรวจสอบว่าเอาต์พุตยังตรงกันหรือไม่ OpenGL กระดาษห่อสามารถจะตรวจสอบตัวเองหากกำหนดค่าอย่างถูกต้องและจะกลายเป็นเยาะเย้ย


3

ปัญหาคือว่าเอ็นจิ้น 3 มิติไม่จำเป็นต้องแสดงภาพบิตต่อบิต บางเวย์สามารถทนได้ตราบเท่าที่สิ่งประดิษฐ์ที่เกิดจากมันไม่สามารถมองเห็นได้ พื้นผิวที่มืดกว่าที่คาดไว้ 1% นั้นไม่ใช่ปัญหาร้ายแรง ... โดยปกติ ภายใต้เงื่อนไขบางอย่างมันอาจเป็นสิ่งประดิษฐ์ภาพ และนั่นคือปัญหา: มันยากที่จะตัดสินสำหรับการทดสอบอัตโนมัติซึ่งผู้ชมมนุษย์จะสังเกตเห็นสิ่งประดิษฐ์และสิ่งใด ยังคงสามารถใช้การทดสอบอัตโนมัติสำหรับการตรวจสอบสติอย่างง่ายเมื่อใช้กับรูปทรงเรขาคณิตที่ง่ายมาก

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

เมื่อการทดสอบบางอย่างล้มเหลวหลังจากเปลี่ยนไปใช้เอ็นจิ้นกราฟิคผู้ทดสอบมนุษย์ควรเปรียบเทียบผลลัพธ์กับรูปภาพอ้างอิงและตัดสินด้วยตนเองหากผลลัพธ์ใหม่ดูดีเหมือนก่อน (หรือดีกว่า) เมื่อเป็นกรณีนี้การทดสอบควรเปลี่ยนเพื่อเปรียบเทียบกับผลลัพธ์ใหม่ที่ได้รับการปรับปรุง

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

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