โรงเรียน TDD ในลอนดอนและชิคาโกมีอะไรบ้าง?


88

ฉันเคยได้ยินเกี่ยวกับสไตล์ลอนดอนเทียบกับสไตล์ชิคาโก (บางครั้งเรียกว่าสไตล์ดีทรอยต์) ของการทดสอบการพัฒนาขับเคลื่อน (TDD)

การประชุมเชิงปฏิบัติการของกลุ่มผู้ใช้ Utah Extreme Programming:

สไตล์การโต้ตอบ TDD เรียกอีกอย่างว่าสไตล์ mockistหรือสไตล์ลอนดอนหลังจากคลับ Extreme Tuesday ของกรุงลอนดอนซึ่งเป็นที่นิยม มันมักจะแตกต่างกับดีทรอยต์สไตล์หรือคลาสสิก TDD ซึ่งเป็นรัฐมากขึ้น

การประชุมเชิงปฏิบัติการ Jason Gorman :

การประชุมเชิงปฏิบัติการครอบคลุมทั้งโรงเรียนชิคาโกของ TDD (รัฐตามการทดสอบพฤติกรรมและรูปสามเหลี่ยม) และโรงเรียนในกรุงลอนดอนซึ่งมุ่งเน้นเพิ่มเติมเกี่ยวกับการทดสอบการทำงานร่วมกันเยาะเย้ยและ TDD แบบ end-to-end โดยเน้นเฉพาะในการออกแบบความรับผิดชอบขับเคลื่อนและบอกว่าอย่าถามวิธีการOOเมื่อเร็ว ๆ นี้ได้รับความนิยมอีกครั้งโดย Steve Freeman's และ Nat Pryce's Software ที่มุ่งเน้นการเติบโตเชิงวัตถุที่แนะนำโดยการทดสอบหนังสือ

โพสต์Classic TDD หรือ "London School"? โดย Jason Gorman มีประโยชน์ แต่ตัวอย่างของเขาทำให้ฉันสับสนเพราะเขาใช้สองตัวอย่างที่แตกต่างกันแทนที่จะเป็นตัวอย่างหนึ่งที่มีทั้งสองวิธี ความแตกต่างคืออะไร? คุณใช้แต่ละรูปแบบเมื่อใด

คำตอบ:


76

สมมติว่าคุณมีคลาสที่เรียกว่า "บัญชีแยกประเภท" วิธีที่เรียกว่า "คำนวณ" ที่ใช้ "เครื่องคิดเลข" เพื่อทำการคำนวณประเภทต่าง ๆ ขึ้นอยู่กับอาร์กิวเมนต์ที่ส่งผ่านไปยัง "คำนวณ" เช่น "ทวีคูณ (x, y)" หรือ "ลบ ( x, y) "

ตอนนี้สมมติว่าคุณต้องการทดสอบสิ่งที่เกิดขึ้นเมื่อคุณเรียกใช้ ledger.calculate ("5 * 7")

โรงเรียนที่ London / Interaction จะให้คุณยืนยันว่าเครื่องคิดเลขหลายใบ (5,7) ถูกเรียกหรือไม่ เฟรมเวิร์กการเยาะเย้ยต่าง ๆ มีประโยชน์สำหรับสิ่งนี้และมันมีประโยชน์มากถ้าเช่นคุณไม่มีความเป็นเจ้าของวัตถุ "เครื่องคิดเลข" (สมมติว่ามันเป็นส่วนประกอบหรือบริการภายนอกที่คุณไม่สามารถทดสอบได้โดยตรง แต่คุณทำ รู้ว่าคุณต้องโทรด้วยวิธีใดวิธีหนึ่ง)

โรงเรียนในชิคาโก / รัฐจะให้คุณยืนยันว่าผลที่ได้คือ 35 กรอบ jUnit / nUnit โดยทั่วไปจะมุ่งเน้นไปที่การทำเช่นนี้

ทั้งสองเป็นการทดสอบที่ถูกต้องและสำคัญ


ตัวอย่างที่ดีมาก
sevenseacat

1
ฉันจะเพิ่มเหตุผลอีกสองสามข้อสำหรับการใช้แต่ละอย่าง: หากสิ่งสำคัญคือการกำหนดว่าบางสิ่งมีหรือไม่มีการเปลี่ยนแปลงตามการกระทำที่เกิดขึ้น (เช่น ledger.bucket.value กลายเป็น 35 เมื่อ ledger.calculate ("5 * 7 ") ถูกเรียก) คุณต้องการใช้การยืนยันของรัฐ (โรงเรียนในชิคาโก) สิ่งนี้มีประโยชน์มากที่สุดเมื่อคุณสามารถควบคุมสถานะของระบบได้อย่างสมบูรณ์ก่อนที่วิธีการนั้นจะถูกเรียกใช้และเมื่อคุณควบคุมวิธีการที่ทำ
Matthew Flynn

1
หากสิ่งสำคัญคือการรู้ว่าวิธีที่สองเรียกว่า (เช่นเครื่องคิดเลขหลายจุด (5, 7)) คุณต้องการใช้การยืนยันกิจกรรมผ่านวัตถุจำลอง สิ่งนี้มีประโยชน์มากที่สุดหากวิธีการที่เรียกว่ามีผลข้างเคียงที่ต้องการ (เช่นการบันทึกข้อมูลการเพิ่มตัวนับการส่งข้อความ ฯลฯ ) หากคุณไม่ได้ควบคุมสิ่งที่วิธีการทำจริงๆดังนั้นค่าส่งคืนอาจไม่สอดคล้องกัน . นอกจากนี้หากคุณไม่สามารถควบคุมสถานะของระบบได้อย่างง่ายดายสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือกำหนดกิจกรรมที่จะเกิดขึ้น
Matthew Flynn

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

1
วิธีการของลอนดอนยังระบุว่าจะให้สัญญาณตอบรับที่ชัดเจนกว่าเพราะถ้าคุณCalculatorถอยหลังmultiplyคุณจะเห็นการทดสอบสองครั้งล้มเหลว: การทดสอบบัญชีแยกประเภทและการทดสอบเครื่องคิดเลข แต่การทดสอบเพียงครั้งเดียวล้มเหลวถ้าคุณจำลองเครื่องคิดเลข ซึ่งอาจทำให้ง่ายต่อการระบุจุดเริ่มต้นของข้อบกพร่องโดยเฉพาะอย่างยิ่งหากระบบมีความซับซ้อน
Matthias

30

บทความMocks Ar ไม่ใช่ Stubsโดย Martin Fowler เป็นการแนะนำที่ดีสำหรับหัวข้อ

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

  1. เป็นหน่วยที่ทำการคำนวณตามอินพุต เป็นผลมาจากการคำนวณนี้วัตถุสามารถคืนค่าหรือเปลี่ยนสถานะของมัน
  2. เป็นองค์ประกอบที่ใช้งานที่สื่อสารกับองค์ประกอบอื่น ๆ ในระบบโดยการส่งข้อความ

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

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

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

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