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 a tu computadora, resuélvelos de forma local y luego envíalos a Exercism. El resto de este documento trata sobre cómo trabajar de forma 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 el entorno (como el directorio de trabajo actual) de tu shell actual.
Para probar en el track de bash usamos bats.
Ejecuta las pruebas del hipotético ejercicio «whatever» de esta forma:
cd /path/to/your/exercise_workspace/bash/whatever
bats whatever.bats
Si quieres imprimir la salida de depuración mientras ejecutas las pruebas de forma local, consulta Depurar de forma local.
bats-core
Deberías poder instalarlo desde tu gestor de paquetes favorito:
En macOS con Homebrew se vería más o menos 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
Para otras distribuciones de Linux, la implementación de bats que usamos puede que no esté empaquetada de forma conveniente.
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/ a ${HOME}/bin/.
Hay reportes de que las versiones más nuevas de bats no se comportan bien en MinGW bash. Antes de ejecutar el script de instalación, quizás quieras hacer lo siguiente:
$ 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 todas sus pruebas pasen. De forma predeterminada, cuando ejecutas las pruebas solo se ejecuta una (la primera). Esto es intencional, ya que te permite concentrarte solo en hacer que esa prueba pase. Cuando pase, puedes habilitar la siguiente prueba comentando o eliminando las
[[ $BATS_RUN_SKIPPED == true ]] || skip
anotaciones que anteceden a las demás pruebas.
Para ejecutar todas las pruebas, incluidas las que tienen anotaciones skip, puedes asignar el valor true a la variable de entorno BATS_RUN_SKIPPED.
Una forma de asignarlo solo durante la ejecución de bats es:
BATS_RUN_SKIPPED=true bats exercise_name.bats
Puede resultar conveniente usar una función envoltorio para ahorrar tecleo:
bats() {
BATS_RUN_SKIPPED=true command bats *.bats
}
Luego ejecuta las pruebas solo con:
bats
bats heredadobats-core se creó como un fork a partir 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 (comment).
Si tienes instalado el sstephenson/bats original (compruébalo con bats -v; si reporta un número de versión menor que 1.0), deberías cambiarte a bats-core; de lo contrario, puede que termines experimentando fallos de pruebas inexplicables.