الاختبار في مسار Bash

تعلّم كيفية اختبار تمارينك في Bash على Exercism


يمكنك استخدام المحرر على موقع Exercism لحل التمارين. أو نزّل التمارين إلى حاسوبك، وحلّها محليًا ثم أرسلها إلى 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

ينبغي أن تتمكن من تثبيته من مدير الحزم المفضّل لديك:

على 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
  • توجد أيضًا حزمة bats القديمة في منظومة homebrew. لا تثبّتها بالخطأ: ثبّت bats-core.

على Linux

Fedora 30 وما بعده

حزمة bats متوفرة لـ Fedora 30 وما بعده، ويمكنك تثبيتها بـ

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 الأحدث لا تعمل جيدًا مع bash على MinGW، وقبل تشغيل سكربت التثبيت قد ترغب في تنفيذ:

$ 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 مثقلًا بالأخطاء البرمجية وقد هُجر. نُقلت ملكيته في عام 2017: sstephenson/bats#150 (تعليق).

إذا كان لديك الإصدار الأصلي sstephenson/bats مثبتًا (تحقق عبر bats -v؛ فإذا أظهر رقم إصدار أقل من 1.0)، فعليك الانتقال إلى bats-core؛ وإلا فقد تواجه أعطال اختبار غير مفسّرة.