سؤال

أنا مقتنع بأن اختبار البرمجيات مهم للغاية ، خاصة في العلوم. ومع ذلك ، على مدى السنوات الست الماضية ، لم أجد أي مشروع برمجي علمي كان قيد الاختبارات العادية (ومعظمهم لم يتم التحكم في الإصدار).

الآن أتساءل كيف تتعامل مع اختبارات البرمجيات للرموز العلمية (الحسابات العددية).

من وجهة نظري ، غالبًا ما تفوت اختبارات الوحدة القياسية هذه النقطة ، حيث لا توجد نتيجة دقيقة ، لذلك باستخدام assert(a == b) قد يكون من الصعب بعض الشيء بسبب الأخطاء العددية "العادية".

لذلك أنا أتطلع إلى قراءة أفكارك حول هذا.

هل كانت مفيدة؟

المحلول

أنا أيضًا في الأوساط الأكاديمية وقد كتبت برامج محاكاة ميكانيكية كمية ليتم تنفيذها على المجموعة لدينا. لقد قدمت نفس الملاحظة فيما يتعلق بالاختبار أو حتى التحكم في الإصدار. كنت أسوأ: في حالتي ، أستخدم مكتبة C ++ لمحاكاة بلدي ، والرمز الذي حصلت عليه من الآخرين هو رمز السباغيتي الخالص ، لا ميراث ، ولا حتى وظائف.

لقد أعادت كتابتها وقمت أيضًا بتطبيق بعض اختبارات الوحدة. أنت محق في أنه يتعين عليك التعامل مع الدقة العددية ، والتي يمكن أن تكون مختلفة اعتمادًا على الهندسة المعمارية التي تعمل عليها. ومع ذلك ، فإن اختبار الوحدة ممكن ، طالما أنك تأخذ أخطاء التقريب العددية هذه في الاعتبار. لا ينبغي أن تعتمد نتيجتك على تقريب القيم العددية ، وإلا سيكون لديك مشكلة مختلفة مع متانة الخوارزمية الخاصة بك.

لذلك ، في الختام ، أستخدم اختبار الوحدة لبرامجي العلمية ، وهو يجعل حقًا أكثر ثقة في النتائج ، خاصة فيما يتعلق بنشر البيانات في النهاية.

نصائح أخرى

مجرد النظر في مشكلة مماثلة (Google: "اختبار البرامج العلمية") وتوصل إلى بعض الأوراق التي قد تكون ذات أهمية. تغطي هذه أخطاء الترميز الدنيوية والقضايا الأكبر لمعرفة ما إذا كانت النتيجة صحيحة (عمق عباءة الأرض؟)

http://http.icsi.berkeley.edu/ftp/pub/speech/papers/wikipapers/cox_harris_testing_numerical_software.pdf

http://www.cs.ua.edu/~secse09/presentations/09_hook.pdf (الرابط المكسور ؛ الرابط الجديد هو http://www.se4science.org/workshops/secse09/presentations/09_hook.pdf)

http://www.associationforsoftwaretesting.org/؟dl_name=dianekellyRebeccasanders_TheChallengeStingStingScientificsoftware_paper.pdf

اعتقدت أن فكرة اختبار الطفرة الموصوفة في 09_hook.pdf (انظر أيضًا matmute.sourceforge.net) مثيرة للاهتمام بشكل خاص لأنها تحاكي الأخطاء البسيطة التي نرتكبها جميعًا. الجزء الأصعب هو تعلم استخدام التحليل الإحصائي لمستويات الثقة ، بدلاً من مراجعات رمز المرور الفردي (MAN أو الجهاز).

المشكلة ليست جديدة. أنا متأكد من أن لدي نسخة أصلية من "ما مدى دقة البرنامج العلمي؟" بقلم هاتون وآخرون أكتوبر 1994 ، حتى ذلك الحين ، أظهرت كيف تباعدت تطبيقات مختلفة لنفس النظريات (كخوارزميات) بسرعة إلى حد ما (إنها أيضًا المرجع 8 في ورقة كيلي آند ساندرز)

أنا أيضًا أستخدم CPPTest لـ TEST_ASSERT_DELTA. أنا أكتب برامج رقمية عالية الأداء في المغناطيسية الكهرومغناطيسية الحاسوبية وكنت بسعادة استخدمها في برامج C ++ الخاصة بي.

عادةً ما أقوم باختبار التعليمات البرمجية العلمية بنفس الطريقة التي أفعل بها مع أي نوع آخر من التعليمات البرمجية ، مع عدد قليل من عمليات التنقل ، وهي:

  • أقوم دائمًا باختبار رمواتي العددية للحالات التي لا معنى لها وتأكد من أن الحساب يتوقف بالفعل قبل إنتاج نتيجة. لقد تعلمت هذا بالطريقة الصعبة: كان لدي وظيفة كانت تقوم بحساب بعض استجابات التردد ، ثم قدمت مصفوفة مصممة معهم إلى وظيفة أخرى كحجيلات أعطت إجابتها في النهاية. كان من الممكن أن تكون المصفوفة أي حجم حسب عدد المحطات التي تم تطبيق الإشارة عليها ، لكن وظيفتي لم تكن تتحقق مما إذا كان حجم المصفوفة متسقًا مع عدد المحطات (يجب أن يكون المحطتان يعنيان مصفوفة 2 × 2 XN) ؛ ومع ذلك ، فقد تم لف الرمز نفسه حتى لا يعتمد على ذلك ، لم يهتم بمقاييس المصفوفات لأنه كان عليها فقط القيام ببعض عمليات المصفوفة الأساسية عليها. في نهاية المطاف ، كانت النتائج معقولة تمامًا ، ضمن النطاق المتوقع ، وفي الواقع ، صحيحة جزئيًا - تم تشويه نصف متجه الحل فقط. استغرق الأمر مني بعض الوقت. إذا كانت بياناتك تبدو صحيحة ، فسيتم تجميعها في بنية بيانات صالحة وكانت القيم العددية جيدة (على سبيل المثال لا NANS أو عدد سالب للجزيئات) ولكنها لا معنى لها ، يجب أن تفشل الوظيفة بأمان.

  • أقوم دائمًا باختبار إجراءات الإدخال/الإخراج حتى لو كانوا يقرأون مجموعة من الأرقام المفصلية من ملف اختبار. عندما تكتب رمزًا يقوم بالرياضيات الملتوية ، من المغري دائمًا القفز إلى تصحيح الجزء من الكود الذي يتميز بالرياضيات الثقيلة لدرجة أنك تحتاج إلى هزة الكافيين فقط لفهم الرموز. بعد أيام ، تدرك أنك تضيف أيضًا قيمة ASCII لـ \n إلى قائمة النقاط الخاصة بك.

  • عند اختبار علاقة رياضية ، أقوم دائمًا باختبارها "حسب الكتاب" ، وقد تعلمت ذلك أيضًا. لقد رأيت الكود الذي كان من المفترض أن يقارن متجهين ولكن فقط فحص مساواة العناصر ولم يتحقق من المساواة في الطول.

يرجى إلقاء نظرة على الإجابات على السؤال كيفية استخدام TDD بشكل صحيح لتنفيذ طريقة رقمية؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top