การทดสอบหน่วยสำหรับไลบรารีการคำนวณทางวิทยาศาสตร์


15

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

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

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

หนึ่งในปัญหาที่ใหญ่ที่สุดของฉันคือโครงสร้างข้อมูล การทดสอบเดียวที่ฉันสามารถทำได้สำหรับต้นไม้ kd คือการทดสอบความเครียด: แทรกเวกเตอร์สุ่มจำนวนมากแล้วทำการค้นหาแบบสุ่มจำนวนมากและเปรียบเทียบกับการค้นหาเชิงเส้นที่ไร้เดียงสา ประสิทธิภาพเดียวกัน และด้วยเครื่องมือเพิ่มประสิทธิภาพตัวเลขฉันมีฟังก์ชั่นมาตรฐานซึ่งฉันสามารถทดสอบได้ แต่จากนั้นอีกครั้งนี่คือการทดสอบความเครียด ฉันไม่คิดว่าการทดสอบเหล่านี้สามารถจัดเป็นการทดสอบหน่วยและที่สำคัญที่สุดทำงานอย่างต่อเนื่องเนื่องจากส่วนใหญ่ค่อนข้างหนัก แต่ฉันก็คิดว่าการทดสอบเหล่านี้ต้องทำฉันไม่สามารถแทรกสององค์ประกอบป๊อปรูทและใช่มันใช้ได้กับกรณี 0-1-n

ดังนั้นถ้ามีจะมีวิธีทดสอบ (หน่วย) สำหรับซอฟต์แวร์ประเภทนี้หรือไม่ และฉันจะจัดระเบียบการทดสอบหน่วยและวิธีที่หนักหน่วงรอบวงจรการสร้างรหัสคอมมิชชันได้อย่างไร

คำตอบ:


19

ฉันจะบอกว่าการคำนวณทางวิทยาศาสตร์ค่อนข้างเหมาะสำหรับการทดสอบหน่วย คุณมีอินพุตและเอาต์พุตที่ชัดเจนการกำหนดล่วงหน้าและ postconditions ที่ชัดเจนซึ่งอาจไม่เปลี่ยนแปลงทุก ๆ สัปดาห์ตามความต้องการของนักออกแบบและไม่มีข้อกำหนด UI ที่ยากต่อการทดสอบ

คุณตั้งชื่อองค์ประกอบบางอย่างที่อาจทำให้เกิดปัญหา นี่คือสิ่งที่ต้องทำเกี่ยวกับพวกเขา:

  • อัลกอริทึมแบบสุ่ม: มีสองความเป็นไปได้ หากคุณต้องการทดสอบการสุ่มตัวอย่างเพียงแค่กำหนดจำนวนครั้งซ้ำ ๆ และยืนยันว่าสัดส่วนของคดีที่คาดหวังตรงกับเกณฑ์ที่ต้องการโดยมีระยะขอบผิดพลาดมากพอที่ข้อผิดพลาดการทดสอบปลอมจะค่อนข้างยาก (A ชุดทดสอบว่าสัญญาณกลับกลอก Phantom ข้อบกพร่องเป็นมากยิ่งกว่าคนที่ไม่ได้จับทุกข้อบกพร่องที่เป็นไปได้.) หรือใช้เป็นแหล่งสุ่มกำหนดและแทนที่นาฬิการะบบ (หรือสิ่งที่เป็นคุณใช้) ที่มีแหล่งกำหนดผ่านการพึ่งพา การฉีดเพื่อให้การทดสอบของคุณคาดการณ์ได้อย่างเต็มที่
  • อัลกอริธึมที่กำหนดไว้เฉพาะในแง่ของความแม่นยำ / การเรียกคืน: ไม่มีสิ่งใดหยุดคุณจากการใส่ชุดข้อมูลทั้งชุดและการวัดความแม่นยำและการเรียกคืนโดยการเพิ่มพวกเขาทั้งหมด เป็นเพียงคำถามของการสร้างกรณีทดสอบแบบกึ่งอัตโนมัติอย่างมีประสิทธิภาพเพื่อให้ข้อมูลการทดสอบไม่ได้กลายเป็นปัญหาคอขวดสำหรับผลผลิตของคุณ อีกทางหนึ่งคือการระบุคู่อินพุต / เอาต์พุตที่เลือกอย่างรอบคอบและยืนยันว่าอัลกอริธึมคำนวณว่าอินพุตที่ต้องการสามารถทำงานได้หากรูทีนนั้นสามารถคาดเดาได้เพียงพอ
  • ข้อกำหนดที่ไม่สามารถใช้งานได้: หากข้อมูลจำเพาะให้ความต้องการพื้นที่ / เวลาอย่างชัดเจนจริงๆแล้วคุณต้องเรียกใช้ชุดข้อมูลทั้งหมดของคู่อินพุต / เอาต์พุตและตรวจสอบว่าการใช้ทรัพยากรสอดคล้องกับรูปแบบการใช้งานที่ต้องการโดยประมาณ เคล็ดลับที่นี่คือการสอบเทียบคลาสการทดสอบของคุณเองก่อนเพื่อที่คุณจะได้ไม่ต้องวัดปัญหาสิบข้อด้วยขนาดที่แตกต่างกันซึ่งจบลงด้วยการวัดเร็วเกินไปหรือใช้เวลานานมาก คุณยังสามารถเขียนตัวสร้างเคสขนาดเล็กที่ใช้สร้างกรณีทดสอบที่มีขนาดแตกต่างกันขึ้นอยู่กับความเร็วของ PU ที่กำลังทำงานอยู่
  • การทดสอบที่รวดเร็วและช้า: ไม่ว่าจะเป็นการทดสอบแบบหน่วยหรือการรวมเข้าด้วยกันคุณมักจะจบด้วยการทดสอบที่รวดเร็วมากและการทดสอบที่ช้ามาก ตั้งแต่ใช้การทดสอบของคุณเป็นประจำมีค่ามากฉันมักจะไปในทางปฏิบัติและแยกทุกอย่างที่ฉันมีให้เป็นชุดที่ช้าและช้าเพื่อให้ชุดที่รวดเร็วสามารถวิ่งได้บ่อยเท่าที่จะเป็นไปได้ การทดสอบสอง 'ความหมาย' อยู่ด้วยกันหรือไม่

