تعلّم كيفية اختبار تمارينك في Bash على Exercism
يمكنك استخدام المحرر على موقع Exercism لحل التمارين. أو نزّل التمارين إلى حاسوبك، وحلّها محليًا ثم أرسلها إلى Exercism. يتناول باقي هذا المستند العمل محليًا.
ستحتاج إلى أداة سطر الأوامر exercism لتنزيل التمارين وإرسالها.
راجع توثيق واجهة سطر أوامر 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
}
لاحظ أن هذا لا يمكن أن يكون سكربت shell، بل يجب أن يكون دالة shell. فسكربتات shell تُنفَّذ في عملية فرعية ولا تستطيع التأثير في بيئة shell الحالية (مثل دليل العمل الحالي).
للاختبار على مسار bash، نستخدم bats.
شغّل اختبارات تمرين «whatever» الافتراضي هكذا:
cd /path/to/your/exercise_workspace/bash/whatever
bats whatever.bats
إذا أردت طباعة مخرجات التنقيح أثناء تشغيل الاختبارات محليًا، فراجع التنقيح محليًا.
bats-core
ينبغي أن تتمكن من تثبيته من مدير الحزم المفضّل لديك:
على 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 متوفرة لـ Fedora 30 وما بعده، ويمكنك تثبيتها بـ
sudo dnf install bats
في توزيعات 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]
...
$ 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 على MinGW، وقبل تشغيل سكربت التثبيت قد ترغب في تنفيذ:
$ git checkout v1.1.0
لمعرفة معنى أوامر 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 مثقلًا بالأخطاء البرمجية وقد هُجر.
نُقلت ملكيته في عام 2017: sstephenson/bats#150 (تعليق).
إذا كان لديك الإصدار الأصلي sstephenson/bats مثبتًا (تحقق عبر bats -v؛ فإذا أظهر رقم إصدار أقل من 1.0)، فعليك الانتقال إلى bats-core؛ وإلا فقد تواجه أعطال اختبار غير مفسّرة.