Bash ट्रैक पर टेस्टिंग

Exercism पर अपने Bash अभ्यासों का टेस्ट करना सीखिए


अभ्यास हल करने के लिए आप Exercism की वेबसाइट पर मौजूद ऑनलाइन एडिटर इस्तेमाल कर सकते हैं। या फिर अभ्यास अपने कंप्यूटर पर डाउनलोड कीजिए, उन्हें वहीं हल कीजिए और उसके बाद Exercism पर सबमिट कीजिए। इस दस्तावेज़ के बाकी हिस्से में हम अपने कंप्यूटर पर काम करने की बात करेंगे।

Exercism CLI

अभ्यास डाउनलोड करने और सबमिट करने के लिए आपको exercism कमांड-लाइन टूल की ज़रूरत होगी। exercism CLI का दस्तावेज़ देखिए।

exercism टूल के लिए रैपर फंक्शन

डिफॉल्ट exercism टूल में एक दिक्कत यह है कि अभ्यास डाउनलोड करने के बाद आपको डायरेक्टरी खुद बदलनी पड़ती है। यह रैपर फंक्शन वह काम आपके लिए कर देता है। इसे अपनी ~/.bashrc में रखिए।

exercism () {
    local out
    readarray -t out < <(command exercism "$@")
    printf '%s\n' "${out[@]}"
    if [[ $1 == "download" && -d "${out[-1]}" ]]; then
        cd "${out[-1]}" || return 1
    fi
}

ध्यान रखिए कि यह शेल स्क्रिप्ट नहीं हो सकता, इसे शेल फंक्शन ही होना चाहिए। शेल स्क्रिप्ट एक अलग चाइल्ड प्रोसेस में चलती हैं और आपके मौजूदा शेल का वातावरण (जैसे मौजूदा वर्किंग डायरेक्टरी) नहीं बदल सकतीं।

अपने कंप्यूटर पर टेस्ट चलाना

bash ट्रैक पर टेस्ट चलाने के लिए हम bats इस्तेमाल करते हैं।

मान लीजिए "whatever" नाम का कोई काल्पनिक अभ्यास है, उसके टेस्ट इस तरह चलाइए:

cd /path/to/your/exercise_workspace/bash/whatever
bats whatever.bats

अगर आप अपने कंप्यूटर पर टेस्ट चलाते समय डीबग आउटपुट देखना चाहते हैं, तो स्थानीय तौर पर डीबग करना देखिए।

bats-core इंस्टॉल करना

आप इसे अपने पसंदीदा पैकेज मैनेजर से इंस्टॉल कर सकते हैं:

Mac के लिए (brew)

macOS पर Homebrew के साथ यह कुछ इस तरह दिखेगा:

$ brew install bats-core
==> Downloading https://github.com/bats-core/bats-core/archive/v1.1.0.tar.gz
==> Downloading from https://codeload.github.com/bats-core/bats-core/tar.gz/v1.1.0
######################################################################## 100.0%
==> ./install.sh /usr/local/Cellar/bats-core/1.1.0
🍺  /usr/local/Cellar/bats-core/1.1.0: 13 files, 55KB, built in 4 seconds
  • Homebrew में पुराना bats पैकेज भी उपलब्ध है। उसे गलती से भी इंस्टॉल न कीजिए: bats-core इंस्टॉल कीजिए.

Linux के लिए

Fedora 30 और उसके बाद के संस्करण

Fedora 30 और उसके बाद के संस्करणों के लिए bats का पैकेज मौजूद है। आप इसे इस तरह इंस्टॉल कर सकते हैं

sudo dnf install bats

बाकी Linux

बाकी Linux डिस्ट्रीब्यूशन में हम जो bats इस्तेमाल करते हैं, उसका पैकेज शायद आसानी से उपलब्ध न हो। इसे सोर्स से इंस्टॉल करना ही सबसे अच्छा तरीका है। अगर आप इसे /usr/local के अंदर इंस्टॉल करना चाहते हैं, तो

git clone https://github.com/bats-core/bats-core
cd bats-core/
sudo ./install.sh /usr/local

इसके बाद, यह मानते हुए कि /usr/local/bin आपके $PATH में है, अब आप यह कर सकते हैं:

$ bats
Error: Must specify at least one <test>
Usage: bats [-cr] [-f <regex>] [-j <jobs>] [-p | -t] <test>...
       bats [-h | -v]
...

Windows के लिए (MINGW64/Cygwin)

$ git clone https://github.com/bats-core/bats-core.git
$ cd bats-core
$ ./install.sh $HOME

ध्यान दीजिए: जब आप पुराने https://github.com/sstephenson/bats.git का इस्तेमाल कर रहे हों और आपको cp: cannot create symbolic link '${HOME}/bin/bats': No such file or directory जैसी एरर मिले, तो आपको bin/bats/libexec/ फोल्डर की सामग्री ${HOME}/bin/ में खुद कॉपी करनी होगी।

कुछ रिपोर्टों में कहा गया है कि bats के नए वर्शन MinGW bash पर ठीक से काम नहीं करते, इसलिए इंस्टॉल स्क्रिप्ट चलाने से पहले आप शायद यह करना चाहें:

$ git checkout v1.1.0

bats-assert

टेस्ट में मौजूद अलग-अलग assert* कमांड का मतलब समझने के लिए bats-assert लाइब्रेरी का दस्तावेज़ देखिए।

छोड़े गए टेस्ट

किसी अभ्यास को हल करने का मतलब है उसके सारे टेस्ट पास कराना। टेस्ट चलाने पर डिफॉल्ट रूप से सिर्फ एक टेस्ट (पहला वाला) चलता है। यह जानबूझकर ऐसा है, ताकि आप पूरा ध्यान सिर्फ उसी एक टेस्ट को पास कराने पर लगा सकें। वह पास हो जाए, तो आप अगला टेस्ट चालू कर सकते हैं। इसके लिए बाकी टेस्ट के आगे लिखे इन

[[ $BATS_RUN_SKIPPED == true ]] || skip

एनोटेशन को कमेंट कर दीजिए या हटा दीजिए।

skip को ओवरराइड करना

सारे टेस्ट चलाने के लिए, उन टेस्ट समेत जिन पर skip एनोटेशन लगे हैं, आप BATS_RUN_SKIPPED नाम के एनवायरनमेंट वेरिएबल की वैल्यू true सेट कर सकते हैं। सिर्फ bats चलाने की अवधि के लिए इसे सेट करने का एक तरीका यह है:

BATS_RUN_SKIPPED=true bats exercise_name.bats

टाइपिंग बचाने के लिए रैपर फंक्शन इस्तेमाल करना सुविधाजनक रहता है:

bats() {
    BATS_RUN_SKIPPED=true command bats *.bats
}

फिर टेस्ट चलाने के लिए बस यह लिखिए:

bats

पुराना bats

bats-core को मूल bats इम्प्लीमेंटेशन से फोर्क किया गया था। sstephenson/bats प्रोजेक्ट में काफी बग थे और उसे छोड़ दिया गया था। 2017 में इसका स्वामित्व किसी और को सौंप दिया गया: sstephenson/bats#150 (comment).

अगर आपके यहाँ मूल sstephenson/bats इंस्टॉल है (bats -v चलाकर देखिए; अगर यह 1.0 से कम वर्शन बताता है), तो आपको bats-core पर स्विच कर लेना चाहिए। वरना आपके साथ बिना किसी साफ कारण के टेस्ट फेल होने की स्थिति आ सकती है।