Estándares de codificación
Crear módulos de Terraform reutilizables

Bats para testear scripts

Bats para testear scripts

Bats es un marco de prueba para shell scripts (scripts de shell) en Unix-like systems, es decir, para testear scripts en por ejemplo Bash. La palabra «Bats» es un acrónimo de «Bash Automated Testing System». Bats proporciona una forma estructurada y fácil de escribir pruebas para scripts de shell, lo que permite a los sysAdmin verificar que sus scripts funcionan como se espera en una variedad de situaciones.

También te puede interesar:

Una breve historia de las shells

Características de Bats

Algunas características y ventajas de Bats incluyen:

  • Sintaxis sencilla: Bats utiliza una sintaxis simple y fácil de entender para definir y ejecutar pruebas en scripts de shell.
  • Pruebas autocontenidas: Cada prueba en Bats se ejecuta en su propio subproceso, lo que ayuda a garantizar la independencia de las pruebas y evita que los resultados de una prueba afecten a otras.
  • Soporte de informes detallados: Bats genera informes de prueba detallados que muestran cuáles pruebas pasaron y cuáles fallaron. Esto facilita la identificación y corrección de problemas.
  • Integración con otros marcos de prueba: No solo puedes testear scripts con Bats, en combinación con otros marcos de prueba más amplios también puedes abordar pruebas a nivel de sistema o pruebas de integración.
  • Amplia comunidad: Bats es una herramienta popular en la comunidad de desarrollo de shell scripts, por lo que puedes encontrar recursos y ejemplos en línea para ayudarte a escribir y ejecutar pruebas de manera efectiva.

Para usar Bats, debes escribir tus pruebas en archivos con extensión .bats que contienen las pruebas específicas para testear scripts de shell. Luego, ejecutas Bats en esos archivos para realizar las pruebas y verificar si el comportamiento es el esperado.

Bats es especialmente útil cuando trabajas en proyectos que dependen de scripts de shell y deseas garantizar que funcionen correctamente y sigan funcionando correctamente a medida que se realizan cambios en el código. Además, es muy simple de añadirlo en pipelines que inspeccione tu código en cada despliegue.

Ejemplos de Bats para testear scripts

Puedes crear un archivo .bats para cada uno de estos ejemplos y ejecutar las pruebas con Bats. Asegúrate de tener Bats instalado en tu sistema antes de comenzar.

Prueba básica de éxito

Supongamos que tienes un script llamado my_script.sh que simplemente imprime «Hola, mundo!» en la pantalla. Puedes escribir una prueba Bats para verificar que el script produce la salida correcta.

# hello_world_test.bats
@test "Verificar que el script produce 'Hola, mundo!'" {
  run bash my_script.sh
  [ "$status" -eq 0 ]
  [ "$output" = "Hola, mundo!" ]
}

Luego, ejecuta las pruebas con bats hello_world_test.bats.

Prueba de fallo

Imagina que tienes un script llamado division.sh que realiza una división. Puedes escribir una prueba que verifica cómo maneja el script un escenario de división por cero.

# division_test.bats
@test "Verificar que el script maneja la división por cero" {
  run bash division.sh 10 0
  [ "$status" -ne 0 ]
  [ "$output" = "Error: División por cero" ]
}

Prueba de manejo de argumentos

Si tu script acepta argumentos de línea de comandos, puedes escribir pruebas para verificar que los argumentos se manejen correctamente.

# arguments_test.bats
@test "Verificar que el script maneja argumentos correctamente" {
  run bash my_script.sh arg1 arg2
  [ "$status" -eq 0 ]
  [ "$output" = "Argumentos: arg1, arg2" ]
}

Pruebas para funciones de script

Si tu script contiene funciones, también puedes escribir pruebas específicas para esas funciones.

# functions_test.bats
@test "Verificar que la función suma funciona correctamente" {
  run bash my_script.sh suma 3 5
  [ "$status" -eq 0 ]
  [ "$output" = "8" ]
}

Pruebas negativas

Además de probar el comportamiento correcto, también puedes escribir pruebas para situaciones incorrectas o inesperadas.

# negative_test.bats
@test "Verificar que el script maneja argumentos insuficientes" {
run bash my_script.sh
[ "$status" -ne 0 ]
[ "$output" = "Error: Argumentos insuficientes" ]
}

Prueba genérica

El siguiente ejemplo genérico incluye una variedad de pruebas comunes que puedes adaptar para probar tus scripts de shell, incluyendo las anteriores y con alguna más.

#!/usr/bin/env bats

# Prueba de manejo de argumentos
@test "Verificar que el script maneja argumentos correctamente" {
  run bash my_script.sh arg1 arg2
  [ "$status" -eq 0 ]
  [ "$output" = "Argumentos: arg1, arg2" ]
}

