Test کردن در مسیر Haskell

یاد بگیرید چگونه تمرین‌های Haskell خود را در Exercism Test کنید


اجرای تست‌ها

برای اجرای تست‌ها، دستور زیر را در پوشه‌ی تمرین خود اجرا کنید:

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 در مجموعه‌ی تست تعریف می‌شود، که معمولاً در ابتدای آن قرار دارد:

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

import ModuleName (someFunc)

main :: IO ()
main ...

در این مثال، فایل تست در خط ۴ ماژولی به اسم ModuleName را import می‌کند که تابعی به اسم someFunc را export می‌کند. یعنی باید فایلی به اسم ModuleName.hs بسازید که چیزی شبیه این باشد:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

فایلی با همین اسم از قبل در src/ وجود دارد که می‌توانید از آن به عنوان نقطه‌ی شروع راه‌حل خود استفاده کنید.

فقط به خاطر داشته باشید که این stub تنها برای اینکه کار را شروع کنید آنجا گذاشته شده است. اگر فکر می‌کنید تغییر کامل آن کار درستی است، با خیال راحت آن را کاملاً تغییر دهید.

استفاده از بسته‌ها

اگر می‌خواهید برای نوشتن راه‌حلی زیباتر از چند بسته استفاده کنید، اول بسته‌ها را به وابستگی‌های راه‌حل خود در 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 زیبا و اصولی بنویسید.