- คำถามนี้ไม่เกี่ยวกับกรอบการทดสอบหน่วย
- คำถามนี้ไม่เกี่ยวกับการเขียนการทดสอบหน่วย
- คำถามนี้เกี่ยวกับสถานที่ที่จะวางโค้ด UT และวิธี / เวลา / สถานที่ในการรวบรวมและเรียกใช้
ในการทำงานอย่างมีประสิทธิภาพด้วยรหัสมรดก Michael Feathers ยืนยันว่า
ทดสอบหน่วยที่ดี ... ทำงานเร็ว
และนั่น
การทดสอบหน่วยที่ใช้เวลา 1 / 10th ของวินาทีในการทำงานคือการทดสอบหน่วยช้า
ฉันคิดว่าคำจำกัดความเหล่านี้สมเหตุสมผล ฉันยังคิดว่าพวกเขาบอกเป็นนัยว่าคุณต้องเก็บชุดการทดสอบหน่วยและชุดการทดสอบรหัสเหล่านั้นที่ใช้เวลานานกว่าแยกจากกัน แต่ฉันคิดว่านั่นคือราคาที่คุณจ่ายสำหรับการโทรหาการทดสอบหน่วยเท่านั้น .
เห็นได้ชัดว่าปัญหาใน C ++ คือการ "เรียกใช้" การทดสอบหน่วยของคุณคุณต้อง:
- แก้ไขรหัสของคุณ (การผลิตหรือการทดสอบหน่วยขึ้นอยู่กับ "รอบ" ที่คุณอยู่)
- รวบรวม
- ลิงค์
- เริ่มการทดสอบหน่วยปฏิบัติการ ( s )
แก้ไข(หลังจากลงคะแนนเสียงแปลก ๆ ) : ก่อนลงรายละเอียดฉันจะลองสรุปประเด็นที่นี่:
รหัสการทดสอบหน่วย C ++ จะมีการจัดระเบียบอย่างมีประสิทธิภาพได้อย่างไรเพื่อให้ทั้งสองมีประสิทธิภาพในการแก้ไขรหัส (ทดสอบ) และเรียกใช้รหัสทดสอบ?
แรกปัญหาแล้วคือการตัดสินใจที่จะใส่รหัสหน่วยทดสอบเพื่อที่:
- เป็น "ธรรมชาติ" เพื่อแก้ไขและดูร่วมกับรหัสการผลิตที่เกี่ยวข้อง
- ง่าย / รวดเร็วในการเริ่มต้นวงจรการรวบรวมสำหรับหน่วยที่คุณกำลังเปลี่ยน
ปัญหาที่สองที่เกี่ยวข้องคือสิ่งที่จะรวบรวมเพื่อให้ข้อเสนอแนะได้ทันที
ตัวเลือกมาก:
- แต่ละหน่วยทดสอบทดสอบหน่วยอยู่ในไฟล์ cpp ที่แยกต่างหากและไฟล์ cpp นี้จะรวบรวม + เชื่อมโยงแยกต่างหาก (พร้อมกับไฟล์หน่วยรหัสที่มามันทดสอบ) เพื่อปฏิบัติการเดียวซึ่งจะเรียกใช้การทดสอบหน่วยนี้
- (+) นี่ช่วยลดเวลาเริ่มต้น (รวบรวม + ลิงก์!) สำหรับหน่วยทดสอบเดียว
- (+) การทดสอบรันเร็วมากเพราะจะทดสอบเพียงหนึ่งหน่วย
- (-) การดำเนินการชุดทั้งหมดจะต้องเริ่มกระบวนการเป็นพันล้าน อาจเป็นปัญหาในการจัดการ
- (-) ค่าใช้จ่ายในกระบวนการเริ่มต้นจะปรากฏให้เห็น
- อีกด้านหนึ่งจะต้องมี - ยังคง - ไฟล์ cpp หนึ่งไฟล์ต่อการทดสอบ แต่ไฟล์ cpp ทดสอบทั้งหมด (พร้อมกับรหัสที่พวกเขาทดสอบ!) จะเชื่อมโยงกับหนึ่งไฟล์ปฏิบัติการ (ต่อโมดูล / ต่อโครงการ / เลือกตัวเลือก)
- (+) เวลาในการคอมไพล์ยังคงเป็น OK เพราะโค้ดที่ถูกเปลี่ยนแปลงเท่านั้นที่จะคอมไพล์
- (+) การใช้งานชุดทั้งหมดนั้นง่ายเนื่องจากมีเพียง exe ตัวเดียวที่จะเรียกใช้
- (-) ชุดจะใช้เวลานานในการเชื่อมโยงเนื่องจากการรวบรวมใหม่ของวัตถุใด ๆ จะก่อให้เกิดการเชื่อมโยงใหม่
- (-) (?) ชุดสูทจะใช้เวลานานกว่าถึงแม้ว่าการทดสอบหน่วยทั้งหมดจะเร็ว แต่เวลาควรจะตกลง
ดังนั้นการทดสอบหน่วย C ++ ในโลกแห่งความจริงได้รับการจัดการอย่างไร หากฉันเรียกใช้สิ่งนั้นทุกคืน / ชั่วโมงส่วนที่สองไม่สำคัญ แต่ส่วนแรกคือวิธี "จับคู่" รหัส UT กับรหัสการผลิตเพื่อให้เป็น "ธรรมชาติ" สำหรับนักพัฒนาเพื่อให้ทั้งสองอยู่ใน คิดเสมอว่าเรื่องสำคัญ (และหากนักพัฒนามีรหัส UT อยู่ในโฟกัสพวกเขาจะต้องการเรียกใช้ซึ่งนำเรากลับไปสู่ส่วนที่สอง)
เรื่องราวในโลกแห่งความเป็นจริงและประสบการณ์ชื่นชม!
หมายเหตุ:
- คำถามนี้ตั้งใจทิ้งแพลตฟอร์มที่ไม่ระบุและระบบ / โครงการ
- คำถามที่ติดแท็ก UT & C ++เป็นจุดเริ่มต้นที่ดี แต่น่าเสียดายที่มีคำถามมากเกินไป
- ไม่นานมานี้ฉันตอบคำถามคล้าย ๆ กันเกี่ยวกับโครงสร้างสำหรับการทดสอบหน่วยเพิ่ม ฉันพบว่าโครงสร้างนี้ขาดการทดสอบหน่วย "ของจริง" อย่างรวดเร็ว และฉันพบว่าคำถามอื่นแคบเกินไปดังนั้นคำถามใหม่นี้
Pipeline<A,B>.connect(Pipeline<B,C>)
ควรรวบรวมในขณะที่Pipeline<A,B>.connect(Pipeline<C,D>)
ไม่ควรคอมไพล์: ประเภทเอาต์พุตของสเตจแรกไม่เข้ากันกับประเภทอินพุตของสเตจที่สอง