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

इस उदाहरण में टेस्ट फाइल लाइन 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 की अपनी शैली के मुताबिक कोड लिखना सीखने में मदद करते हैं।