ชุดทดสอบสำหรับแอปพลิเคชันตัวเลขใน C ++?


13

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

อย่างไรก็ตามฉันสงสัยว่าการมีเครื่องมือที่เหมาะสมในการทำให้กระบวนการเป็นอัตโนมัติ (หรือช่วยปรับปรุงประสิทธิภาพ) นั้นจะมีประโยชน์อย่างแน่นอน ในทางกลับกันฉันไม่ทราบตัวเลือกต่างๆสำหรับชุดทดสอบ C ++ และวิธีการตัดสินใจระหว่างกัน

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

คำตอบ:


11

ปัญหาของการทดสอบรหัสตัวเลขคือ (i) คุณอาจไม่ทราบผลลัพธ์ที่แน่นอนเสมอไปและคุณจะสามารถบันทึกผลลัพธ์ของการคำนวณทันทีเพื่อเปรียบเทียบกับในภายหลัง - เช่นเพื่อทำการทดสอบการถดถอยและ (ii) ผลลัพธ์ที่ได้อาจแตกต่างกันเล็กน้อยในเครื่องที่แตกต่างกันเนื่องจากการปัดเศษที่แตกต่างกัน

หากต้องการดูว่าดีลนี้จัดการอย่างไรให้ดูที่นี่: http://www.dealii.org/developer/development/testsuite.html#regression_tests


จุดที่ดีเกี่ยวกับข้อ จำกัด ของการทดสอบหน่วย การทดสอบการถดถอยเป็นสิ่งที่ดี (แน่นอนดีกว่าไม่ทดสอบเลยเพราะเอาท์พุทไม่เป็นที่รู้จัก; มันสามารถให้สัญญาณเตือนเกี่ยวกับข้อบกพร่อง) สำหรับปัญหาการปัดเศษเครื่องจะช่วยบรรเทาปัญหาที่เกิดจากการเลือกความอดทนที่ดีผ่านการลองผิดลองถูกหรือไม่?
Geoff Oxberry

2
มันคงเป็นความเจ็บปวด ในการทดสอบมากกว่า 10 ปีเราไม่เคยมีกลยุทธ์ที่ดีที่จะจัดการกับมัน การใช้ numdiff แทน diff สามารถช่วยได้ แต่ท้ายที่สุดคุณต้องกำหนดเครื่องหนึ่งที่คุณเก็บ "0.3987" แทน "0.3988" คุณจะได้เครื่องอื่นเมื่อหมายเลขที่ถูกต้องคือ 0.39875 ไม่ว่าคุณจะตั้งค่าเกณฑ์ไว้ที่ใดคุณจะตัดหมายเลขหนึ่งออกจากที่อื่นผิด
Wolfgang Bangerth

@WolfgangBangerth มีแฟล็กเฉพาะของคอมไพเลอร์บางตัวซึ่งทำให้พฤติกรรมของจุดลอยตัวกำหนดขึ้นได้มากขึ้น เช่น / fp: เข้มงวด | แม่นยำและ / Qimf-arch-สอดคล้อง: จริง (คอมไพเลอร์ Intel) หรือ -fnounsafe-math-optimisation, -ffloat-store (GCC) สามารถทำให้โค้ดของคุณสอดคล้องกันและทำซ้ำได้มากขึ้นในราคาที่ประสิทธิภาพ . ด้วยการปรับแต่งบางอย่างนี้ให้สร้าง "ทำซ้ำ" พิเศษซึ่งสามารถนำมาใช้สำหรับการทดสอบโดยเฉพาะ
André

@ Andre - โอ้ใช่เราลองทั้งหมดเหล่านี้ มันยังคงเป็นเรื่องยาก :-)
Wolfgang Bangerth

10

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


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

4

หากคุณกำลังสร้างรหัสด้วย CMake กลไกctestจะเป็นตัวเลือกที่ชัดเจน จะช่วยให้คุณทดสอบรหัสของคุณด้วยตนเองผ่านทางคำสั่งctestและยังสนับสนุนการทดสอบคืนกว้างขวางผ่านCDASH


1

สำหรับเราชีววิทยาไลบรารี c ++ คำนวณ ( บริสุทธิ์ ) ที่เราใช้http://cxxtest.com/ มันใช้งานง่ายใช้งานได้ดีมีมาโครสองสามตัวสำหรับการทดสอบด้วยassert()คำสั่งสไตล์ สำหรับการคำนวณทางวิทยาศาสตร์เหล่านี้จะเปรียบเทียบโดยตรงง่ายโดยทั่วไปกับหรือการเปรียบเทียบเชิงตัวเลขกับTS_ASSERT_EQUALS(a,b)TS_ASSERT_DELTA(a,b,tolerance)

สามารถเขียนมาโครพิเศษได้อย่างง่ายดายโดยใช้พื้นฐานเหล่านี้เพื่อเปรียบเทียบเวกเตอร์ / เมทริกซ์ที่คุณเลือกเอง มีประโยชน์คุณสามารถตรวจสอบว่ารหัสของคุณส่งคำเตือนและข้อความแสดงข้อผิดพลาดที่เหมาะสมในสถานการณ์ที่กำหนด คุณสามารถเรียกดูตัวอย่างในtestโฟลเดอร์ของซอร์สโค้ดของเราได้ที่นี่: https://chaste.cs.ox.ac.uk/trac/browser/trunk

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