การทดสอบหน่วยทั้งหมดในหนึ่งปฏิบัติการหรือแยกพวกเขา?


12

เมื่อเขียนการทดสอบสำหรับซอฟต์แวร์หนึ่งชิ้นกล่าวว่าห้องสมุดคุณต้องการรวบรวมการทดสอบหน่วยทั้งหมดเป็นหนึ่งหรือแยกพวกมันออกเป็นหลาย ๆ โปรแกรม?

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

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

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


แยกพวกมันออกเป็น executables แยกตามคลาส แต่ละคลาสควรมีการทดสอบหน่วยของตนเองเว้นแต่ว่าคลาสนั้นไม่สามารถทำการทดสอบหน่วยได้ดังนั้นจึงต้องมีการทดสอบโดยคลาสอื่นทางอ้อม
Brian

1
หากคุณมีไลบรารีขนาดใหญ่ที่มีคลาสเป็นร้อย ๆ คลาสแต่ละคลาสมีการทดสอบหน่วยเวลาบิลด์จะนานขึ้นหากคุณสร้างไบนารีที่สมบูรณ์สำหรับแต่ละรายการเปรียบเทียบกับไบนารีขนาดใหญ่หนึ่ง (หรือสองสาม) นอกจากนี้ยังมี makefiles จำนวนมากที่ต้องจัดการโดยแต่ละลิงก์จะมีลิงก์
JBRWilkinson

มันไม่ใหญ่มาก น้อยกว่า 20 โมดูล ฉันยังสามารถรวบรวมพวกเขาทั้งหมดด้วยธงเดียวกันดังนั้น CMake สามารถสร้าง Makefiles ได้โดยไม่ต้องทำงานมากในส่วนของฉัน
Benjamin Kloster

คำตอบ:


5

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

แต่ที่สำคัญกว่านั้นยังช่วยให้ฉันสามารถรวมการทดสอบที่เขียนในภาษาที่แตกต่างกันหรือการใช้เครื่องมือที่แตกต่างกันในการทำงานเดียวกัน ตัวอย่างเช่นการทดสอบหน่วยที่ฉันเขียนมีแนวโน้มมากที่สุดในภาษาหลักของโครงการและการรันเป็นเรื่องของการสร้างและเรียกใช้ไบนารี แต่ฉันต้องการทดสอบฐานข้อมูลของฉันและฉันอาจต้องการฟีดสคริปต์ SQL ไปยังฐานข้อมูลโดยตรง ฉันอาจต้องการเรียกใช้เครื่องมือวิเคราะห์รหัสแบบคงที่ในรหัสของฉัน (แม้ว่าจะเป็นเพียงบางส่วนของ linter) ฉันอาจต้องการเรียกใช้ HTML แบบคงที่ผ่านตัวตรวจสอบความถูกต้อง ฉันสามารถเรียกใช้grepคำสั่งบน codebase เพื่อตรวจสอบการสร้างที่น่าสงสัยการละเมิดการเขียนโค้ดสไตล์หรือคำหลัก "การตั้งค่าสถานะ" ความเป็นไปได้ไม่มีที่สิ้นสุด - หากสามารถเรียกใช้จากบรรทัดคำสั่งและปฏิบัติตาม "สถานะทางออกที่เป็นศูนย์หมายความว่าตกลง" ฉันสามารถใช้มันได้


อาร์กิวเมนต์ผู้ไม่เชื่อเรื่องภาษาเป็นจุดที่ดีมากเนื่องจากฉันวางแผนที่จะใช้การเชื่อมหลามกับห้องสมุดหลาม ขอบคุณ!
Benjamin Kloster

@tdammers: กรอบการทดสอบเฉพาะใด ๆ
JBRWilkinson

@JBRWilkinson: เพียงเชลล์สคริปต์ 30 บรรทัด สำหรับภาษาส่วนใหญ่ที่ฉันใช้ฉันมีห้องสมุดเล็ก ๆ น้อย ๆ สำหรับการทดสอบทั่วไปเช่นการใช้งานฟังก์ชั่นการเปรียบเทียบผลลัพธ์กับค่าที่คาดไว้และการขว้างปาเมื่อไม่ตรงกัน แต่เฟรมเวิร์กการทดสอบหน่วยใด ๆ สามารถรวมเข้ากับ "ระบบเมตา" ได้อย่างง่ายดายตราบใดที่มันสามารถเรียกใช้จากบรรทัดคำสั่งและส่งสัญญาณความสำเร็จ / ความล้มเหลวผ่านสถานะทางออก
tdammers

2

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

ตอนนี้ฉันมักจะไม่ได้รับการพิจารณาที่ tdammers มี; รหัสของฉันแทบทั้งหมดในหนึ่งภาษาและการทดสอบใด ๆ ที่เกี่ยวข้องกับสตริง SQL ไม่ใช่การทดสอบหน่วย (เว้นแต่คุณกำลังทดสอบว่าผู้สร้างแบบสอบถามส่งคืนสตริง SQL ที่คาดหวังตามเกณฑ์ที่กำหนด) และฉันแทบไม่เคยทดสอบหน่วยจริง UI (ในหลาย ๆ สถานการณ์มันเป็นไปไม่ได้เลย) ฉันยังใช้ไลบรารีการทดสอบหน่วยที่ได้รับการยอมรับอย่างดีจากเครื่องมือของบุคคลที่สามเช่น build-bots และ IDE plugins และดังนั้นความกังวลใด ๆ เกี่ยวกับการใช้การทดสอบเดี่ยว


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