การทดสอบบูรณาการวิจารณ์การออกแบบอย่างไร


38

ฉันได้อ่านที่โพสต์บล็อกของ JB Rainsbergerเกี่ยวกับการทดสอบแบบบูรณาการและสงสัยว่าวิธีการทดสอบบูรณาการนั้นรุนแรงกว่ากับการออกแบบของเราหรือไม่

เราเขียนการทดสอบแบบบูรณาการมากขึ้นซึ่งใหญ่กว่าและไม่วิจารณ์การออกแบบของเราอย่างรุนแรงเช่นเดียวกับ microtests


3
คำถามกำลังสับสน "ด้วยวิธีการทดสอบการรวมที่รุนแรงมากขึ้น" ... "การทดสอบแบบรวมซึ่งใหญ่กว่าและไม่วิจารณ์การออกแบบของเราอย่างรุนแรง" - อะไรตอนนี้
AnoE


"การทดสอบการรวม"! = "การทดสอบแบบรวม" ฉันรู้ว่า. ฉันไม่ชอบมันเหมือนกัน แต่นั่นคือความหมายของคำเหล่านั้น "การทดสอบการรวม" = "การทดสอบที่ตรวจสอบคะแนนการรวม (ไม่รวมสิ่งต่าง ๆ )" ในขณะที่ "การทดสอบแบบรวม" = "(ขนาดใหญ่) การทดสอบที่รวมสิ่งต่าง ๆ และตรวจสอบการรวมทั้งหมดเป็นสิ่งเดียว" ด้วยวิธีนี้ข้อกำหนดเหล่านี้กลายเป็นสิ่งที่ตรงกันข้ามซึ่งกันและกัน
JB Rainsberger

คำตอบ:


46

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

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

อัปเดต : ตามที่ Rainsberger บันทึกไว้ด้านล่างเขาไม่ได้ตั้งใจให้ microtests มีความหมายเหมือนกันกับการทดสอบหน่วย นอกจากนี้เขายังให้คำตอบโดยละเอียดที่สามารถให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่เขาสื่อสารด้วย


2
ฉันเห็นด้วยกับคำตอบของคุณในหลักการ แต่ไม่ใช่วิธีที่คุณพูดออกมา คนที่ถามคำถามนี้โดยเฉพาะนั้นไม่น่าจะรู้ว่าคำว่า "เยาะเย้ย" "การแต่งงานกัน" และ "การทำงานร่วมกัน" หมายถึงอะไรและคุณไม่ได้นิยามคำเหล่านั้นไว้ในคำตอบของคุณ
Robert Harvey

3
ดีกว่า แต่คุณให้การทดสอบหน่วยเครดิตมากกว่าที่ฉันคิดว่าพวกเขาถึงกำหนดจริง การทดสอบหน่วยส่วนใหญ่แจ้งความสามารถในการทดสอบโค้ดของคุณ มีความชัดเจนน้อยลงว่าการทำให้โค้ดของคุณทดสอบโดยอัตโนมัติทำให้เกิดการรวมตัวที่ดีขึ้นและการมีเพศสัมพันธ์แม้ว่าจะเป็นผลดีอย่างแน่นอน นอกจากนี้ฉันคิดว่าคุณมี "การติดต่อกันสูง" สับสนกับ "หลักการความรับผิดชอบเดียว" การติดต่อกันหมายถึง "สิ่งต่าง ๆ ที่อยู่ด้วยกัน" (ดูบทความ Wikipedia )
Robert Harvey

10
ในที่สุด "การทดสอบไมโคร" ไม่ใช่คำที่ต้องการ ฉันชอบเมื่อบล็อกเกอร์สร้างคำศัพท์ทางเทคนิคของตัวเอง
Robert Harvey

2
@RubberDuck: Microtests (ประมาณ 16,900 ผล) VS หน่วยทดสอบ (ประมาณ 193,000,000 ผล) ไม่ได้ใกล้เคียง. แม้ว่าคุณบดหน่วยและทดสอบร่วมกันคุณก็ยังได้ผลลัพธ์ 14 ล้าน
Robert Harvey

5
โปรดอย่าถือเอา "microtest" และ "การทดสอบหน่วย" (ดูคำตอบของฉันสำหรับรายละเอียดบางอย่าง); มิฉะนั้นฉันรู้สึกว่าคุณเข้าใจสิ่งที่ฉันพยายามอธิบาย
JB Rainsberger

28

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

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

การทดสอบที่ใหญ่กว่าหมายถึงการทดสอบที่รันส่วนที่ใหญ่กว่าของระบบในส่วน "การกระทำ" ของพวกเขามีแนวโน้มที่จะไม่วิจารณ์การออกแบบที่ชัดเจน ลองนึกภาพชุดรหัสฐานทั้งหมดที่สามารถผ่านกลุ่มการทดสอบที่กำหนดซึ่งหมายความว่าฉันสามารถจัดระเบียบรหัสใหม่และจะยังคงผ่านการทดสอบเหล่านั้น สำหรับการทดสอบที่ใหญ่กว่าชุดนี้จะใหญ่กว่า สำหรับการทดสอบที่น้อยกว่าชุดนี้จะเล็กกว่า การทดสอบที่น้อยกว่านั้น จำกัด การออกแบบมากขึ้นดังนั้นการออกแบบที่น้อยลงจึงทำให้พวกมันผ่าน ด้วยวิธีนี้ microtests สามารถวิจารณ์การออกแบบมากขึ้น

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

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


คุณทำอะไรเกี่ยวกับปัญหาที่การทดสอบหน่วยพึ่งพา mocks ของพวกเขามากกว่าในรหัสจริงนำไปสู่ปัญหาของการทดสอบที่ดูเหมือนจะผ่าน แต่ไม่ได้ผลจริง ๆ เพราะไม่มีใครรักษา mocks ให้สอดคล้องกับความเป็นจริง
Zan Lynx

@ZanLynx ฉันได้เขียนเกี่ยวกับเรื่องนี้ที่ความยาว เริ่มที่นี่: blog.thecodewhisperer.com/series#integrated-tests-are-a-scam
JB Rainsberger

9

เขาหมายถึงว่าการออกแบบซอฟต์แวร์ที่ดีนั้นได้รับแจ้งจากการทดสอบหน่วยดีกว่าการทดสอบการรวม

นี่คือเหตุผล การเขียนการทดสอบหน่วยบังคับให้คุณเขียนโค้ดที่สามารถทดสอบได้ รหัสที่ทดสอบได้ของหน่วยมีแนวโน้มที่จะออกแบบได้ดีกว่ารหัสที่ไม่มีการทดสอบหน่วย

การทดสอบการรวมไม่แจ้งรหัสของคุณในลักษณะเดียวกันเพราะคุณเพิ่งทดสอบเลเยอร์ชั้นนอกของซอฟต์แวร์ไม่ใช่อินเทอร์เฟซภายในที่เชื่อมต่อซอฟต์แวร์ของคุณเข้าด้วยกัน

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