Pruebas en el track de Bash

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.

Exercism CLI

Necesitarás la herramienta de línea de comandos exercism para descargar y enviar ejercicios. Consulta la documentación de la CLI de exercism.

Función envoltorio para la herramienta 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.

Probar de forma local

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.

Instalar bats-core

Deberías poder instalarlo desde tu gestor de paquetes favorito:

Para Mac (brew)

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
  • El paquete bats heredado también existe en el ecosistema de Homebrew. No instales ese por error: instala bats-core.

Para Linux

Fedora 30 y posteriores

bats está empaquetado para Fedora 30 y posteriores, puedes instalarlo con

sudo dnf install bats

Otros Linux

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]
...

Para Windows (MINGW64/Cygwin)

$ 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

bats-assert

Para saber qué significan los distintos comandos assert* de las pruebas, consulta la documentación de la biblioteca bats-assert.

Pruebas omitidas

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.

Anular las omisiones

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

El bats heredado

bats-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.