กลยุทธ์สำหรับการทดสอบหน่วยและการพัฒนาที่ขับเคลื่อนด้วยการทดสอบ


16

ฉันเป็นผู้สนับสนุนอย่างมากในการพัฒนาโดยใช้การทดสอบในการคำนวณทางวิทยาศาสตร์ ยูทิลิตี้ในทางปฏิบัติเป็นเพียงการส่ายและบรรเทาปัญหาคลาสสิกที่นักพัฒนาโค้ดรู้ได้อย่างแท้จริง อย่างไรก็ตามมีปัญหาในการทดสอบรหัสทางวิทยาศาสตร์ที่ไม่พบในการเขียนโปรแกรมทั่วไปดังนั้นข้อความ TDD จึงไม่มีประโยชน์อย่างยิ่งในการสอน ตัวอย่างเช่น:

  • โดยทั่วไปคุณไม่ทราบคำตอบที่แน่นอนสำหรับปัญหาซับซ้อนที่กำหนดไว้สำหรับนิรนัยดังนั้นคุณจะเขียนข้อสอบได้อย่างไร

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

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

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

ตัวอย่างการทดสอบที่ฉันเขียนสำหรับรหัสทางวิทยาศาสตร์:

  • สำหรับผู้รวบรวมเวลาให้ใช้ ODE แบบง่ายๆด้วยโซลูชันที่แน่นอนและทดสอบว่าผู้รวมระบบของคุณแก้ไขได้ภายในความแม่นยำที่กำหนดและลำดับความแม่นยำนั้นถูกต้องโดยการทดสอบด้วยขนาดขั้นตอนที่แตกต่างกัน

  • การทดสอบความเสถียรแบบไร้ศูนย์: ตรวจสอบว่าวิธีที่มี 0 ขอบเขต / เงื่อนไขเริ่มต้นยังคงอยู่ที่ 0

  • การทดสอบการแก้ไข: ให้ฟังก์ชันเชิงเส้นมั่นใจว่าการแก้ไขนั้นถูกต้อง

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

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


คุณช่วยอธิบายให้ชัดเจนว่าคุณหมายถึงอะไรโดยการทดสอบการแก้ไข?
Dmitry Kabanov

คำตอบ:


8

วิธีการแก้ปัญหาการผลิต

ตรวจสอบจากการปรับแต่งการศึกษาว่าวิธีการได้รับความถูกต้องตามทฤษฎี

การอนุรักษ์คำตอบ การทำสำเนาโซลูชันที่ชาญฉลาดและฉลาด


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

3
2×2×2

วรรณกรรมจำนวนมากที่ฉันเคยเห็นใน MMS นั้นเป็นวิธีการแก้ปัญหาระดับโลกเช่นสำหรับปัญหา CFD โซลูชันที่ผลิตขึ้นอาจเป็นการวิเคราะห์ airfoil เมื่อการทดสอบนี้ล้มเหลวที่ดีที่สุดคุณได้ลดจำนวนผู้ร้ายลงเหลือ 5,000 บรรทัดดังนั้นมันจึงค่อนข้างไร้ค่าสำหรับ TDD - คุณไม่มีเงื่อนงำที่ความล้มเหลวที่แท้จริงเกิดขึ้น ฉันเห็นด้วยกับปัญหา 2x2x2 นั้นมีค่ามากและฉันก็ใช้มันบ่อยๆ แต่เป็นเรื่องธรรมดาที่ฉันพบปัญหาที่ปรากฏขึ้นกับระบบขนาดใหญ่เท่านั้น ฉันเพิ่งพบข้อผิดพลาดของคอมไพเลอร์ ifort เมื่อเร็ว ๆ นี้ที่ประจักษ์ในปัญหาใหญ่เท่านั้น
Aurelius

@Aurelius: ไม่มีข้อโต้แย้งที่นี่ คุณควรมีการทดสอบหลายช่วงและให้ทำการทดสอบทุกครั้ง
Bill Barth

@Aurelius ที่ค่าใบหน้า MMS ไม่ใช่การทดสอบหน่วย แต่เป็นการทดสอบการใช้งานหรือการยอมรับ (เช่นของทั้งระบบ) อย่างไรก็ตามรหัสมักจะมีขั้นตอนที่แยกจากกัน (หรือสามารถแบ่งออกเป็นพวกเขา) เช่น advection, pressure, viscosity หนึ่งสามารถทดสอบเพียงหนึ่งในขั้นตอนเหล่านี้ ("หน่วย") ในทำนองเดียวกันรหัสสามารถทดสอบได้โดยไม่ต้อง BC และจากนั้นมีหนึ่งรหัส เพื่อนคนหนึ่งทำปริญญาเอกของเขาในการทดสอบหน่วยและเขาคิดว่าผลประโยชน์ที่ยิ่งใหญ่ที่สุดคือมันบังคับให้คุณเลิกโปรแกรมของคุณเป็นหน่วย ๆ ดังนั้นมันอาจจะผ่านการทดสอบหน่วย ... บางทีนี่อาจจะใช้ได้มากกว่าที่นี่ในตอนแรก (และ ในทางอื่นที่ฉันไม่รู้)
hyperpallium

6

การเรียกเก็บเงินได้ระบุไว้สองสามวิธีที่เกี่ยวข้องกับข้อกังวลของคุณ

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

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


1
หากต้องการเพิ่มคำตอบของกุยประสบการณ์ที่เขาพูดจากมีการเข้ารหัสใน ~ 3,000 ทดสอบเราทำงานบน deal.II ทุกครั้งหลังการเปลี่ยนแปลง: dealii.org/developer/development/... ในคำถามว่าจะทำอย่างไรถ้าคุณไม่รู้คำตอบที่ถูกต้อง: เขียนข้อสอบต่อไปและให้มันเปรียบเทียบคำตอบในวันนี้กับคำตอบเมื่อวาน (หรือเมื่อใดก็ตามที่คุณเขียนข้อสอบ) การมีวิธีการสังเกตการเปลี่ยนแปลงในผลลัพธ์ของโค้ดนั้นมีค่าแม้ว่าคุณจะไม่รู้ว่าพวกเขาทำให้คำตอบนั้นไม่ถูกต้องหรือแก้ไขคำตอบที่ไม่ถูกต้องก่อนหน้านี้
Wolfgang Bangerth

3

ฉันเพิ่งพบวิทยานิพนธ์ TDD นี้ในวิทยาศาสตร์การคำนวณ ฉันยังไม่ได้อ่านดังนั้นฉันจึงไม่รู้ว่ามันดี แต่หวังว่ามันจะช่วยได้บ้าง

http://cyber.ua.edu/files/2014/12/u0015_0000001_0001551.pdf


1
ฉันอ่านบทนำและข้อสรุปบางส่วนและสมมติว่ามีคุณภาพระดับเทียบเท่ากับวิทยานิพนธ์ระดับปริญญาเอกทั้งสองนี้อธิบายกระบวนการ (ในระดับสูง) และให้การวัดจริงตามประสิทธิภาพ ฉันคิดว่ามันค่อนข้างหา
Godric Seer

ลิงค์ตาย คุณหมายถึง: Nanthaamornphong, A. “ ประสิทธิผลของการพัฒนาโดยใช้การทดสอบและเทคนิคการสร้างใหม่ในการคำนวณทางวิทยาศาสตร์และการพัฒนาซอฟต์แวร์ทางวิศวกรรม” ปริญญาเอก diss., Uni. อลาบามา (2014)
AlQuemist
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.