ฉันมีเกร็ดเล็กเกร็ดน้อยที่เกี่ยวข้องจากสิ่งที่เกิดขึ้นในขณะนี้สำหรับฉัน ฉันอยู่ในโครงการที่ไม่ใช้ TDD กลุ่มควบคุมคุณภาพของเรากำลังเคลื่อนเราไปในทิศทางนั้น แต่เราเป็นชุดเล็ก ๆ และเป็นกระบวนการที่ใช้เวลานาน
อย่างไรก็ตามเมื่อเร็ว ๆ นี้ฉันใช้ห้องสมุดบุคคลที่สามเพื่อทำงานเฉพาะอย่าง มีปัญหาเกี่ยวกับการใช้ห้องสมุดดังกล่าวดังนั้นฉันจึงตัดสินใจเขียนเวอร์ชันของไลบรารีเดียวกันนี้ด้วยตัวเอง โดยรวมแล้วมันก็เป็นโค้ดประมวลผลประมาณ 5,000 บรรทัดและเวลาของฉันประมาณ 2 เดือน ฉันรู้ว่าบรรทัดของโค้ดเป็นเมตริกที่ไม่ดี แต่สำหรับคำตอบนี้ฉันรู้สึกว่ามันเป็นตัวบ่งชี้ที่ดี
มีโครงสร้างข้อมูลหนึ่งที่ฉันต้องการซึ่งจะทำให้ฉันสามารถติดตามจำนวนบิตโดยพลการได้ เนื่องจากโปรเจ็กต์อยู่ใน Java ฉันเลือก Java BitSet
และแก้ไขมันเล็กน้อย (ฉันต้องการความสามารถในการติดตามส่วนนำ0
เช่นกันซึ่ง BitSet ของ Java ไม่ได้ทำด้วยเหตุผลบางอย่าง ..... ) หลังจากได้รับความคุ้มครองถึง 93% ฉันเริ่มเขียนแบบทดสอบที่จะเน้นระบบที่ฉันเขียน ฉันต้องการกำหนดมาตรฐานบางประการของฟังก์ชั่นเพื่อให้แน่ใจว่ามันจะเร็วพอสำหรับความต้องการขั้นสุดท้ายของฉัน แปลกใจหนึ่งในฟังก์ชั่นที่ฉันลบล้างจากBitSet
อินเตอร์เฟซนั้นช้ามากเมื่อจัดการกับชุดบิตขนาดใหญ่ (หลายร้อยล้านบิตในกรณีนี้) ฟังก์ชั่นการเขียนทับอื่น ๆ อาศัยฟังก์ชั่นนี้ดังนั้นมันจึงเป็นคอขวดขนาดใหญ่
สิ่งที่ฉันสิ้นสุดที่ทำกำลังจะไปที่กระดานวาดภาพและการหาวิธีที่จะจัดการกับโครงสร้างพื้นฐานของซึ่งเป็นBitSet
long[]
ฉันออกแบบอัลกอริทึมถามเพื่อนร่วมงานเพื่อรับข้อมูลจากนั้นฉันจะเขียนโค้ด จากนั้นฉันก็ทำการทดสอบหน่วย พวกเขาบางคนพังและคนที่ชี้ให้ฉันอย่างแม่นยำถึงตำแหน่งที่ฉันต้องการดูในอัลกอริทึมของฉันเพื่อแก้ไข หลังจากแก้ไขข้อผิดพลาดทั้งหมดจากการทดสอบหน่วยฉันสามารถพูดได้ว่าฟังก์ชั่นใช้งานได้ตามที่ควร อย่างน้อยที่สุดฉันก็มั่นใจได้ว่าอัลกอริทึมใหม่นี้ทำงานได้ดีเท่ากับอัลกอริธึมก่อนหน้า
แน่นอนว่านี่ไม่ใช่หลักฐานกระสุน หากมีข้อผิดพลาดในรหัสของฉันที่หน่วยทดสอบไม่ได้ตรวจสอบแล้วฉันจะไม่ทราบ แต่แน่นอนข้อผิดพลาดที่เหมือนกันอาจจะอยู่ในอัลกอริทึมช้าลงของฉันเช่นกัน อย่างไรก็ตามฉันสามารถพูดด้วยความมั่นใจในระดับสูงว่าฉันไม่ต้องกังวลกับผลลัพธ์ที่ผิดจากฟังก์ชั่นนั้น การทดสอบหน่วยที่มีอยู่ก่อนช่วยให้ฉันประหยัดเวลาได้หลายวันในการพยายามทดสอบอัลกอริทึมใหม่เพื่อให้แน่ใจว่าถูกต้อง
นั่นคือประเด็นของการทดสอบหน่วยโดยไม่คำนึงถึง TDD - กล่าวคือการทดสอบหน่วยจะทำสิ่งนี้ให้คุณใน TDD และนอก TDD เหมือนกันทั้งหมดเมื่อคุณจบการเปลี่ยน / การบำรุงรักษาโค้ด แน่นอนว่าควรจับคู่กับการทดสอบการถดถอยแบบปกติการทดสอบควันการทดสอบฟัซซี่ ฯลฯ แต่เป็นการทดสอบหน่วยในฐานะชื่อทดสอบสิ่งต่าง ๆ ในระดับอะตอมที่เล็กที่สุดที่เป็นไปได้ซึ่งช่วยให้คุณทราบทิศทางที่เกิดข้อผิดพลาด
ในกรณีของฉันหากไม่มีการทดสอบหน่วยที่มีอยู่ฉันจะต้องหาวิธีการเพื่อให้มั่นใจว่าอัลกอริทึมทำงานได้ตลอดเวลา ไหนในท้ายที่สุด ... ฟังดูเหมือนการทดสอบหน่วยใช่ไหม?