Aprende a probar tus ejercicios de Bash en Exercism
Puedes usar el editor en línea del sitio web de Exercism para resolver los ejercicios. O bien, descarga los ejercicios en tu ordenador, resuélvelos en local y luego envíalos a Exercism. El resto de este documento trata sobre cómo trabajar en local.
Necesitarás la herramienta de línea de comandos exercism para descargar y enviar ejercicios.
Consulta la documentación de la CLI de exercism.
Un aspecto molesto de la herramienta exercism predeterminada es que, después de descargar un ejercicio, tienes que cambiar de directorio manualmente.
Esta función envoltorio se encarga de eso por ti; guárdala en tu ~/.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
}
Ten en cuenta que no puede ser un script de shell, tiene que ser una función de shell. Los scripts de shell se ejecutan en un proceso hijo y no pueden afectar al entorno (como el directorio de trabajo actual) de tu shell actual.
Para probar en la pista de Bash, usamos bats.
Ejecuta las pruebas del hipotético ejercicio «whatever» así:
cd /path/to/your/exercise_workspace/bash/whatever
bats whatever.bats
Si quieres imprimir la salida de depuración mientras ejecutas las pruebas en local, consulta Depurar en local.
bats-core
Deberías poder instalarlo desde tu gestor de paquetes favorito:
En macOS con Homebrew, sería algo así:
$ 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 heredado también existe en el ecosistema de Homebrew.
No instales ese por error: instala bats-core.bats está empaquetado para Fedora 30 y posteriores, puedes instalarlo con
sudo dnf install bats
En otras distribuciones de Linux, puede que la implementación de bats que usamos no esté empaquetada de forma cómoda.
La mejor forma de instalarlo es desde el código fuente.
Si quieres instalarlo en /usr/local, entonces
git clone https://github.com/bats-core/bats-core
cd bats-core/
sudo ./install.sh /usr/local
Después de eso, suponiendo que /usr/local/bin esté en tu $PATH, ya puedes hacer:
$ 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
Nota: si estás usando el obsoleto https://github.com/sstephenson/bats.git y te encuentras con un error como cp: cannot create symbolic link '${HOME}/bin/bats': No such file or directory, tienes que copiar manualmente el contenido de la carpeta bin/bats/libexec/ en ${HOME}/bin/.
Hay informes de que las versiones más recientes de bats no funcionan bien en bash de MinGW. Antes de ejecutar el script de instalación, quizá quieras hacer:
$ git checkout v1.1.0
Para saber qué significan los distintos comandos assert* de las pruebas, consulta la documentación de la biblioteca bats-assert.
Resolver un ejercicio significa hacer que pasen todas sus pruebas. De forma predeterminada, solo se ejecuta una prueba (la primera) cuando ejecutas las pruebas. Esto es intencionado, ya que te permite centrarte en hacer que pase solo esa prueba. Cuando pase, puedes habilitar la siguiente prueba comentando o eliminando las
[[ $BATS_RUN_SKIPPED == true ]] || skip
anotaciones que preceden a las demás pruebas.
Para ejecutar todas las pruebas, incluidas las que tienen anotaciones skip, puedes establecer la variable de entorno BATS_RUN_SKIPPED con el valor true.
Una forma de establecerla solo mientras se ejecuta bats es:
BATS_RUN_SKIPPED=true bats exercise_name.bats
Puede resultar cómodo usar una función envoltorio para escribir menos:
bats() {
BATS_RUN_SKIPPED=true command bats *.bats
}
Luego, ejecuta las pruebas simplemente con:
bats
bats heredadobats-core se bifurcó de la implementación original de bats.
El proyecto sstephenson/bats tenía bastantes errores y había sido abandonado.
La propiedad se cedió en 2017: sstephenson/bats#150 (comentario).
Si tienes instalado el sstephenson/bats original (compruébalo con bats -v, que debe mostrar un número de versión inferior a 1.0), deberías cambiar a bats-core; de lo contrario, podrías acabar sufriendo fallos de pruebas inexplicables.