Haskell ট্র্যাকে টেস্টিং

Exercism-এ আপনার Haskell অনুশীলনীগুলো কীভাবে টেস্ট করবেন তা জানুন


টেস্ট চালানো

টেস্ট চালাতে আপনার অনুশীলনীর ডিরেক্টরিতে নিচের কমান্ডটি চালান:

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 ...

এই উদাহরণে, টেস্ট ফাইলটি ৪ নম্বর লাইনে 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 কোড লেখা শিখতে সাহায্য করে।