سؤال

كلاهما بتاريخ BDD (تطوير السلوك يحركه) أطر اختبار الوحدة القادرة ل Scala مكتوب في Scala. و المواصفات بنيت على قد تنطوي أيضا على scalatest. إطار العمل. ولكن ماذا تقدم المواصفات Scalatest لا؟ ما هي الاختلافات؟

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

المحلول

المواصفات والقمالة هي أدوات جيدة مع مستخدمين سعداء، لكنها تختلف بعدة طرق. ربما تريد اختيار واحدة كأداة اختبار الرئيسية في Scala، ولكن لا تحتاج إلى التخلي عن الآخر لأنه يمكنك استخدام قطع من كليهما. إذا كنت تحب scalatest FeatureSpec بناء جملة "بناء جملة ومصرف"، على سبيل المثال، يمكنك وضع ملفات جرة في Classpath واستخدام كلاهما في نفس الوقت. هنا سأحاول التقاط اختلافات فلسفة التصميم الرئيسية التي لاحظتها بين المواصفات والقصالة.

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

Scalatest يدعم BDD من خلال Spec, FeatureSpec, WordSpec, FlatSpec, ، و GivenWhenThen الصفات، ولها أيضا سمات يمكنك مزجها للحصول على بناء جملة لطيفة Matcher. إذا كنت تحب "يجب"، فأنت تخلط في الإضارات. إذا كنت تحب "يجب"، فإنك تختلط MustMatchers. وبعد ولكن إذا كنت تحب BDD ولكن لا تحب بناء جملة Matcher، فيمكنك فقط استخدام واحدة من سمات ScalaTest Supples دون خلط في سمة المتراءات. تحتوي المواصفات على فئة مواصفات تمتد، ويجب عليك استخدام الكلمة "يجب" في تعبيرات Matcher الخاصة بك. هناك فرق فلسفي كبير واضح هنا هو أن Scalatest يمنحك المزيد من الخيارات. لجعل مساحة الاختيار هذه أسهل للتنقل، أقدم شجرة قرار هنا:

http://www.scalatest.org/quick_start.

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

تحتوي المواصفات على المزيد من المتراءات من Scalatest، وأعتقد أن تعكس الفرق في موقف التصميم. أنا فعلا قطعت على الأرجح 2/3 من بناء جملة Matcher لقد بنيت ونظرت في الإصدار. سأضيف المزيد من المتراءات في الإصدارات المستقبلية، لكنني أراد أن أكون متأكدا من أنني أعرف المستخدمين أرادوا بالفعل شيئا قبل إضافته. ومع ذلك، تتضمن مراكي ScalaTest بناء جملة ملكية ديناميكية مع بعض الركود. على سبيل المثال في المواصفات يمكنك الكتابة على java.io.File:

file must beDirectory

هذا سوف يستدعي isDirectory وتأكد من أن هذا صحيح. Scalatest ليس لديه أي مراكز خاصة java.io.Files حاليا، ولكن في Scalatest، يمكنك فقط استخدام شيك ديناميكي مثل هذا:

file must be a ('directory)

في أي وقت تمر رمز في بعد be, وسوف تستخدم التفكير للبحث عن (في هذه الحالة) طريقة أو حقل يسمى directory أو طريقة اسمي isDirectory. وبعد هناك أيضا طريقة لجعل هذا ثابت، من خلال تحديد BePropertyMatcher (الذي يتطلب فقط 2 أو 3 خطوط من التعليمات البرمجية عادة). في الأساس في Squalatest أحاول تقديم المزيد من الوظائف مع أقل API.

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

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

  • ===, ، مما يعني يساوي
  • >, ، مما يعني أكبر من
  • <, ، أقل من
  • >=, ، أكبر من أو يساوي
  • <=, ، اصغر من او يساوي.

هذا هو. لذلك هذه الأشياء تبدو وكأنها ما يعني. إذا رأيت في رمز شخص آخر:

result should be <= 7

أملي هو أنك لن تحتاج إلى الركض إلى وثائق API لتخمين ما هذا <= يعني. على النقيض من ذلك، فإن المواصفات أكثر حرية مع المشغلين. لا حرج في ذلك، لكنه فرق. يمكن للمشغلين إجراء رمز أكثر إيجازا، ولكن المفاضلة قد تضطر إلى تشغيلها إلى الوثائق عندما تجد أشياء مثل ->-, >>, |, |>, !, ، أو ^^^ (التي لها معاني خاصة في المواصفات) في قانون اختبار زميلك.

إحدى الفرق الفلسفي الآخر هو أنني أحاول أن أجعلها أسهل قليلا في Squalatest لاستخدام نمط وظيفي عندما تحتاج إلى مشاركة لاعبا اساسيا، في حين يستمر المواصفات بشكل افتراضي تقليد setUp و tearDown نهج مشهور بواسطة Junit، الذي تقوم بإعادة تعيينه vars قبل كل اختبار. ومع ذلك، إذا كنت ترغب في اختبار بهذه الطريقة، فمن السهل جدا في Scalatest. تحتاج فقط إلى مزج في BeforeAndAfter سمة.

للحصول على المزيد من البصيرة في Squalatest، يمكنك مشاهدة عرض تقديمي "احصل على أعلى مع Scalatest" أعطيت في مؤتمر Devoxx 2009 هنا:

http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about.

نصائح أخرى

الاختلافات الرئيسية هي (معظمها من وجهة نظر المواصفات :-)):

  • يوفر Scalatest أكثر أنماط اختبار "أكثر من المواصفات (يمكنك زيارة كل نقطة رصاصة على بداية سريعة الصفحة للحصول على عرض مفصل على كل نمط)

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

  • تم إعطاء Mockito دعم لطيف BDD في المواصفات: mockito.

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

  • في المواصفات، يمكنك تحديد الأمثلة التي يتم تداخلها كما libidum و تنظيفها تلقائيا في كل مستوى

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

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

آمل أن يساعد هذا.

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

دعم IDE قد يكون نقطة أخرى

لقد كنت أحاول الحصول على مواصفات للعمل مع الكسوف من خلال جونيت، ووجدت الحل الرسمي ليكون قليلا "Hacky". إعداد المواصفات: http://code.google.com/p/specs/wiki/runningpecs#run_your_specification_with_junit4_in_eclipse.

تكامل ScalaTest (أيضا من خلال Junit) مع يبدو أقل قليلا. ومع ذلك، ليس لدي أي منهم للعمل بالإضافة إلى جونيت وجافا.

إعداد Squalatest: http://groups.google.com/group/scalatest-users/web/running-scalat-from-eclipse.

إذا كان عامل قرار واحد هو وقت الترجمة، scalatest يبدو أن أداء أفضل.

نحن نستخدم حاليا Specs2 في مشروعنا، لكنني تعاني من أوقات ترجمة بطيئة في الاختبارات. لقد انتهيت للتو من POC أثناء الانتقال إلى Scalatest وشاهد Compled Times Drop من خلال عامل حوالي 0.82 فقط عن طريق تحويل الأطر 2 في بعض مصادرنا.

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