“ Stub” คืออะไร?


117

ดังนั้นตามปณิธานปีใหม่ของฉันเพื่อเข้าสู่ TDD มากขึ้นตอนนี้ฉันเริ่มทำงานกับRhino Mocksมากขึ้น

สิ่งหนึ่งที่ฉันกระตือรือร้นที่จะทำคือการทำให้แน่ใจว่าฉันเข้าใจสิ่งที่ฉันกำลังทำอยู่ดังนั้นฉันจึงต้องการตรวจสอบความเข้าใจของฉันเกี่ยวกับสิ่งที่ฉันได้เห็นจนถึงตอนนี้ (และฉันคิดว่ามันจะดีถ้าได้ขึ้นมาที่นี่ในฐานะ ทรัพยากร).

"Stub" คืออะไร?


6
ก่อนอื่นคุณถามคำถามจากนั้นให้คำตอบ?
empi

17
ตามที่ระบุไว้ในคำถาม - ฉันกำลังมองหาการตรวจสอบความเข้าใจของฉันว่าถูกต้องฉันต้องการให้คำตอบอยู่ที่นี่ (ไม่ว่าจะเป็นของฉันหรือไม่ก็ตาม) เพื่อจัดหาแหล่งข้อมูลเกี่ยวกับคำถามที่ถามมาก แต่ไม่ค่อยได้รับคำตอบ: )
Rob Cooper

42
นอกจากนี้การตอบคำถามของตัวเองยังระบุไว้ในคำถามที่พบบ่อยว่าเป็นวิธีที่ถูกต้องในการใช้เว็บไซต์ซึ่งอันที่จริงควรได้รับการสนับสนุน
Erik Forbes

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

คำตอบ:


113

Martin Fowler เขียนบทความที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้ จากบทความนั้น:

Meszaros ใช้คำว่า Test Double เป็นคำทั่วไปสำหรับวัตถุหลอกทุกชนิดที่ใช้แทนวัตถุจริงเพื่อวัตถุประสงค์ในการทดสอบ ชื่อนี้มาจากแนวคิดของ Stunt Double ในภาพยนตร์ (จุดมุ่งหมายประการหนึ่งของเขาคือการหลีกเลี่ยงการใช้ชื่อใด ๆ ที่มีการใช้กันอย่างแพร่หลายอยู่แล้ว) จากนั้น Meszaros ได้กำหนดประเภทของ double ไว้ 4 ประเภท:

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

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


2
แล้วของปลอมต่างกันอย่างไร? ตามที่คุณระบุไว้พวกเขามีบทบาทเดียวกันที่จะต้องดำเนินการไม่ใช่หรือ?
LKM

4
@LKM วัตถุปลอมคือวัตถุจริงที่ใช้ฟังก์ชันจริงและทำสิ่งต่างๆ Stubs เป็นเพียง "คำตอบสำเร็จรูป" เช่น ผลลัพธ์ JSON แบบฮาร์ดโค้ดที่เลียนแบบสิ่งที่จะส่งคืนจากเว็บเซิร์ฟเวอร์
user3344977

31

"ต้นขั้ว" คือการใช้งานอินเทอร์เฟซที่มีอยู่เพื่อให้ข้อมูล / การตอบสนองบางประเภท ตัวอย่างเช่น:

  • ชุดข้อมูล
  • รายชื่อผู้ใช้
  • ไฟล์ Xml

โดยปกติจะให้บริการโดยบริการอื่น (ไม่ว่าจะเป็น Web Service, แอปพลิเคชันอื่น, ฐานข้อมูล) แต่เพื่อปรับปรุงความสามารถในการทดสอบของโค้ดผลลัพธ์จะถูก "ปลอม"

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

สมบูรณ์แตกต่างกันไปMocksในการที่พวกเขาจะใช้ในการแสดงและทดสอบสถานะของวัตถุในขณะที่จำลองการทดสอบของการทำงานร่วมกัน


ขอบคุณสำหรับคำตอบ แต่ฉันยังไม่เข้าใจ: "การใช้งานอินเทอร์เฟซ" ??
BKSpurgeon

6

ฉันเชื่อว่า "ต้นขั้ว" มาจาก STartUpBlock ใช้เพื่ออ้างถึงบางส่วนของโค้ดที่สร้างขึ้นโดยอัตโนมัติเพื่อช่วยให้คุณซึ่งเป็นนักพัฒนาเริ่มต้นใช้งาน


1
ฉันไม่คิดว่านี่จะถูกต้อง อาจมาจากแนวปฏิบัตินี้ในการก่อสร้างบ้าน: hunker.com/12000314/what-is-a-stub-out
mattdm

3

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


คำตอบนี้จะดีกว่าถ้าอธิบายในรายละเอียดเพิ่มเติม: อะไรคือจุดประสงค์ของวิธีการต้นขั้ว? ใช้อย่างไร? ทำไมมันถึงสำคัญ?
Evan Weissburg

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

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

1
ไม่เป็นไรถ้าคุณเป็นผู้เรียนรู้ด้วยตนเองใน StackOverflow คุณไม่จำเป็นต้องโพสต์คำตอบเว้นแต่คุณจะแน่ใจ นี่ไม่ใช่ฟอรัมมาตรฐาน ดู: stackoverflow.com/tour
Evan Weissburg

1
ขอบคุณมากสำหรับคำแนะนำและคำแนะนำ ซาบซึ้งจริงๆ!
Nasserr

3

เมื่อเร็ว ๆ นี้ฉันเผชิญกับคำถามและทราบว่าการเปรียบเทียบระหว่างStubและDriverนี้ชัดเจนและเป็นประโยชน์มาก:

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

+ --------- + ------------------------------- + ------- ------------------------ +
| | Stub | ไดร์เวอร์ |
+ --------- + ------------------------------- + ------- ------------------------ +
| พิมพ์ | รหัสหุ่น | รหัสหุ่น |
+ --------- + ------------------------------- + ------- ------------------------ +
| ใช้ใน | บูรณาการจากบนลงล่าง | บูรณาการด้านล่าง |
+ --------- + ------------------------------- + ------- ------------------------ +
| วัตถุประสงค์ | เพื่ออนุญาตการทดสอบส่วนบน | เพื่อให้สามารถทดสอบส่วนล่าง |
| | ระดับของรหัสเมื่อ | ระดับของรหัสเมื่อ |
| | ระดับล่างของรหัสคือ | ระดับบนของรหัสคือ |
| | ยังไม่พัฒนา | ยังไม่พัฒนา |
+ --------- + ------------------------------- + ------- ------------------------ +
| ตัวอย่าง | A และ B เป็นส่วนประกอบ | A และ B เป็นส่วนประกอบ |
| | ก ---> B | ก ---> B |
| | | |
| | A ได้รับการพัฒนา | ยังต้องมีการพัฒนา. |
| | B ยังคงต้องพัฒนาต่อไป. | B ได้รับการพัฒนา |
| | ดังนั้นจึงใช้ต้นขั้ว | ดังนั้นจึงใช้ไดรเวอร์ |
| | แทนที่ B เพื่อเลียนแบบ | แทนที่ A เพื่อเลียนแบบ |
| | | |
| | A ---> Stub | คนขับ ---> B |
+ --------- + ------------------------------- + ------- ------------------------ +

จากความแตกต่างระหว่าง Stub และ Driver


0

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

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