เราควรจะทำการทดสอบบั๊กเมื่อทำการแก้ไขหรือไม่?


29

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

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

ดังนั้นคำถามของฉัน: คุณจะทดสอบข้อบกพร่องที่ทำซ้ำได้อย่างไร? คุณจะหลีกเลี่ยงการสร้างสิ่งต่าง ๆ ที่ทดสอบการใช้งานและเจ็บ refactoring และการอ่านได้อย่างไร


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

refactor นั้นเกี่ยวกับสิ่งอื่นและยังคงเป็นไปได้ในการออกแบบใหม่เพื่อปรับเปลี่ยนรหัสเล็กน้อยและนำข้อผิดพลาดกลับมาใช้ใหม่ซึ่งเป็นสิ่งที่การทดสอบกำลังรับชมอยู่ ฉันเดาทางเลือกในการทดสอบจะเป็นความคิดเห็นในรหัสว่า "อย่ามีเพศสัมพันธ์กับเรื่องนี้" แต่ดูเหมือนว่าจะทำสิ่งผิด: p
Zonko

1
ถ้ามันซับซ้อนเกินไปสำหรับผู้ที่ไม่กล้าทำมันจึงเป็นส่วนหนึ่งของการทดสอบการรวมเข้าด้วยกัน
ratchet freak

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

คำตอบ:


27

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

ฉันมักจะชอบเขียนแบบทดสอบมากกว่าเนื่องจากการขัดจังหวะการบักมักจะมีค่าใช้จ่ายมากกว่าการพัฒนาและการบำรุงรักษาทดสอบหน่วย


ฉันจะเพิ่มความสำคัญให้กับสิ่งนี้มากขึ้นและระบุว่าในโลกอุดมคติมันจะได้รับการพิจารณาว่าเป็นข้อผิดพลาดหากมีการทดสอบหน่วยที่ล้มเหลวอยู่ แต่ +1 สำหรับตัวเอียงและสังเกตว่าความต้องการทางธุรกิจควรเหนือกว่า
Joshua Drake

2
ในที่สุดท้ายที่สุดมันก็คือความสมดุลระหว่างเวลาที่ต้องใช้ในการบำรุงรักษาการทดสอบเทียบกับเวลาที่ noob ใช้ในการตรวจสอบและแก้ไขข้อผิดพลาดถ้ามันเกิดขึ้นอีกครั้ง
Zonko

ฉันชอบที่จะทำการทดสอบแบบทั่วไปเพื่อที่จะไม่เพียงแค่ทดสอบการยกเลิกและลองใหม่เมื่อถึงสถานะที่ระบุ แต่เป็นการทดสอบที่ยกเลิกและลองใหม่ในทุกรัฐที่มีงานอยู่
Old Pro

+1 สำหรับ "เนื่องจากการขัดจังหวะการเรียกใช้ข้อบกพร่องมักจะมีค่าใช้จ่ายมากกว่าการพัฒนาและบำรุงรักษาการทดสอบหน่วย"
ปีเตอร์เค

16

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


7

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

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

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

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


5

ใช่คุณควรจะ.

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

นี่ไม่ใช่การฝึกฝนของ TDD ในการทดสอบ TDD ผลักดันการออกแบบของคุณ แต่ในกรณีของคุณการออกแบบได้รับการตัดสินใจแล้ว

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