آزمایش در مسیر Bash

یاد بگیرید چگونه تمرین‌های Bash خود را در Exercism آزمایش کنید


می‌توانید برای حل تمرین‌ها از ویرایشگر آنلاین در وب‌سایت 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
}

دقت کنید که این نمی‌تواند یک اسکریپت پوسته باشد؛ باید یک تابع پوسته باشد. اسکریپت‌های پوسته در یک فرآیند فرزند اجرا می‌شوند و نمی‌توانند محیط پوسته‌ی فعلی شما (مثل پوشه‌ی کاری جاری) را تغییر دهند.

اجرای test به‌صورت محلی

برای test کردن در مسیر bash، از bats استفاده می‌کنیم.

testهای تمرین فرضی «whatever» را این‌طور اجرا کنید:

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

اگر می‌خواهید هنگام اجرای testها به‌صورت محلی خروجی debug را چاپ کنید، به debug به‌صورت محلی نگاه کنید.

نصب bats-core

باید بتوانید آن را از مدیر بسته‌ی موردعلاقه‌ی خودتان نصب کنید:

برای مک (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
  • بسته‌ی قدیمی bats هم در اکوسیستم homebrew وجود دارد. آن را اشتباهی نصب نکنید: bats-core را نصب کنید.

برای لینوکس

فدورا ۳۰ و جدیدتر

bats برای فدورا ۳۰ و جدیدتر بسته‌بندی شده است؛ می‌توانید آن را این‌طور نصب کنید

sudo dnf install bats

سایر لینوکس‌ها

برای سایر توزیع‌های لینوکس، ممکن است پیاده‌سازی 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]
...

برای ویندوز (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 در bash مینگویی خوب کار نمی‌کنند؛ پیش از اجرای اسکریپت نصب، شاید بخواهید این کار را بکنید:

$ git checkout v1.1.0

bats-assert

برای کمک گرفتن در معنای دستورهای مختلف assert* در testها، به مستندات کتابخانه‌ی bats-assert مراجعه کنید.

testهای نادیده‌گرفته‌شده

حل کردن یک تمرین یعنی اینکه همه‌ی testهایش قبول شوند. به‌صورت پیش‌فرض، وقتی testها را اجرا می‌کنید فقط یک test (اولین test) اجرا می‌شود. این کار عمدی است، چون به شما اجازه می‌دهد فقط روی قبول شدن همان یک test تمرکز کنید. وقتی آن یکی قبول شد، می‌توانید test بعدی را با کامنت کردن یا حذف کردن

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

annotationهایی که ابتدای بقیه‌ی testها آمده‌اند فعال کنید.

لغو نادیده‌گرفتن testها

برای اجرای همه‌ی testها، از جمله آن‌هایی که annotation skip دارند، می‌توانید متغیر محیطی BATS_RUN_SKIPPED را روی مقدار true تنظیم کنید. یک راه برای تنظیم آن فقط برای مدت اجرای bats این است:

BATS_RUN_SKIPPED=true bats exercise_name.bats

ممکن است استفاده از یک تابع پوششی برای صرفه‌جویی در تایپ کردن راحت باشد:

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

بعد testها را فقط با این دستور اجرا کنید:

bats

bats قدیمی

bats-core از پیاده‌سازی اصلی bats فورک شد. پروژه‌ی sstephenson/bats پر از bug بود و رها شده بود. مالکیت آن در سال ۲۰۱۷ واگذار شد: sstephenson/bats#150 (comment).

اگر نسخه‌ی اصلی sstephenson/bats را نصب دارید (با bats -v بررسی کنید؛ اگر شماره‌ی نسخه‌ای کمتر از 1.0 گزارش کند)، باید به bats-core روی بیاورید؛ وگرنه ممکن است با شکست‌های بی‌توضیح test روبه‌رو شوید.