ควรเก็บการทดสอบหน่วยในที่เก็บ?


50

ฉันเป็นโปรแกรมเมอร์ที่เพิ่มมากขึ้นซึ่งในที่สุดก็นำการทดสอบหน่วยไปใช้ปฏิบัติจริงสำหรับห้องสมุดที่ฉันจัดเก็บไว้ใน GitHub

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

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


13
ทำไมจะไม่ล่ะ? การทดสอบควรมาพร้อมกับโครงการหรือพวกเขาแทบจะไร้ประโยชน์

61
ความจริงที่ว่าบางโครงการไม่รวมการทดสอบหน่วยในที่เก็บของพวกเขามีแนวโน้มมากขึ้นเนื่องจากไม่มีการทดสอบเหล่านี้ในตอนแรก
ช่วง

4
พวกมันถูกสร้างแยกต่างหาก แต่มิฉะนั้นการทดสอบแบบยูจะรวมเข้ากับรหัสอย่างแน่นหนา เพื่อให้แน่ใจว่ามีความสอดคล้องต้องมีการจัดการการพึ่งพาบางประเภท ไม่ว่าจะวางไว้ในพื้นที่เก็บข้อมูลเดียวกันรุ่น subrepository หรือรักษาควบคุม "การเชื่อมโยง" เพื่อเก็บข้อมูลการทดสอบ ฯลฯ
Mar

2
@stoupa ค่อนข้างถูกต้อง: มันน่ารักที่จะถือว่าดีที่สุดนั่นคือมีการทดสอบแคชที่ยอดเยี่ยมซ่อนอยู่ที่ไหนสักแห่ง แต่ในโลกแห่งความเป็นจริงโปรแกรมเมอร์นั้นขี้เกียจ
Cascabel

2
โปรดทราบว่าฉันจะถือว่าเป็นความคิดที่ดีที่จะปิดการรวบรวมคลาสทดสอบในสคริปต์สร้างของคุณ
user606723

คำตอบ:


119

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

แม้ว่ารหัสทดสอบควรแยกออกจากรหัสการผลิตเป็นอย่างดี ยกตัวอย่างเช่น Maven ประสบความสำเร็จโดยใส่รหัสการผลิตและการทดสอบลงในโฟลเดอร์ต่างๆ คำถาม "เป็นส่วนหนึ่งของไฟล์ของการผลิตหรือรหัสทดสอบ" ไม่ควรเกิดขึ้น

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


1
เป็นอีกหนึ่งตัวอย่างให้ดูที่โฟลเดอร์ทดสอบ ipython ของ หากมีคนเช็คเอาต์ไม่ว่าพวกเขาจะอยู่ที่ไหนลิงก์ที่เกี่ยวข้องสำหรับการทดสอบก็ยังคงเป็นจริง มันทำให้การทดสอบเล็กน้อยซึ่งสำคัญสำหรับการพิจารณาว่าเครื่อง dev ใหม่ของคุณได้รับการกำหนดค่าอย่างเหมาะสมหรือไม่
Spencer Rathbun

การทดสอบไม่ได้เป็นเพียงส่วนหนึ่งของรหัส แต่เป็นส่วนหนึ่งของเอกสารประกอบและมักเป็นส่วนหนึ่งของข้อมูลจำเพาะ การทดสอบ (ซึ่งเรียกใช้และผ่าน) คือ "เอกสารที่มีชีวิต"
Michael Easter

54

หากคุณไม่รวมการทดสอบหน่วยในซอร์สโค้ดที่เช็คอินแล้ว:

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

บรรทัดล่างฉันจะพิจารณาไม่รวมถึงการทดสอบหน่วยใด ๆ ที่เขียนในแหล่งเก็บรหัสอย่างเป็นทางการเป็นสิ่งที่ดีมาก


7

แน่นอนคุณควรทดสอบหน่วยลงในพื้นที่เก็บข้อมูลด้วยเหตุผลหลายประการ:

  • มันง่ายที่จะเปลี่ยนกลับเป็นเวอร์ชั่นก่อนหน้า
  • คนอื่น ๆ ที่ทำงานในโครงการสามารถเข้าถึงการทดสอบหน่วยได้เช่นกัน
  • บางคนพิจารณาการทดสอบหน่วยเป็นส่วนหนึ่งของเอกสาร (TDD และ BDD)

6

หากมีโอกาสใด ๆ ที่จะรันมันบนคอมพิวเตอร์เครื่องอื่น พวกเขาควรจะสร้างแยกต่างหากดังนั้นผู้ใช้ไม่จำเป็นต้องและพวกเขาอาจมีการพึ่งพาพิเศษ แต่ควรรวมไว้แน่นอน

ฉันสงสัยอย่างยิ่งว่าโครงการส่วนใหญ่ที่ไม่มีการทดสอบในพื้นที่เก็บข้อมูลก็ไม่มี

อาจมีเหตุผลที่จะต้องทำการทดสอบแยกโมดูลดังนั้นคุณสามารถรันการทดสอบใหม่กับรหัสที่เก่ากว่าได้อย่างง่ายดาย มันจะมีประโยชน์สำหรับไลบรารีที่มีเสถียรภาพของ API หรือการทดสอบแบบกล่องดำผ่านทางบรรทัดคำสั่ง มีประโยชน์สำหรับภาษาที่คอมไพล์ซึ่งการทดสอบใหม่อาจจะไม่รวบรวมด้วยรหัสที่เก่ากว่านั้นมี จำกัด


5

อย่างแน่นอน คะแนนโบนัสพิเศษที่นี่คือความสามารถในการติดตามเวอร์ชัน X ของไฟล์ต้นฉบับไปกับการทดสอบเวอร์ชัน Y กล่าวอีกนัยหนึ่งคุณจะต้องสามารถกลับไปเป็นรุ่นก่อนหน้าและดึงการทดสอบที่เหมาะสมที่ออกแบบมาสำหรับเวอร์ชันนั้น (ในกรณีที่มีการเปลี่ยนแปลง API หรือบางอย่าง)


3

ฉันเพิ่งอ่าน"การพัฒนาแอปพลิเคชั่น Brownfield ใน. Net"และนี่ก็ให้คำแนะนำที่ยอดเยี่ยมเกี่ยวกับโครงสร้างของแอปพลิเคชั่นรวมถึงการควบคุมแหล่งที่มาและที่ / วิธี / ทำไมที่จะรวมการทดสอบหน่วย . หากคุณเป็นนักพัฒนา. Net ฉันขอแนะนำ

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