+1 ขอบคุณมากมีหลายอย่างถ้าคำตอบของคุณมีความเข้าใจลึกซึ้ง เพียงแค่คำถามสองสามข้อ: วิธีการเกี่ยวกับอัลกอริธึมการเพิ่มประสิทธิภาพเช่นเมตา - ฮิวริสติก ฉันมีฟังก์ชันมาตรฐานมากมาย แต่สิ่งที่ฉันทำได้คือเปรียบเทียบอัลกอริธึมที่ต่างกันสองแบบ ฉันต้องหาอัลกอริธึมเปรียบเทียบสมรรถนะด้วยหรือไม่ อัลกอริธึมทางพันธุกรรมถูกต้องหมายความว่าอย่างไร และฉันจะทดสอบแต่ละกลยุทธ์ "แบบปรับพารามิเตอร์ได้" เช่นประเภทของการรวมตัวกันใหม่และการกลายพันธุ์ ฯลฯ ได้อย่างไร
Alejandro Piad

1
สำหรับเมตา - ฮิวริสติกฉันจะเลือกคู่ I / O ที่มีลักษณะเฉพาะบางอย่างนั่นคือ "ความสำเร็จที่โด่งดัง" ของรูทีนและตรวจสอบว่าวิธีการ (หรือที่ดีกว่าหนึ่งในสอง) นั้นหาวิธีแก้ปัญหานี้ ปัญหา "การหยิบเชอร์รี่" ที่เกิดขึ้นกับการทำงานได้ดีนั้นเป็นเรื่องที่ไม่ต้องทำในการวิจัยการปรับให้เหมาะสม แต่สำหรับการทดสอบซอฟต์แวร์ที่ไม่เกี่ยวข้อง - คุณไม่ได้ยืนยันคุณภาพของอัลกอริทึม นั่นคือ "ความถูกต้อง" เท่านั้นที่คุณสามารถพิสูจน์ได้ สำหรับกิจวัตร parametrizable ทวีคูณ: ใช่ฉันกลัวว่าต้องมีการทดสอบจำนวน combinatorial ...
Kilian Foth

ดังนั้นมันเหมือนการออกแบบมาตรฐานเล็ก ๆ น้อย ๆ ที่การใช้งานที่ถูกต้องทั้งหมดควรแก้ไขใช่มั้ย มีวิธีการพิสูจน์คุณภาพของอัลกอริทึมหรือไม่? ฉันรู้ว่าฉันไม่สามารถกำหนดมาตรฐานคุณภาพได้เกือบตลอดเวลา แต่อย่างน้อยฉันก็ปรารถนาได้ว่าจะไม่มีการเปลี่ยนแปลงใด ๆ
Alejandro Piad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.