การเยาะเย้ยคืออะไร .
การเยาะเย้ยคืออะไร .
คำตอบ:
อารัมภบท: หากคุณมองขึ้นเป็นรูปธรรมจำลองในพจนานุกรมคุณจะพบว่าหนึ่งในคำจำกัดความของคำว่าเป็นสิ่งที่ทำเลียนแบบ
การเยาะเย้ยส่วนใหญ่จะใช้ในการทดสอบหน่วย วัตถุที่อยู่ภายใต้การทดสอบอาจมีการพึ่งพาวัตถุ (ซับซ้อน) อื่น ๆ เพื่อแยกพฤติกรรมของวัตถุที่คุณต้องการแทนที่วัตถุอื่น ๆ ด้วย mocks ที่จำลองพฤติกรรมของวัตถุจริง สิ่งนี้มีประโยชน์หากวัตถุจริงทำไม่ได้เพื่อรวมเข้ากับการทดสอบหน่วย
ในระยะสั้นการเยาะเย้ยคือการสร้างวัตถุที่จำลองพฤติกรรมของวัตถุจริง
บางครั้งคุณอาจต้องการที่จะแยกแยะความแตกต่างระหว่างเยาะเย้ยเมื่อเทียบกับstubbing อาจมีความขัดแย้งบางอย่างเกี่ยวกับเรื่องนี้ แต่คำจำกัดความของต้นขั้วของฉันเป็นวัตถุจำลอง "น้อยที่สุด" สตับใช้พฤติกรรมเพียงพอที่จะอนุญาตให้วัตถุภายใต้การทดสอบดำเนินการทดสอบ
จำลองเหมือนต้นขั้ว แต่การทดสอบจะตรวจสอบว่าวัตถุภายใต้การทดสอบเรียกว่าจำลองตามที่คาดไว้ ส่วนหนึ่งของการทดสอบกำลังตรวจสอบว่ามีการใช้งานจำลองอย่างถูกต้อง
ในการให้ตัวอย่าง: คุณสามารถสร้างฐานข้อมูลโดยการใช้โครงสร้างในหน่วยความจำง่าย ๆ สำหรับเก็บบันทึก วัตถุภายใต้การทดสอบสามารถอ่านและเขียนบันทึกลงในฐานข้อมูลต้นขั้วเพื่อให้สามารถดำเนินการทดสอบได้ สิ่งนี้สามารถทดสอบพฤติกรรมบางอย่างของวัตถุที่ไม่เกี่ยวข้องกับฐานข้อมูลและ stub ฐานข้อมูลจะถูกรวมไว้เพียงเพื่อให้การทดสอบทำงาน
หากคุณต้องการตรวจสอบว่าวัตถุภายใต้การทดสอบเขียนข้อมูลเฉพาะบางอย่างไปยังฐานข้อมูลคุณจะต้องจำลองฐานข้อมูล การทดสอบของคุณจะรวมการยืนยันเกี่ยวกับสิ่งที่เขียนไปยังฐานข้อมูลจำลอง
คำตอบอื่น ๆ อธิบายว่าการเยาะเย้ยคืออะไร ให้ฉันแนะนำคุณผ่านตัวอย่างต่างๆ และเชื่อฉันจริง ๆ แล้วมันง่ายกว่าที่คุณคิด
tl; drมันเป็นตัวอย่างของคลาสเดิม มันมีข้อมูลอื่น ๆ ที่ถูกฉีดเข้าไปเพื่อให้คุณหลีกเลี่ยงการทดสอบชิ้นส่วนที่ทำการฉีดและให้ความสำคัญกับการทดสอบรายละเอียดการใช้งานของชั้นเรียน
ตัวอย่างง่ายๆ:
class Foo {
func add (num1: Int, num2: Int) -> Int { // Line A
return num1 + num2 // Line B
}
}
let unit = Foo() // unit under test
assertEqual(unit.add(1,5),6)
อย่างที่คุณเห็นฉันไม่ได้ทดสอบ LineA นั่นคือฉันไม่ได้ตรวจสอบพารามิเตอร์อินพุต ฉันไม่ได้ตรวจสอบเพื่อดูว่า num1, num2 เป็นจำนวนเต็มหรือไม่ ฉันไม่มีข้อกล่าวหาใด ๆ
ฉันแค่ทดสอบเพื่อดูว่า LineB ( การใช้งานของฉัน) ให้ค่าที่เยาะเย้ย1
และ5
ทำตามที่ฉันคาดไว้หรือไม่
เห็นได้ชัดว่าในคำพูดจริงสิ่งนี้อาจซับซ้อนกว่านี้มาก พารามิเตอร์สามารถเป็นวัตถุที่กำหนดเองเหมือนคน, ที่อยู่, +
หรือรายละเอียดการดำเนินงานได้มากกว่าหนึ่งเดียว แต่ตรรกะของการทดสอบจะเหมือนกัน
สมมติว่าคุณกำลังสร้างเครื่องที่ระบุประเภทและยี่ห้อของอุปกรณ์อิเล็กทรอนิกส์เพื่อความปลอดภัยของสนามบิน เครื่องทำสิ่งนี้โดยการประมวลผลสิ่งที่เห็นด้วยกล้อง
ตอนนี้ผู้จัดการของคุณเดินเข้ามาและขอให้คุณทดสอบหน่วย
จากนั้นคุณในฐานะนักพัฒนาซอฟต์แวร์คุณสามารถนำวัตถุจริง 1,000 ชิ้นเช่น MacBook pro, Google Nexus, กล้วย, iPad ฯลฯ มาทดสอบและดูว่ามันใช้งานได้จริงหรือไม่
แต่คุณยังสามารถใช้วัตถุที่เยาะเย้ยเหมือน MacBook Pro ที่ดูคล้าย ๆ กัน (ไม่มีชิ้นส่วนภายในจริง) หรือกล้วยพลาสติกอยู่ข้างหน้า คุณสามารถช่วยตัวเองจากการลงทุนในแล็ปท็อป 1,000 เครื่องและกล้วยเน่าเปื่อย
ประเด็นคือคุณไม่ได้พยายามทดสอบว่ากล้วยปลอมหรือไม่ ไม่ทดสอบว่าแล็ปท็อปของปลอมหรือไม่ สิ่งที่คุณกำลังทำคือการทดสอบว่าเครื่องของคุณเมื่อมันเห็นกล้วยก็จะพูดnot an electronic device
และสำหรับ MacBook Pro Laptop, Apple
ก็จะพูดว่า: สำหรับเครื่องผลลัพธ์ของการตรวจจับควรเหมือนกันสำหรับอุปกรณ์อิเล็กทรอนิกส์ปลอม / เยาะเย้ยและอุปกรณ์อิเล็กทรอนิกส์จริง
ตรรกะดังกล่าวข้างต้นนำไปใช้กับการทดสอบหน่วยของรหัสจริงเช่นกัน นั่นคือฟังก์ชั่นควรทำงานแบบเดียวกันกับมูลค่าจริงที่คุณได้รับจากการป้อนข้อมูลจริง (และการโต้ตอบ) หรือเยาะเย้ยค่าที่คุณฉีดระหว่างการทดสอบหน่วย และเช่นเดียวกับที่คุณช่วยตัวเองจากการใช้กล้วยจริงหรือ MacBook ด้วยการทดสอบหน่วย (และการเยาะเย้ย) คุณช่วยตัวเองจากการทำสิ่งที่ทำให้เซิร์ฟเวอร์ของคุณส่งคืนรหัสสถานะ 500, 403, 200 และอื่น ๆ (บังคับให้ทำ เซิร์ฟเวอร์ของคุณให้เรียก 500 ได้ก็ต่อเมื่อเซิร์ฟเวอร์หยุดทำงานในขณะที่ 200 อยู่เมื่อเซิร์ฟเวอร์หยุดทำงานมันยากที่จะเรียกใช้การทดสอบที่เน้นเครือข่าย 100 ครั้งหากคุณต้องรอ 10 วินาทีอย่างต่อเนื่องระหว่างสลับเซิร์ฟเวอร์ขึ้นและลง) ดังนั้นคุณฉีด / จำลองการตอบสนองด้วยรหัสสถานะ 500, 200, 403 ฯลฯ และทดสอบหน่วย / ฟังก์ชั่นของคุณด้วยค่าที่ถูกฉีด / เยาะเย้ย
สมมติว่าคุณกำลังเขียนแอปพลิเคชัน iOS และมีการโทรผ่านเครือข่ายงานของคุณคือการทดสอบแอปพลิเคชันของคุณ เพื่อทดสอบ / ระบุว่าการโทรผ่านเครือข่ายทำงานตามที่คาดไว้หรือไม่ความรับผิดชอบของคุณ เป็นความรับผิดชอบของอีกฝ่าย (ทีมเซิร์ฟเวอร์) ในการทดสอบ คุณต้องเอานี้ (เครือข่าย) การพึ่งพาและยังยังคงทดสอบรหัสของคุณทั้งหมดที่ผลงานรอบมัน
การเรียกเครือข่ายสามารถส่งคืนรหัสสถานะอื่น 404, 500, 200, 303 ฯลฯ ด้วยการตอบสนอง JSON
แอปของคุณควรใช้งานได้สำหรับทุกคน (ในกรณีที่มีข้อผิดพลาดแอปของคุณควรจะทิ้งข้อผิดพลาดที่คาดไว้) สิ่งที่คุณทำกับการล้อเลียนคือคุณสร้าง 'จินตภาพ - คล้ายกับเครือข่ายจริง' (เช่นรหัส 200 กับไฟล์ JSON) และทดสอบรหัสของคุณโดยไม่ต้อง 'ทำการโทรเครือข่ายจริงและรอการตอบกลับเครือข่าย' คุณ hardcode ด้วยตนเอง / กลับการตอบสนองเครือข่ายสำหรับการตอบสนองเครือข่ายทุกชนิดและดูว่าแอปของคุณทำงานตามที่คุณคาดหวังหรือไม่ (คุณไม่เคยคิด / ทดสอบ 200 ด้วยข้อมูลที่ไม่ถูกต้องเพราะนั่นไม่ใช่ความรับผิดชอบของคุณความรับผิดชอบของคุณคือการทดสอบแอปของคุณด้วย 200 ที่ถูกต้องหรือในกรณีที่ 400, 500 คุณทดสอบว่าแอปของคุณมีข้อผิดพลาดหรือไม่)
การสร้างจินตภาพ - ซึ่งคล้ายกับของจริงเรียกว่าการเยาะเย้ย
ในการทำเช่นนี้คุณไม่สามารถใช้รหัสเดิม (รหัสเดิมของคุณไม่มีคำตอบที่แทรกไว้ล่วงหน้าใช่ไหม) คุณต้องเพิ่มบางสิ่งลงไปฉีด / ใส่ข้อมูลจำลองที่ไม่ต้องการใช้ตามปกติ (หรือเป็นส่วนหนึ่งของชั้นเรียน)
ดังนั้นคุณจึงสร้างอินสแตนซ์ของคลาสดั้งเดิมและเพิ่มอะไรก็ได้ (นี่คือเครือข่าย HTTPResponse, ข้อมูลหรือในกรณีที่เกิดความล้มเหลวคุณจะต้องผ่าน errorString, HTTPResponse ที่ถูกต้อง) ที่คุณต้องการจากนั้นทดสอบคลาสที่ เยาะเย้ย
เรื่องสั้น ๆ สั้น ๆ การเยาะเย้ยคือการลดความซับซ้อนและจำกัดสิ่งที่คุณกำลังทดสอบและทำให้คุณป้อนสิ่งที่เรียนขึ้นอยู่กับ ในตัวอย่างนี้คุณหลีกเลี่ยงการทดสอบเครือข่ายเรียกตัวเองและแทนการทดสอบหรือไม่แอปของคุณทำงานตามที่คุณคาดหวังกับผลการฉีด / การตอบสนองด้วย - เยาะเย้ยชั้นเรียน
คุณจะต้องทดสอบการตอบสนองของเครือข่ายแยกกัน
ตอนนี้คำถามที่ฉันมีอยู่ในใจเสมอคือ: สัญญา / จุดสิ้นสุดและโดยทั่วไปการตอบสนอง JSON ของ API ของฉันได้รับการปรับปรุงอย่างต่อเนื่อง ฉันจะเขียนการทดสอบหน่วยที่คำนึงถึงสิ่งนี้ได้อย่างไร?
ที่ซับซ้อนมากขึ้นเกี่ยวกับเรื่องนี้: รูปแบบการพูดให้ของต้องใช้คีย์ / username
ข้อมูลที่มีชื่อว่า คุณทดสอบและผ่านการทดสอบของคุณ 2 id
สัปดาห์ต่อมาเปลี่ยนชื่อแบ็กเอนด์ที่สำคัญในการ การทดสอบของคุณยังคงผ่าน ขวา? หรือไม่?
มันเป็นความรับผิดชอบของนักพัฒนาแบ็กเอนด์ที่จะปรับปรุง mocks มันควรเป็นส่วนหนึ่งของข้อตกลงของเราที่พวกเขาให้ปรับปรุง mocks หรือไม่?
คำตอบของปัญหาข้างต้นคือ: การทดสอบหน่วย + กระบวนการพัฒนาของคุณในฐานะนักพัฒนาฝั่งไคลเอ็นต์ควร / จะได้รับการตอบสนองที่เยาะเย้ยล้าสมัย หากคุณถามฉันได้อย่างไร คำตอบคือ:
แอปจริงของเราจะล้มเหลว (หรือไม่ล้มเหลวยังไม่มีพฤติกรรมที่ต้องการ) โดยไม่ใช้ API ที่อัปเดต ... ดังนั้นหากล้มเหลว ... เราจะทำการเปลี่ยนแปลงรหัสการพัฒนาของเรา ซึ่งนำไปสู่การทดสอบของเราอีกครั้งล้มเหลว .... ซึ่งเราจะต้องแก้ไขให้ถูกต้อง (อันที่จริงถ้าเราต้องทำกระบวนการ TDD อย่างถูกต้องเราจะไม่เขียนโค้ดใด ๆ เกี่ยวกับฟิลด์เว้นแต่ว่าเราจะเขียนแบบทดสอบ ... และดูว่ามันล้มเหลวแล้วไปและเขียนรหัสการพัฒนาจริงสำหรับมัน)
ทั้งหมดนี้หมายความว่าแบ็กเอนด์ไม่จำเป็นต้องพูดว่า: "เฮ้เราอัปเดต mocks" ... ในที่สุดมันก็เกิดขึ้นผ่านการพัฒนา / การดีบักโค้ดของคุณ ّ เพราะมันเป็นส่วนหนึ่งของกระบวนการพัฒนา! แม้ว่าแบ็กเอนด์จะให้คำตอบที่เย้ยหยันสำหรับคุณ แต่ก็ง่ายกว่า
จุดทั้งหมดของฉันคือ (ถ้าคุณไม่สามารถรับการตอบกลับ API ที่เยาะเย้ยโดยอัตโนมัติ) จำเป็นต้องมีการโต้ตอบกับมนุษย์เช่นการอัปเดตด้วยตนเองของ JSONs และมีการประชุมสั้น ๆ เพื่อให้แน่ใจว่าค่าของพวกเขาทันสมัย
ส่วนนี้ถูกเขียนขึ้นเนื่องจากการอภิปรายหย่อนในกลุ่มพบปะสังสรรค์ CocoaHead ของเรา
สำหรับ iOS devs เท่านั้น:
เป็นตัวอย่างที่ดีมากในการเยาะเย้ยนี้พูดคุยพิธีสารเชิงปฏิบัติโดยนาตาชา Muraschev เพียงข้ามไปยังเวลา 18:30 น. แม้ว่าสไลด์อาจจะไม่ซิงค์กับวิดีโอจริง 🤷♂️
ฉันชอบส่วนนี้จากการถอดเสียง:
เพราะนี่คือการทดสอบ ... เราไม่ต้องการที่จะทำให้แน่ใจว่า
get
ฟังก์ชั่นจากGettable
ที่เรียกว่าเพราะมันสามารถกลับมาและฟังก์ชั่นในทางทฤษฎีสามารถกำหนดอาร์เรย์ของรายการอาหารจากที่ใดก็ได้ เราต้องแน่ใจว่ามันถูกเรียกว่า;
มีคำตอบมากมายเกี่ยวกับ SO และโพสต์ที่ดีบนเว็บเกี่ยวกับการเยาะเย้ย ที่เดียวที่คุณอาจต้องการเริ่มค้นหาคือโพสต์โดย Martin Fowler Mocks Ar ไม่ใช่ Stubsที่เขาพูดถึงแนวคิดการเยาะเย้ย
ในวรรคหนึ่ง - การเยาะเย้ยเป็นเทคนิคหนึ่งอนุภาคเพื่อให้การทดสอบหน่วยของรหัสโดยไม่ต้องพึ่งพาพึ่งพา โดยทั่วไปสิ่งที่แตกต่างจากการเยาะเย้ยจากวิธีอื่นคือการจำลองวัตถุที่ใช้ในการแทนที่การอ้างอิงรหัสจะช่วยให้การตั้งค่าความคาดหวัง - วัตถุจำลองจะรู้วิธีที่มันถูกเรียกโดยรหัสของคุณและวิธีการตอบสนอง
คำถามเดิมของคุณพูดถึง TypeMock ดังนั้นฉันจึงทิ้งคำตอบไว้ด้านล่าง
TypeMock เป็นชื่อของที่กรอบเยาะเย้ยในเชิงพาณิชย์
มันมีคุณสมบัติทั้งหมดของกรอบการเยาะเย้ยฟรีเช่น RhinoMocks และ Moq รวมทั้งตัวเลือกที่มีประสิทธิภาพมากขึ้น
ไม่ว่าคุณจะต้องการ TypeMock หรือไม่ก็เป็นที่ถกเถียงกันอย่างมาก - คุณสามารถทำการเยาะเย้ยส่วนใหญ่ที่คุณต้องการด้วยการเยาะเย้ยห้องสมุดฟรีและหลายคนแย้งว่าความสามารถที่นำเสนอโดย TypeMock มักจะนำคุณออกจากการออกแบบ
เป็นคำตอบอื่นที่ระบุว่า 'TypeMocking' ไม่ใช่แนวคิดที่กำหนดไว้จริง แต่สามารถนำมาใช้เพื่อหมายถึงประเภทของการเยาะเย้ยที่ TypeMock เสนอให้โดยใช้ตัวสร้างโปรไฟล์ CLR เพื่อสกัดกั้นการเรียก. Net ณ รันไทม์ เช่นต้องการอินเตอร์เฟสหรือวิธีเสมือน)
จำลองเป็นวิธี / วัตถุที่จำลองพฤติกรรมของวิธีการ / วัตถุจริงในรูปแบบการควบคุม วัตถุจำลองใช้ในการทดสอบหน่วย
บ่อยครั้งที่วิธีการทดสอบเรียกบริการภายนอกอื่น ๆ หรือวิธีการภายใน สิ่งเหล่านี้เรียกว่าการพึ่งพา เมื่อการเยาะเย้ยการพึ่งพาอาศัยกันทำงานในลักษณะที่เรากำหนดไว้
ด้วยการอ้างอิงที่ถูกควบคุมโดย mocks เราสามารถทดสอบพฤติกรรมของวิธีการที่เราเข้ารหัสได้อย่างง่ายดาย นี่คือการทดสอบหน่วย
การเยาะเย้ยคือการสร้างวัตถุหลอกที่จำลองพฤติกรรมวัตถุจริงสำหรับการทดสอบ
วัตถุประสงค์ของการเยาะเย้ยประเภทคือการแยกการอ้างอิงเพื่อแยกการทดสอบไปยังหน่วยที่เฉพาะเจาะจง ต้นขั้วเป็นตัวแทนง่าย ๆ ในขณะที่ mocks เป็นตัวแทนที่สามารถตรวจสอบการใช้งาน กรอบการเยาะเย้ยเป็นเครื่องมือที่จะช่วยให้คุณสร้างสตับและ mocks
แก้ไข : เนื่องจากถ้อยคำต้นฉบับกล่าวถึง "การพิมพ์ดีด" ฉันรู้สึกว่านี่เกี่ยวข้องกับ TypeMock จากประสบการณ์ของฉันคำทั่วไปคือ "เยาะเย้ย" โปรดอย่าสนใจข้อมูลด้านล่างโดยเฉพาะบน TypeMock
TypeMock Isolator แตกต่างจากกรอบการเยาะเย้ยอื่น ๆ ส่วนใหญ่ซึ่งมันทำงานแก้ไข IL ของฉันได้ทันที ที่ช่วยให้มันจำลองประเภทและอินสแตนซ์ที่กรอบอื่น ๆ ส่วนใหญ่ไม่สามารถเยาะเย้ย ในการจำลองประเภท / อินสแตนซ์เหล่านี้ด้วยเฟรมเวิร์กอื่นคุณต้องจัดเตรียม abstractions ของคุณเองและจำลองเหล่านี้
TypeMock มอบความยืดหยุ่นที่ดีเยี่ยมโดยเสียค่าใช้จ่ายในสภาพแวดล้อมรันไทม์ที่สะอาด ในฐานะที่เป็นผลข้างเคียงของวิธีการที่ TypeMock ได้รับผลลัพธ์บางครั้งคุณจะได้รับผลลัพธ์ที่แปลกมากเมื่อใช้ TypeMock
ฉันคิดว่าการใช้กรอบการเยาะเย้ย TypeMock Isolator จะ TypeMocking
มันเป็นเครื่องมือที่สร้าง mocks สำหรับใช้ในการทดสอบหน่วยโดยไม่จำเป็นต้องเขียนโค้ดของคุณด้วย IoC ในใจ
หากการเยาะเย้ยของคุณเกี่ยวข้องกับการร้องขอเครือข่ายอีกทางเลือกหนึ่งคือการให้เซิร์ฟเวอร์ทดสอบจริงที่จะตี คุณสามารถใช้บริการนี้เพื่อสร้างคำขอและตอบกลับสำหรับการทดสอบของคุณ http://testerurl.com/