هل يمكن أن يحل اختبار الوحدة الآلي محل فحص النوع الثابت؟

StackOverflow https://stackoverflow.com/questions/415434

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

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

المحلول

وأعتقد أن الآلي وحدة اختبار سيكون <م> هام إلى حيوية المطبوعة اللغات، ولكن هذا لا يعني أنه سيحل محل ثابت نوع التدقيق في سياق التي تقوم بتطبيقها. في الواقع، قد يكون بعض من أولئك الذين يستخدمون الطباعة ودينامية في الواقع استخدامه لأنهم <م> لا نريد متاعب الشيكات نوع سلامة ثابتة.

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

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

نصائح أخرى

وهناك حقيقة واحدة ثابتة حول جودة البرمجيات.

<اقتباس فقرة>   

وإذا كان لا يمكن ترجمة، فإنه لا يمكن أن السفينة

في هذه القاعدة، فإن اللغات كتبته بشكل ثابت الفوز على اللغات المكتوبة بشكل حيوي.

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

<اقتباس فقرة>   

ووكلما كنت قبض على خطأ، وأنها غير مكلفة لإصلاح

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

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

ومن فضلك لا تأخذ هذا المنصب بمثابة تقريع من اللغات الديناميكية. يمكنني استخدام اللغات الديناميكية يوميا وأحبهم. فهي معبرة بشكل لا يصدق ومرنة وتسمح للfanscinating لا يصدق program.s ولكن في حالة الخطأ أوائل التقارير التي لا تفقد إلى لغات كتابتها بشكل ثابت.

لأي مشروع الحجم معقول، أنت فقط لا يمكن حساب لجميع الحالات مع وحدة الاختبارات فقط.

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

إذا كنت تريد البرنامج نوع آمنة، واستخدام أفضل لغة من نوع آمن.

وجود 100٪ تغطية رمز لا يعني أنك قد اختبارها بشكل كامل طلبك. النظر في التعليمات البرمجية التالية:

if (qty > 3)
{
    applyShippingDiscount();
}
else
{
    chargeFullAmountForShipping();
}

ويمكنني الحصول على 100٪ تغطية رمز لو كنت ضخ قيم الكمية = 1 والكمية = 4.

والآن تخيل كانت حالتي الأعمال التي "... لأوامر من 3 أو أكثر من البنود أنا لتطبيق خصم تكاليف الشحن ..". ثم أود أن تحتاج إلى كتابة الاختبارات التي عملت على الحدود. لذلك أود أن تصميم الاختبارات حيث كانت الكمية 2،3 و 4. لا يزال لدي تغطية 100٪ ولكن الأهم من ذلك أنني وجدت خطأ في بلدي المنطق.

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

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

ويميل الناس أيضا أن ننسى قيمة أنواع أعلن والوثائق. على سبيل المثال إذا كان أسلوب جافا بإرجاع List<String>، ثم أنا أعرف على الفور ما يحصل، لا حاجة لقراءة الوثائق وحالات الاختبار أو حتى رمز الأسلوب نفسه. وبالمثل لمعلمات: اذا تم الاعلان عن نوع ثم أنا أعرف ما يتوقعه طريقة

.

وقيمة الإعلان عن نوع من المتغيرات المحلية هي أقل من ذلك بكثير منذ التعليمات البرمجية في مكتوبة بشكل جيد في نطاق وجود متغير يجب أن تكون صغيرة. يمكنك الاستمرار في استخدام الكتابة ثابتة، على الرغم من: بدلا من الإعلان عن نوع كنت اود ان المترجم يستنتج ذلك. لغات مثل سكالا أو حتى <لأ href = "HTTP: //www.danielmoth. كوم / المدونة / 2007/02 / محلي متغير من نوع الاستدلال في وج-30.html "يختلط =" نوفولو noreferrer "> C # تسمح لك ان تفعل هذا.

وبعض أساليب اختبار الحصول على أقرب إلى مواصفات، على سبيل المثال QuickCheck أو أنها سكالا البديل <أ href = على "HTTP: // التعليمات البرمجية. google.com/p/scalacheck/ "يختلط =" نوفولو noreferrer "> ScalaCheck توليد الاختبارات على أساس مواصفات، في محاولة لتخمين حدود المهمة.

وأود أن كلمة ذلك بطريقة مختلفة - إذا لم يكن لديك لغة كتابتها بشكل ثابت، كان لديك <م> أفضل لدينا وحدة الاختبارات دقيق للغاية إذا كنت تخطط لفعل أي شيء "حقيقية" مع أن التعليمات البرمجية.

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

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

لا.

ولكن هذا ليس هو السؤال الأهم، فإن السؤال الأكثر أهمية هو: هل يهم أنه لا يمكن

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

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

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

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

بالنسبة لجافا سكريبت، أتوقع أن يجد jsLint جميع مشكلات التحقق من النوع تقريبًا.في المقام الأول عن طريق اقتراح أنماط ترميز بديلة لتقليل التعرض.

واكتب فحص يساعد تنفيذ العقود <م> بين مكونات في النظام. اختبار وحدة (كما يوحي الاسم) يتحقق من الداخلية منطق المكونات.

لوحدة واحدة من التعليمات البرمجية، وأعتقد أن وحدة اختبار حقا يمكن أن تجعل ثابت نوع التحقق لزوم لها. ولكن في نظام معقد، واختبارات مؤتمتة لا يمكن التحقق من كل الطرق افر أن المكونات المختلفة للنظام قد تتفاعل. لهذا، واستخدام <م> واجهات (التي هي، بمعنى من المعاني، وهو نوع من "العقد" بين مكونات) يصبح أداة مفيدة للحد من الأخطاء المحتملة. وتتطلب واجهات تجميع الوقت نوع التحقق.

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

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