# Prueba de argumentos insuficientes
@test "Verificar que el script maneja argumentos insuficientes" {
  run bash my_script.sh
  [ "$status" -ne 0 ]
  [ "$output" = "Error: Argumentos insuficientes" ]
}

# Prueba de una función específica del script
@test "Verificar que la función suma funciona correctamente" {
  run bash my_script.sh suma 3 5
  [ "$status" -eq 0 ]
  [ "$output" = "8" ]
}

# Prueba de fallo de una función específica del script
@test "Verificar que la función suma falla con argumentos incorrectos" {
  run bash my_script.sh suma 3 "abc"
  [ "$status" -ne 0 ]
  [ "$output" = "Error: Argumentos no numéricos" ]
}

# Prueba de manejo de errores
@test "Verificar que el script maneja errores correctamente" {
  run bash my_script.sh error_case
  [ "$status" -ne 0 ]
  [ "$output" = "Error: Caso de error" ]
}

# Prueba de una ejecución exitosa
@test "Verificar que el script produce la salida esperada" {
  run bash my_script.sh success_case
  [ "$status" -eq 0 ]
  [ "$output" = "Éxito" ]
}

# Prueba de manejo de archivos
@test "Verificar que el script crea un archivo de salida" {
  run bash my_script.sh generate_file
  [ "$status" -eq 0 ]
  [ -f "output.txt" ]
  run rm "output.txt"
  [ "$status" -eq 0 ]
  [ ! -f "output.txt" ]
}

Lo dicho, asegúrate de ajustar el nombre del script (my_script.sh) y las salidas esperadas en cada prueba según las necesidades.

Otras herramientas para testear scripts

Hay otros mecanismos y herramientas que puedes utilizar para testear scripts. Algunos de ellos:

  • shUnit2 es un marco de prueba unitaria para scripts de shell. Permite escribir pruebas unitarias en Bash y Sh. Proporciona una estructura similar a JUnit y es útil para realizar pruebas en funciones individuales dentro de sus scripts.
  • Shtest es una herramienta simple para realizar pruebas de shell. Puedes escribir pruebas directamente en tus scripts de shell utilizando anotaciones especiales en los comentarios y luego ejecutar las pruebas con el propio script de prueba de Shtest.
  • Expect es una herramienta que se utiliza para automatizar la interacción con programas en la línea de comandos. Puede ser útil para probar scripts que requieren interacción con el usuario a través de la entrada y salida estándar.
  • ShellSpec es un marco de prueba en shell script similar a Bats, pero con algunas características adicionales. Permite escribir pruebas con una sintaxis similar a RSpec y es adecuado para escribir pruebas unitarias y de integración.
  • Si tu script de shell interactúa con contenedores Docker, puedes utilizar Docker para automatizar las pruebas. Puedes crear contenedores de prueba que ejecuten tus scripts y luego verificar la salida y el estado del contenedor.

La elección de la herramienta de pruebas dependerá de tus necesidades específicas y de la complejidad de tus scripts. Algunas de estas herramientas son más adecuadas para pruebas unitarias, mientras que otras son mejores para pruebas de integración o pruebas de extremo a extremo. La elección dependerá de tus requisitos y preferencias. Además, siempre podrás volver a las pruebas manuales.

Y para linting

Por otro lado, también existen herramientas de linting para Bash que pueden ayudarte a mejorar la calidad de tu código y mantener un estilo consistente. Estos linters analizan tu código Bash en busca de posibles problemas y te proporcionan sugerencias para corregirlos. Algunas herramientas populares de linting para Bash:

  • ShellCheck es uno de los linters más conocidos para scripts Bash. Realiza análisis estáticos en tus scripts y señala problemas potenciales, como errores de sintaxis, uso incorrecto de comandos y variables no definidas. Puedes utilizar ShellCheck en línea o instalarlo en tu sistema.
  • bashate es una herramienta de linting específica para el estilo de codificación de OpenStack. Realiza comprobaciones de estilo y convenciones de codificación en scripts Bash.
  • checkbashisms es una herramienta que se incluye en el paquete devscripts en sistemas basados en Debian/Ubuntu. Se utiliza para verificar si tu script Bash contiene características no compatibles con el estándar POSIX, lo que ayuda a garantizar la portabilidad.
  • Shellharden es un linter que se enfoca en fortalecer la seguridad de tus scripts Bash, buscando posibles vulnerabilidades y debilidades en tu código.

Estos linters te ayudarán a identificar problemas en tus scripts Bash y mejorar la calidad del código. Puedes elegir el que mejor se adapte a tus necesidades y preferencias.

Más apuntes

Invítame a un café con bitcoins:
1QESjZDPxWtZ9sj3v5tvgfFn3ks13AxWVZ

Bitcoins para café
También puedes invitarme a algo para mojar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Rellena este campo
Rellena este campo
Por favor, introduce una dirección de correo electrónico válida.
Tienes que aprobar los términos para continuar