Apprends à tester tes exercices Bash sur Exercism
Tu peux utiliser l'éditeur en ligne sur le site d'Exercism pour résoudre les exercices. Ou bien, télécharge les exercices sur ton ordinateur, résous-les en local, puis soumets-les à Exercism. Le reste de ce document porte sur le travail en local.
Tu auras besoin de l'outil en ligne de commande exercism pour télécharger et soumettre des exercices.
Consulte la documentation de l'Exercism CLI.
Un aspect pénible de l'outil exercism par défaut, c'est qu'après avoir téléchargé un exercice, tu dois changer de répertoire manuellement.
Cette fonction d'enrobage s'en charge pour toi ; place-la dans ton ~/.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
}
Remarque : ça ne peut pas être un script shell, ça doit être une fonction shell. Les scripts shell sont exécutés dans un processus enfant et ne peuvent pas modifier l'environnement de ton shell courant (comme le répertoire de travail courant).
Pour tester sur le parcours bash, on utilise bats.
Lance les tests de l'exercice hypothétique « whatever » comme ceci :
cd /path/to/your/exercise_workspace/bash/whatever
bats whatever.bats
Si tu veux afficher la sortie de débogage pendant que tu lances les tests en local, consulte Débogue en local.
bats-core
Tu devrais pouvoir l'installer depuis ton gestionnaire de paquets préféré :
Sur macOS avec Homebrew, ça donne à peu près ceci :
$ 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 existe aussi dans l'écosystème Homebrew.
N'installe surtout pas celui-là par erreur : installe bats-core.bats est empaqueté pour Fedora 30 et les versions plus récentes, tu peux l'installer avec
sudo dnf install bats
Pour les autres distributions Linux, l'implémentation de bats que l'on utilise n'est peut-être pas disponible dans les paquets.
La meilleure façon de l'installer est depuis les sources.
Si tu veux l'installer dans /usr/local, alors
git clone https://github.com/bats-core/bats-core
cd bats-core/
sudo ./install.sh /usr/local
Ensuite, en supposant que /usr/local/bin soit dans ton $PATH, tu peux maintenant faire :
$ 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
Remarque : si tu utilises l'ancien dépôt https://github.com/sstephenson/bats.git et que tu tombes sur une erreur comme cp: cannot create symbolic link '${HOME}/bin/bats': No such file or directory, tu dois copier manuellement le contenu du dossier bin/bats/libexec/ dans ${HOME}/bin/.
D'après certains retours, les versions récentes de bats ne se comportent pas bien avec le bash de MinGW. Avant de lancer le script d'installation, tu peux vouloir faire :
$ git checkout v1.1.0
Pour comprendre la signification des différentes commandes assert* des tests, consulte la documentation de la bibliothèque bats-assert.
Résoudre un exercice, c'est faire passer tous ses tests. Par défaut, un seul test (le premier) est exécuté quand tu lances les tests. C'est voulu : ça te permet de te concentrer uniquement sur la réussite de ce test. Une fois qu'il passe, tu peux activer le test suivant en commentant ou en supprimant les
[[ $BATS_RUN_SKIPPED == true ]] || skip
annotations qui précèdent les autres tests.
Pour lancer tous les tests, y compris ceux qui portent une annotation skip, tu peux définir une variable d'environnement BATS_RUN_SKIPPED sur la valeur true.
Une façon de la définir juste le temps de lancer bats est :
BATS_RUN_SKIPPED=true bats exercise_name.bats
Ça peut être pratique d'utiliser une fonction d'enrobage pour taper moins :
bats() {
BATS_RUN_SKIPPED=true command bats *.bats
}
Ensuite, lance les tests avec simplement :
bats
bats historiquebats-core est un fork de l'implémentation originale de bats.
Le projet sstephenson/bats était assez bogué et avait été abandonné.
La propriété a été transférée en 2017 : sstephenson/bats#150 (commentaire).
Si tu as installé le bats original de sstephenson (vérifie que bats -v affiche un numéro de version inférieur à 1.0), tu devrais passer à bats-core ; sinon tu risques de te retrouver face à des échecs de tests inexpliqués.