เมื่อใดที่ฉันควรใช้วัตถุจำลอง


14

ฉันได้อ่านสิ่งต่าง ๆ มากมายเกี่ยวกับ TDD แต่ฉันยังมีข้อสงสัย ตัวอย่างเช่นฉันมีไดอะแกรมคลาสเหล่านี้:

ป้อนคำอธิบายรูปภาพที่นี่

มันเป็นตัวอย่างง่ายๆเพียงเพื่อเรียนรู้เกี่ยวกับ TDD และวัตถุจำลอง

ฉันควรเขียนแบบทดสอบใดก่อน ผลิตภัณฑ์จากนั้นLineและสุดท้ายสั่งซื้อ ? ถ้าฉันทำเช่นนั้นฉันควรใช้LineและProductเพื่อทดสอบคำสั่งซื้อหรือฉันควรใช้ Mock Objects? เมื่อใดที่ฉันควรใช้ Mock Objects ฉันควรใช้ UML กับ XP และ TDD หรือไม่

ฉันยังไม่ได้รับสิ่งเหล่านี้

คำตอบ:


10

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

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


อย่างที่ฉันพูดไปก่อนหน้านี้มันเป็นสถานการณ์ง่าย ๆ เพียงเพื่อเรียนรู้เกี่ยวกับวัตถุ TDD และจำลองจำลอง ... คำตอบที่ดีขอบคุณ แล้ว UML ล่ะ? ฉันควรหลีกเลี่ยงหรือไม่

@ โทมัสไม่จำเป็นต้องหลีกเลี่ยง UML มันไม่ได้ขัดแย้งกับ TDD UML นั้นดีมากสำหรับการแสดงภาพ / สื่อสารประเด็นการออกแบบ สิ่งนี้มีประโยชน์อย่างยิ่งในขั้นตอนการพัฒนาบางอย่าง อย่างไรก็ตามการออกแบบวิวัฒนาการและพยายามที่จะทำให้แผนภาพระบบ UML ที่สวยงามและมีรายละเอียดตรงกันกับรหัสสามารถเป็นภาระได้อย่างรวดเร็ว ดังนั้นอย่าลืมโยนทิ้งเมื่อคุณไม่ต้องการมันอีกแล้ว :-)
PéterTörök

1
@thomas, btw การประชุมที่นี่คือการถอนคำตอบที่คุณพบว่ามีประโยชน์โดยการคลิกที่ลูกศรขึ้นถัดจากคำตอบ :-)
PéterTörök

4

ฉันไม่เห็นความต้องการวัตถุจำลองที่นี่มากนัก ตามที่คนอื่น ๆ ชี้ให้เห็นคุณต้องการสิ่งเหล่านี้เป็นส่วนใหญ่หากการพึ่งพาอาศัยยากต่อการตั้งค่า

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


2

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


เนื่องจากผลิตภัณฑ์ไม่ได้ขึ้นอยู่กับ Line จึงไม่มีความจำเป็น (หรือวิธี) ในการใช้จำลองสำหรับ Line ที่นั่น เหมือนกันสำหรับ Line และ Order
PéterTörök

2

"TDD เป็นเทคนิคการออกแบบเบื้องต้นโดยมีผลข้างเคียงที่ทำให้มั่นใจได้ว่าซอร์สโค้ดของคุณผ่านการทดสอบอย่างละเอียด" - Scott W. Ambler

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

เกี่ยวกับการเยาะเย้ย หากคุณต้องการเยาะเย้ยฉันแนะนำให้คุณจำลองผลิตภัณฑ์เมื่อเขียนการทดสอบสำหรับ Line และ mock Line เมื่อทำการทดสอบคำสั่งซื้อ แต่มันอาจ overkill ที่นี่ ฉันเองพยายาม จำกัด การเยาะเย้ยให้มากที่สุดและใช้เพื่อแยกการพึ่งพาคลาสภายนอก (เช่นอินสแตนซ์ฐานข้อมูล)


2
ฉันมีไดอะแกรมคลาสง่ายๆ ...

-1 ดังนั้นการคิดถึงการออกแบบ (รวมถึงการขีดเขียนแผนภาพคลาส) ทำให้คุณไม่สามารถทำ TDD ได้? นั่นฟังดูผิดธรรมดา
Bjarke Freund-Hansen

1
@bjarkef: อ่านคำตอบของฉันอีกครั้งได้โปรด หากการออกแบบเป็นขั้นสุดท้ายคุณจะไม่สามารถใช้ TDD เพื่อขับการออกแบบซึ่งเป็นสิ่งที่เกี่ยวกับ TDD และฉันคิดว่านี่เป็นสิ่งที่ทำให้ OP สับสน: เขามีทางออกอยู่แล้วและตอนนี้พยายามเขียนการทดสอบ "การทดสอบใดที่ฉันควรเขียนก่อนสินค้าหรือคำสั่ง" คำถามนั้นไม่เกี่ยวข้องถ้าคุณเขียนการทดสอบก่อน
Martin Wickman

คุณจะตรวจสอบการออกแบบเป็นที่สิ้นสุดโดยไม่ต้องทดสอบหรือรหัสการผลิตใด ๆ ? สมมติว่าคุณต้องการสร้างสิ่งที่ใช้งานได้
JeffO

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