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)

Homebrew-সহ macOS-এ এটি দেখতে অনেকটা এমন হবে:

$ 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 অ্যানোটেশনযুক্তগুলোসহ সব টেস্ট চালাতে, আপনি একটি এনভায়রনমেন্ট ভ্যারিয়েবল 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 প্রজেক্টটি বেশ বাগপূর্ণ ছিল এবং পরিত্যক্ত হয়ে গিয়েছিল। ২০১৭ সালে এর মালিকানা হস্তান্তর করা হয়: sstephenson/bats#150 (comment)।

আপনার যদি মূল sstephenson/bats ইনস্টল করা থাকে (bats -v দিয়ে পরীক্ষা করুন, যদি এটি 1.0-এর কম ভার্সন নম্বর দেখায়), তাহলে আপনার bats-core-এ চলে যাওয়া উচিত; নইলে আপনি হয়তো ব্যাখ্যাহীন টেস্ট ব্যর্থতার সম্মুখীন হবেন।