ความตั้งฉากของการทดสอบหน่วยเทียบกับความรัดกุมของการทดสอบหน่วย


14

ฉันกำลังเขียนบททดสอบสำหรับระบบบังคับเลี้ยวสำหรับวิดีโอเกม ระบบมีพฤติกรรมหลายอย่าง (หลีกเลี่ยงบริเวณนี้เนื่องจากเหตุผล A, หลีกเลี่ยงบริเวณนี้เนื่องจากเหตุผล B แต่ละคนเพิ่มบริบทเล็กน้อยลงในแผนที่ของภูมิภาคจากนั้นฟังก์ชั่นแยกต่างหากจะแยกวิเคราะห์แผนที่และสร้างการเคลื่อนไหวที่ต้องการ

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

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

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

อย่างไรก็ตามถ้าฉันทดสอบโดยตรงกับผลลัพธ์ของพฤติกรรมโดยเยาะเย้ยแผนที่แล้วแน่นอนว่าฉันมีเพศสัมพันธ์กับการใช้งานแน่นเกินไป? หากฉันสามารถรับการเคลื่อนไหวที่ต้องการจากแผนที่โดยใช้พฤติกรรมที่แตกต่างกันเล็กน้อยการทดสอบก็ควรผ่าน

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


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

คำตอบ:


10

ในโลกอุดมคติคุณจะต้องมีชุดการทดสอบหน่วยฉากฉากที่สมบูรณ์แบบซึ่งทั้งหมดนี้อยู่ในระดับเดียวกับสิ่งที่เป็นนามธรรม

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

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


ฉันเดาว่าประเด็นหลักของผู้เขียนคือคุณควรใช้สตับ / mocks หรือการใช้งานจริงสำหรับการทดสอบระดับสูงเหล่านี้
SiberianGuy

2

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

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

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


0

ฉันคิดว่าคุณพยายามทดสอบสิ่งที่ระดับสูงกว่าหน่วย

การทดสอบพฤติกรรมส่วนใหญ่จะต้องใช้สติปัญญาบางอย่างอยู่ข้างหลังเพื่อบอกว่ามันทำงานได้อย่างถูกต้องหรือไม่ สิ่งนี้ไม่สามารถทำได้อย่างง่ายดายโดยใช้การทดสอบอัตโนมัติ


นี่คือเหตุผลที่ฉันพูดถึงความรัดกุม ฉันสามารถเขียนการทดสอบหน่วยขนาดเล็กได้ง่ายมากเพื่อทดสอบโค้ดแต่ละบรรทัดภายในลักษณะการทำงานและทำได้ แต่ขึ้นอยู่กับการอ่านเอาต์พุตของฟังก์ชันการแยกวิเคราะห์แผนที่ ไม่มีการทดสอบพฤติกรรมของฉันที่มีขนาดใหญ่แต่ละคนทดสอบการทำงานของชิ้นเดียวของพฤติกรรม
tenpn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.