ในขณะที่ฉันทุกคนสำหรับการทดสอบหน่วยบางครั้งฉันก็สงสัยว่ารูปแบบการทดสอบครั้งแรกนี้มีประโยชน์จริงๆหรือไม่ ...
การทดสอบเล็ก ๆ น้อย ๆ เช่นนี้อาจเป็น "นกขมิ้นในเหมืองถ่านหิน" สำหรับโค้ดเบสของคุณซึ่งเป็นการแจ้งเตือนถึงอันตรายก่อนที่จะสายเกินไป การทดสอบเล็กน้อยมีประโยชน์ในการติดตามเพราะจะช่วยให้คุณโต้ตอบได้ถูกต้อง
ตัวอย่างเช่นลองนึกถึงการทดสอบเล็กน้อยเพื่อตรวจสอบวิธีใช้ API ที่คุณไม่คุ้นเคย หากการทดสอบนั้นมีความเกี่ยวข้องกับสิ่งที่คุณกำลังทำในโค้ดที่ใช้ API "ของจริง" การทดสอบนั้นมีประโยชน์ เมื่อ API ออกเวอร์ชันใหม่และคุณต้องอัปเกรด ตอนนี้คุณมีสมมติฐานเกี่ยวกับวิธีที่คุณคาดหวังว่า API จะทำงานที่บันทึกไว้ในรูปแบบปฏิบัติการที่คุณสามารถใช้เพื่อตรวจจับการถดถอย
... [I] ในกระบวนการจริงคุณมี 3-4 ชั้นเหนือรหัสของคุณ (คำขอทางธุรกิจเอกสารความต้องการเอกสารสถาปัตยกรรม) ซึ่งกฎทางธุรกิจที่กำหนดจริง (ราคาส่วนลดคือราคา - ส่วนลด) อาจถูกกำหนดผิด หากเป็นเช่นนั้นการทดสอบหน่วยของคุณไม่มีความหมายสำหรับคุณ
หากคุณเขียนโค้ดมาหลายปีโดยไม่ได้ทดสอบการเขียนอาจไม่ชัดเจนสำหรับคุณในทันทีว่ามีคุณค่าใด ๆ แต่ถ้าคุณมีความคิดว่าวิธีที่ดีที่สุดในการทำงานคือ "ปล่อยก่อนปล่อยบ่อย" หรือ "คล่องตัว" เพราะคุณต้องการความสามารถในการปรับใช้อย่างรวดเร็ว / ต่อเนื่องการทดสอบของคุณหมายถึงบางอย่าง วิธีเดียวที่จะทำได้คือทำให้การเปลี่ยนแปลงทุกอย่างที่คุณทำกับโค้ดถูกต้องด้วยการทดสอบ ไม่ว่าการทดสอบจะเล็กแค่ไหนก็ตามเมื่อคุณมีชุดทดสอบสีเขียวแล้วในทางทฤษฎีคุณก็สามารถใช้งานได้ โปรดดูที่ "การผลิตต่อเนื่อง" และ "เบต้าแบบถาวร"
คุณไม่จำเป็นต้อง "ทดสอบก่อน" เพื่อให้มีความคิดเช่นนี้ แต่โดยทั่วไปแล้วนั่นเป็นวิธีที่มีประสิทธิภาพที่สุดในการไปถึงจุดนั้น เมื่อคุณทำ TDD คุณจะขังตัวเองไว้ในวงจร Red Green Refactor ขนาดเล็กสองถึงสามนาที คุณไม่สามารถหยุดและจากไปและมีความยุ่งเหยิงในมือซึ่งจะใช้เวลาหนึ่งชั่วโมงในการแก้ไขข้อบกพร่องและรวบรวมกลับมารวมกัน
นอกจากนี้การทดสอบหน่วยของคุณยังเป็นอีกจุดหนึ่งของความล้มเหลว ...
การทดสอบที่ประสบความสำเร็จคือการทดสอบที่แสดงให้เห็นถึงความล้มเหลวในระบบ การทดสอบที่ล้มเหลวจะแจ้งเตือนคุณถึงข้อผิดพลาดในตรรกะของการทดสอบหรือในตรรกะของระบบของคุณ เป้าหมายของการทดสอบของคุณคือการทำลายรหัสของคุณหรือพิสูจน์ว่าสถานการณ์หนึ่งได้ผล
หากคุณกำลังเขียนการทดสอบหลังโค้ดคุณจะเสี่ยงต่อการเขียนแบบทดสอบที่ "ไม่ดี" เพราะเพื่อที่จะเห็นว่าการทดสอบของคุณใช้งานได้จริงคุณจะต้องเห็นทั้งการทดสอบที่เสียและใช้งานได้จริง เมื่อคุณเขียนการทดสอบหลังโค้ดหมายความว่าคุณต้อง "ดึงกับดัก" และแนะนำจุดบกพร่องในโค้ดเพื่อดูว่าการทดสอบล้มเหลว นักพัฒนาส่วนใหญ่ไม่เพียง แต่ไม่สบายใจเกี่ยวกับเรื่องนี้ แต่จะโต้แย้งว่าเป็นการเสียเวลา
เราได้อะไรจากที่นี่?
การทำสิ่งต่างๆด้วยวิธีนี้มีประโยชน์แน่นอน Michael Feathers กำหนด "รหัสเดิม" ว่า "รหัสที่ยังไม่ทดสอบ" เมื่อคุณใช้แนวทางนี้คุณจะทำให้ทุกการเปลี่ยนแปลงที่คุณทำกับ codebase ของคุณถูกต้อง มันเข้มงวดกว่าการไม่ใช้การทดสอบ แต่เมื่อต้องดูแล codebase ขนาดใหญ่ก็ต้องจ่ายเอง
เมื่อพูดถึง Feathers มีแหล่งข้อมูลที่ยอดเยี่ยมสองอย่างที่คุณควรตรวจสอบในเรื่องนี้:
ทั้งสองอย่างนี้อธิบายถึงวิธีการทำงานของแนวปฏิบัติและสาขาวิชาเหล่านี้ในโครงการที่ไม่ใช่ "Greenfield" มีเทคนิคในการเขียนแบบทดสอบเกี่ยวกับส่วนประกอบที่เชื่อมต่อกันอย่างแน่นหนาการพึ่งพาแบบใช้สายอย่างหนักและสิ่งที่คุณไม่จำเป็นต้องควบคุม ทุกอย่างเกี่ยวกับการค้นหา "ตะเข็บ" และการทดสอบรอบ ๆ ตัว
[I] หากราคาส่วนลดไม่ถูกต้องทีมทดสอบจะยังคงพบปัญหาอยู่การทดสอบหน่วยช่วยประหยัดงานได้อย่างไร?
นิสัยแบบนี้เหมือนการลงทุน ผลตอบแทนไม่ได้ทันที พวกมันก่อตัวขึ้นเมื่อเวลาผ่านไป ทางเลือกอื่นนอกเหนือจากการไม่ทดสอบคือการไม่สามารถตรวจจับการถดถอยแนะนำรหัสโดยไม่ต้องกลัวข้อผิดพลาดในการรวมระบบหรือผลักดันการตัดสินใจในการออกแบบ ความงามคือคุณทำให้ทุกการเปลี่ยนแปลงที่เกิดขึ้นในโค้ดเบสของคุณถูกต้อง
ฉันขาดอะไรไปที่นี่? โปรดสอนให้ฉันรัก TDD เนื่องจากฉันมีช่วงเวลาที่ยากลำบากในการยอมรับว่ามันมีประโยชน์จนถึงตอนนี้ ฉันก็ต้องการเช่นกันเพราะฉันต้องการที่จะก้าวหน้า แต่มันก็ไม่สมเหตุสมผลสำหรับฉัน
ฉันมองว่ามันเป็นความรับผิดชอบของมืออาชีพ เหมาะอย่างยิ่งที่จะมุ่งมั่น แต่มันยากมากที่จะติดตามและน่าเบื่อ หากคุณสนใจและรู้สึกว่าไม่ควรผลิตโค้ดที่ไม่ผ่านการทดสอบคุณจะพบกับพลังที่จะเรียนรู้นิสัยการทดสอบที่ดี สิ่งหนึ่งที่ฉันทำมากในตอนนี้ (เช่นเดียวกับคนอื่น ๆ ) คือกล่องเวลาตัวเองหนึ่งชั่วโมงในการเขียนโค้ดโดยไม่มีการทดสอบใด ๆ เลยจากนั้นมีวินัยที่จะทิ้งมันไป สิ่งนี้อาจดูสิ้นเปลือง แต่ก็ไม่เชิง ไม่ใช่ว่าการออกกำลังกายนั้นต้องเสียค่าวัสดุทางกายภาพของ บริษัท ช่วยให้ฉันเข้าใจปัญหาและวิธีการเขียนโค้ดในลักษณะที่มีคุณภาพสูงขึ้นและทดสอบได้
คำแนะนำของฉันในท้ายที่สุดก็คือถ้าคุณไม่มีความปรารถนาที่จะเก่งในเรื่องนี้จริงๆก็อย่าทำเลย การทดสอบไม่ดีที่ไม่ได้รับการบำรุงรักษาทำได้ไม่ดี ฯลฯ อาจเลวร้ายยิ่งกว่าการไม่มีการทดสอบใด ๆ มันยากที่จะเรียนรู้ด้วยตัวคุณเองและคุณอาจจะไม่รักมัน แต่มันจะเป็นไปไม่ได้เลยที่จะเรียนรู้ถ้าคุณไม่มีความปรารถนาที่จะทำมันหรือมองไม่เห็นคุณค่าที่เพียงพอ รับประกันการลงทุนด้านเวลา
มีคนสองสามคนกล่าวถึงการทดสอบช่วยบังคับใช้ข้อกำหนด เป็นประสบการณ์ของผมที่ spec ผิดเหมือนกันบ่อยกว่าไม่ ...
แป้นพิมพ์ของนักพัฒนาคือที่ที่ยางไปตามถนน หากข้อมูลจำเพาะไม่ถูกต้องและคุณไม่ยกธงขึ้นแสดงว่ามีความเป็นไปได้สูงที่คุณจะถูกตำหนิ หรืออย่างน้อยรหัสของคุณจะ วินัยและความเข้มงวดที่เกี่ยวข้องกับการทดสอบเป็นเรื่องยากที่จะปฏิบัติตาม มันไม่ง่ายเลย ต้องใช้การฝึกฝนเรียนรู้มากและมีข้อผิดพลาดมากมาย แต่ในที่สุดมันก็จ่ายออก ในโครงการที่มีการเปลี่ยนแปลงอย่างรวดเร็วและรวดเร็วนี่เป็นวิธีเดียวที่คุณจะนอนหลับในเวลากลางคืนไม่ว่ามันจะทำให้คุณช้าลงก็ตาม
สิ่งที่ควรคำนึงถึงอีกประการหนึ่งก็คือเทคนิคที่เป็นพื้นฐานเหมือนกับการทดสอบได้รับการพิสูจน์แล้วว่าใช้ได้ผลในอดีต: "ห้องสะอาด" และ "การออกแบบตามสัญญา" ทั้งสองมีแนวโน้มที่จะสร้าง "เมตา" - รหัสประเภทเดียวกัน การทดสอบทำและบังคับใช้ในจุดต่างๆ ไม่มีเทคนิคเหล่านี้เป็นกระสุนเงินและในที่สุดความเข้มงวดจะทำให้คุณเสียค่าใช้จ่ายในขอบเขตของคุณสมบัติที่คุณสามารถส่งมอบได้ในแง่ของเวลาในการวางตลาด แต่นั่นไม่ใช่สิ่งที่เกี่ยวกับ มันเกี่ยวกับความสามารถในการรักษาสิ่งที่คุณส่งมอบ และนั่นสำคัญมากสำหรับโครงการส่วนใหญ่