الاختبار في مسار Haskell

تعلّم كيفية اختبار تمارينك في Haskell على Exercism


تشغيل الاختبارات

نفّذ الأمر التالي في دليل التمرين لتشغيل الاختبارات:

stack test

لتشغيل الاختبارات عند كل حفظ للملف، نفّذ هذا الأمر بدلًا منه:

stack test --file-watch

إذا ظهرت لك رسالة خطأ كهذه...

No .cabal file found in directory

فأنت على الأرجح تستخدم إصدارًا قديمًا من stack وتحتاج إلى ترقيته.

وإلا، إذا ظهرت لك رسالة خطأ كهذه...

No compiler found, expected minor version match with...
Try running "stack setup" to install the correct GHC...

فافعل ما تقوله لك فحسب، وسينزّل إصدار المترجم الصحيح ويثبّته:

stack setup

حل التمرين

حل التمرين هو وحدة Haskell. يُعرَّف اسم الوحدة في عبارة استيراد داخل مجموعة الاختبارات، عادةً في البداية:

import Test.Hspec        (Spec, describe, it, shouldBe)
import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith)

import ModuleName (someFunc)

main :: IO ()
main ...

في هذا المثال، يستورد ملف الاختبار، في السطر 4، وحدة اسمها ModuleName تُصدّر دالة اسمها someFunc. هذا يعني أنه عليك إنشاء ملف اسمه ModuleName.hs يكون على شيء مثل هذا:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

ستجد ملفًا بهذا الاسم موجودًا بالفعل في src/، ويمكنك استخدامه نقطة انطلاق لحلك.

لا تنسَ أن هذا الهيكل الأولي موجود فقط لت帮助你 تبدأ. لا تتردد في تغييره كليًا إن رأيت أن ذلك هو الصواب.

استخدام الحزم

إن أردت استخدام بعض الحزم لكتابة حل أكثر أناقة، فأضف الحزم أولًا إلى تبعيات حلك في package.yaml:

library:
  exposed-modules: ModuleName
  source-dirs: src
  dependencies:
    - foo
    - bar

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

  • الحزم التي تأتي مثبّتة مسبقًا مع GHC (وأبرزها base، containers، array، time، mtl، deepseq، exceptions، bytestring)، إضافةً إلى
  • الحزم المبنية مسبقًا لمشغّل الاختبارات، والمدرجة في haskell-test-runner/pre-compiled/package.yaml.

إن سلّمت حلًا يستخدم حزمة غير متاحة، فسيصطدم مشغّل الاختبارات بغياب اتصاله بالإنترنت وينتج خطأً كهذا:

Cabal file info not found for unavailable-package-1.0@..., updating
Selected mirror https://hackage.haskell.org/
Downloading root
HttpExceptionRequest Request {
  host                 = "hackage.haskell.org"
  ...
}
 (ConnectionFailure ...)

تشغيل GHCi

إن أردت التجربة بحلك في GHCi، فنفّذ الأمر:

stack ghci

HLint (اختياري)

يوصى بشدة بتشغيل hlint على حلك لترى إن كان يلتقط شيئًا فاتك:

hlint ModuleName.hs

لست مضطرًا لقبول كل الاقتراحات التي يقدمها hlint، لكنها عادةً ما تساعدك على تعلم كيفية كتابة كود Haskell جميل وسليم الأسلوب.