سؤال

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

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

المحلول

نعم جيدا. في الواقع لا، لكنني درست تحت الرجل الذي طور في الأصل Quickcheck وهو رجل مثير للاهتمام حقا.

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

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

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

1,2,3,4 // original
1,2 3,4 // split into A and B
2,1 4,3 // reverse A and B
4,3,2,1 // concat B and A

هذه خاصية رائعة لاختبارها مع QuickCheck تسمى المواصفات والنتيجة مذهلة للغاية.

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

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

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

إنه الكثير من العمل لكتابة خصائص QuickCheck ولكن النتيجة النهائية هي اختبار أفضل. كما قال يوحنا نفسه، يتم اكتشاف 70٪ من الأخطاء من خلال اختبار الوحدة، ولكن هذا هو 30٪ آخر يسبب تحطم البرنامج الخاص بك. QuickCheck يختبر تلك آخر 30٪.

نصائح أخرى

لقد قمت بمشكلة Haskell الحقيقية التي تنطوي على محاكاة حدث منفصل. لذلك كتبت مكتبة DES استنادا إلى استمرار موناد، جنبا إلى جنب مع المعادلات إلى MVARS والقنوات. كنت بحاجة إلى التحقق من أن هذا يعمل بشكل صحيح، لذلك كتبت مجموعة من خصائص QuickCheck لإظهار ذلك، على سبيل المثال، سيتم دمج تدفقتين من البيانات المتزامنة المكتوبة إلى قناة بشكل صحيح دون إسقاط أي شيء.

لقد استخدمت أيضا QuickCheck للتوثيق والتحقق من الخصائص في بلدي تراوحت مجموعات و عدد عشري المكتبات.

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

prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)

يمكنني استخدام QuickCheck للحصول على الكثير من الأشياء الشخصية. خلال الأشهر الستة الماضية:

  • ركض Quickcheck لاختبار التحولات الملونة وتحويل الجنينات المنفصلة في ضاغط الصور.

  • ران Quickcheck لاختبار وحدة التمايز الرمزي التي قمت بجلدها لبعض التحسين العددي.

  • ران Quickcheck لاختبار شجرة بحث ثغرية في أسلوب Bentley و Sedgewick.

QuickCheck نادرا ما يلتقي الكل احتياجات اختبار الوحدة الخاصة بي، لكنها طريقة رائعة للبدء --- وقوانين QuickCheck توثيق جيد.

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

ومع ذلك، هنا أقل تافهة قليلا من تجربتي الشخصية: http://www.haskell.org/haskellwiki/quickcheck_as_a_test_set_generator.

scalacheck. (quickcheck for scala) يستخدم لاختبار جاوة الوظيفية, ، مكتبة، من بين أشياء أخرى، تنفذ quickcheck لجافا.

يتم اختبار afaik xmonad على نطاق واسع مع QuickCheck

لقد استخدمت فقط Haskell في بيئة إنتاج لتطوير أدوات المساعد الصغيرة. أساسا لأنني المطور الوحيد الذي أعرفه أن يقرأ Haskell. لقد استخدمت QuickCheck على نطاق واسع، وحصلت على إزعاج حقا من أن شيئا ما غير متوفر في C #. لذلك قررت أن أجرب و اكتبها بنفسي. وبعد نظرت إلى PEX أيضا، ولكن وجدت تقنيات استكشاف البرامج المستخدمة لإيجاد الحد الأدنى للإدخال أقل إثارة للاهتمام من الطريقة التي يقوم بها QuickCheck ذلك.

يمكنني استخدام QuickCheck لاختبار سلوك برامج سطر الأوامر مكتوبة بأي لغة.

من المفيد بشكل خاص إيجاد المدخلات التي تعطل البرامج المنخفضة المستوى أو المكتوبة بشكل حيوي.

للراحة، كتبت http://hackage.haskell.org/package/proctest., والذي يتضمن بعض الأمثلة على QuickCheck قيد الاستخدام مع HSPEC و Hunit لاختبار برامج سطر الأوامر بهذه الطريقة.

نحن نستخدم fscheck. للتحقق من أن ترجمة OCaml To F # صحيحة، وأن إصداراتنا الأمثل تعمل بنفس الإصدارات غير المسموح بها. أخطط أيضا لاستخدامها لاختبار Lexer والمحافظة منذ نول يستخدم المشروع أ محلل المحرك.

لدينا أيضا وظائف المساعد التي تسمح لنا بتشغيل الاختبار nunit (xunit ل .NET). يرى assertprop..

لقد استخدمت Quickcheck للاختبار SMS PDU Encoder و Decoder في منصة LG Linux Mobile. هناك إصدار (قديم) من قطعة من البرامج التي قمت بتطويرها في ذلك الوقت متاح للتنزيل في http://hackage.haskell.org/package/gensmspdu-0.1.

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

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