سؤال

هناك بعض المكتبات الجميلة للاختبار في Scala (المواصفات, scalatest., scalacheck.). ومع ذلك، يتم التعبير عن نظام SCALA القوي من النوع، وأجزاء مهمة من واجهة برمجة التطبيقات التي تم تطويرها في Scala بشكل ثابت، وعادة ما يكون في شكل سلوك غير مرغوب فيه أو غير مسموح به من قبل المحول البرمجي.

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

قائمة اختبار مثال مفتون:

val list: List[Int] = List(1, 2, 3)
// should not compile
// list.add("Chicka-Chicka-Boom-Boom")

هل تعامل أحد مكتبات الاختبار الحالية مع الحالات مثل هذا؟ هل هناك نهج يستخدم الناس هذا يعمل؟

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

should {
  notCompile(<code>
    val list: List[Int] = List(1, 2, 3)
    list.add("Chicka-Chicka-Boom-Boom")
  </code>)
}

أو، شيء على غرار توقع-Type البرنامج النصي يسمى المترجم.

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

المحلول

لقد أنشأت بعض المواصفات التي تنفذ بعض مقتطفات التعليمات البرمجية والتحقق من نتائج المترجم.

يمكنك إلقاء نظرة على مقتطفات سمة. الفكرة هي تخزينها في بعض ORG.SPECS.UTIL.Property [Snippet] التعليمات البرمجية لتنفيذ:

val it: Property[Snippet] = Property(Snippet(""))
"import scala.collection.List" prelude it // will be prepended to any code in the it snippet
"val list: List[Int] = List(1, 2, 3)" snip it // snip some code (keeping the prelude)
"list.add("Chicka-Chicka-Boom-Boom")" add it  // add some code to the previously snipped code. A new snip would remove the previous code (except the prelude)

 execute(it) must include("error: value add is not a member of List[Int]") // check the interpreter output

العيب الرئيسي الذي وجدته مع هذا النهج كان بطء المترجم. لا أعرف بعد كيف يمكن استلام هذا.

إريك.

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