การทดสอบหน่วยผลรหัสหนักด้าน


10

ฉันเริ่มเขียนรหัส C ++ เพื่อเรียกใช้หุ่นยนต์และฉันไม่ทราบวิธีรวมการทดสอบหน่วยหากฉันสามารถทำได้ ฉันได้รับห้องสมุดที่อนุญาตให้สร้าง "คำสั่ง" สำหรับหุ่นยนต์ซึ่งมีกำหนดและดำเนินการโดยอัตโนมัติ กลไกในการสร้างคำสั่งเหล่านี้เป็นประเภทรองชั้นฐานคำสั่งพวกเขาให้และดำเนินการเสมือนvoid Initialize(), void Execute()และvoid End()วิธีการ ฟังก์ชั่นเหล่านี้ทำงานอย่างหมดจดสำหรับผลข้างเคียงซึ่งทำสิ่งต่าง ๆ กับหุ่นยนต์ (วิ่งมอเตอร์ยืดลูกสูบ ฯลฯ ) ด้วยเหตุนี้ฉันไม่เห็นที่ใดก็ได้ในการแนบการทดสอบหน่วยกับโค้ดขาดการเยาะเย้ยห้องสมุดทั้งหมดเพื่อให้ฉันสามารถตรวจสอบเสมือนก่อนและหลังสถานะของหุ่นยนต์ มีวิธีทดสอบหน่วยที่ไม่เป็นภาระมากเกินไปหรือไม่

แก้ไข

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


ฉันคิดว่าคุณสามารถยกเลิกการกระทำใด ๆ ที่คุณทำหุ่นยนต์ได้ใช่ไหม คุณไม่สามารถเลิกทำการทดสอบของคุณได้หรือไม่?
Neil

1
มันแย่มากที่ห้องสมุดไม่ได้ใช้การแต่งเพลงแทนการสืบทอดเพราะคุณสามารถล้อเลียนคลาสคำสั่งหากเป็นกรณีนี้
Robert Harvey

@ ไม่มีฉันไม่แน่ใจว่าสิ่งที่คุณถาม คุณสามารถเรียบเรียงคำถามใหม่ได้หรือไม่?
Will Kunkel

คำตอบ:


7

สิ่งที่ฉันจะทำในกรณีนี้คือแนะนำอินเทอร์เฟซ RobotControl ของฉันเองด้วยวิธีการที่สอดคล้องกับสิ่งที่อยู่ใน lib จริง

หลังจากทำสิ่งนี้แล้วฉันจะสร้างคลาส RobotControlImpl ซึ่งใช้อินเทอร์เฟซนี้กับ lib หุ่นยนต์ตัวจริง

คำสั่งที่ฉันจะเขียนนั้นจะไม่ขยายคลาสพื้นฐาน แต่ทำงานบนอินเตอร์เฟสที่คุณแนะนำแทน

วิธีนี้คุณสามารถเยาะเย้ย RobotControl ผ่านการเยาะเย้ยไปยังคำสั่งใด ๆ และตรวจสอบว่ามันเรียกว่าวิธีการที่ถูกต้องบนอินเตอร์เฟซ

ในแยงคุณจะส่งผ่าน implant จริงของ RobotControl ไปยังคำสั่งที่คุณใช้

ฉันไม่แน่ใจว่านี่คือสิ่งที่คุณมีอยู่ในใจและคิดว่ายุ่งยากหรือไม่?

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


2
+1 ไม่ชอบอินเทอร์เฟซหรือไม่ ทำด้วยตัวเอง
Neil

ดูเหมือนว่าคุณกำลังแนะนำให้ฉันแกล้งทำห้องสมุดทั้งหมด ฟังก์ชั่นเกือบทั้งหมดที่คำสั่งจะถูกเรียกนั้นอยู่ในไลบรารี
Will Kunkel

0

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

มันต้องใช้ "หน่วยทดสอบสร้าง" แยกต่างหากของรหัสของคุณ

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

จากนั้นคุณมีคำสั่งที่คุณสามารถโยนในกรอบการทดสอบของคุณเองที่เรียกใช้วิธีการเดียวกันกับที่ห้องสมุดหุ่นยนต์จะทำ

สิ่งนี้จะเกี่ยวข้องกับการขัดถูและเยาะเย้ย แต่ก็เป็นสิ่งที่หลีกเลี่ยงไม่ได้ในการออกแบบการทดสอบหน่วย

การเปลี่ยนชื่อคลาสพื้นฐานสามารถทำได้ด้วย #define หรืออาจจะต้องการ typedef

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