แนวทางปฏิบัติที่ดีที่สุดสำหรับการดัดแปลงรหัสดั้งเดิมด้วยการทดสอบอัตโนมัติ


22

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

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


1
ขั้นตอนที่ 1: ค้นหา Stack Overflow คำถามถูกถาม หลายต่อหลายครั้ง
S.Lott

คำตอบ:


20

ก่อนอื่นรับและอ่านการทำงานอย่างมีประสิทธิภาพด้วยรหัสมรดกโดย Michael Feathers - มันเป็นตัวช่วยที่ขาดไม่ได้สำหรับงานดังกล่าว

จากนั้นหมายเหตุเล็กน้อย:

  • คุณมีสเปค / สัญญาที่แม่นยำสำหรับอินเทอร์เฟซหรือคุณมีเพียงการใช้งานที่มีอยู่เป็น "สเปค" หรือไม่? ในกรณีแรกมันง่ายกว่าที่จะทำการเขียนใหม่ทั้งหมดตั้งแต่ต้นในกรณีหลังมันยากที่จะเป็นไปไม่ได้
  • หากคุณต้องการปรับใช้อินเตอร์เฟสอีกครั้งวิธีที่มีประโยชน์ที่สุดในการใช้ทรัพยากรในการทดสอบของคุณคือการเขียนการทดสอบกับอินเทอร์เฟซเท่านั้น แน่นอนว่าสิ่งนี้ไม่ได้มีคุณสมบัติเป็นการทดสอบหน่วยในความหมายที่เข้มงวดการทดสอบการใช้งาน / การยอมรับ แต่ฉันไม่ใช่คนพิถีพิถัน :-) อย่างไรก็ตามการทดสอบเหล่านี้สามารถนำมาใช้ซ้ำได้และช่วยให้คุณสามารถเปรียบเทียบผลลัพธ์โดยตรงจากทั้งสอง .
  • โดยรวมแล้วฉันชอบที่จะ refactoring รหัสที่มีอยู่มากกว่าการเขียนใหม่ตั้งแต่ต้นเว้นแต่ว่ามันจะไม่สามารถทำได้อย่างสมบูรณ์ (แต่ในกรณีนี้คุณจะเขียนการทดสอบหน่วยกับมันได้อย่างไร) ดูโพสต์นี้จาก Joelสำหรับการสนทนารายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ การสร้างชุดการทดสอบการยอมรับกับส่วนต่อประสานช่วยให้คุณมีโครงข่ายความปลอดภัยที่มีประโยชน์ แต่คุณสามารถเริ่มการปรับโครงสร้างรหัสที่มีอยู่ด้วยความระมัดระวังเพื่อให้หน่วยทดสอบได้ (โดยใช้แนวคิดจากหนังสือของ Feathers)

ฉันจะบวก 3 นี่ถ้าทำได้ WELC เป็นสิ่งที่จำเป็นในการอ่านและจะต้องมีการปรับโครงสร้างอย่างแน่นอน ...
Johnsyweb

หนึ่งความคิดเห็นเล็กน้อยในประเด็นที่ 2 คือสำหรับระบบดั้งเดิมการทดสอบควรทำตามความคิดของการทดสอบคุณลักษณะ นั่นคือจับพฤติกรรมของซอฟต์แวร์ในปัจจุบันอย่างซื่อสัตย์และหลีกเลี่ยงการเปลี่ยนพฤติกรรมแม้ว่าผลการทดสอบบางอย่างอาจดูแปลกหรือไม่เห็นด้วยตามแนวคิดของการทดสอบหน่วย (Btw ความคิดนี้มาจากผู้เขียน
WELC

@rwong แน่นอน หากไม่มีข้อกำหนดเฉพาะอย่างละเอียดหรือเจ้าของผลิตภัณฑ์ที่มีความรู้ผู้พัฒนาจะไม่สามารถตัดสินใจได้ว่าพฤติกรรมที่เฉพาะเจาะจงของโปรแกรม a) เป็นความตั้งใจและจำเป็นหรือไม่ b) เป็นสิ่งที่ไม่ได้ตั้งใจ แต่ตอนนี้ผู้ใช้ขึ้นอยู่กับมัน เป็นอันตรายต่อผู้ใช้ง) ข้อผิดพลาดที่ยังไม่ได้สังเกตจนถึงตอนนี้ ในสองกรณีแรก "การแก้ไข" จริง ๆ แล้วมันจะทำร้ายผู้ใช้และในกรณีสุดท้ายการแก้ไข - แม้ว่าถูกต้องตามหลักวิชา - จะไม่ให้ประโยชน์ที่มองเห็นได้
PéterTörök

4

วิธีที่ดีที่สุดคือวิธีรู้จัก Mikado http://mikadomethod.wordpress.com/2010/08/04/the-mikado-method-book/ นี่เป็นเพียงลักษณะทั่วไปของเทคนิคง่ายๆ แต่เป็นวิธีเดียวที่ฉันรู้ที่จะเริ่มปรับปรุงคุณภาพรหัสในฐานรหัสขนาดใหญ่ โดยไม่รับความเสี่ยงที่ไม่จำเป็น

WEWLC ยังเป็นหนังสือที่ดีมากเกี่ยวกับเรื่องนี้ แต่การเขียนใน C ++ นั้นไม่ได้มีประโยชน์เสมอไปกับโค้ด Java หรือ Ruby


2

การทดสอบแบบย้อนยุคเข้ากับฐานรหัสแบบเก่านั้นค่อนข้างยากหากมีการออกแบบเสาหิน

ถ้าเป็นไปได้ (คุณมีเวลา / เงิน) วิธีหนึ่งที่จะก้าวไปข้างหน้าคือการปรับรหัสให้เป็นหน่วยที่สามารถทดสอบได้มากขึ้น


1

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

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