Bats: pruebas automatizadas para bash

diciembre 7, 2017 at 03:08 Deja un comentario

Bats es un framework para crear pruebas automatizadas para scripts de bash, si dichos scripts son muy grandes, siempre es bueno poder probar que alguna nueva funcionalidad que se haya agregado no quiebre el script.

Para crear pruebas usando bats realizamos los siguientes pasos (los pasos 3 y 4 son opcionales pero definen una estructura de proyecto adecuada):

  • Se crea el directorio llamado miProyecto que contendrá todos los archivos necesarios:
    mkdir miProyecto
  • Entramos en el directorio recién creado:
    cd miProyecto
  • Creamos el archivo validations.sh y le agregamos el siguiente contenido:
    #!/bin/bash
    
    # Validate if the user running the script is root.
    is_root ()
    { 
        if [ "$EUID" -ne 0 ]; then
            echo "You must execute this script as root."
            return 1
        fi
        return 0
    }
  • La función is_root valida que el script se ejecute con usuario root.

  • Ahora agregamos un archivo llamado main.sh con el siguiente contenido:
    #!/bin/bash
    source validations.sh
    
    # Validations.
    if ! is_root; then
        exit 1
    fi
    
    exit 0

    En este script se incluye el script con las validaciones a tráves del comando source y luego se llama a la función is_root.

  • Creamos ahora la carpeta test que contendrá nuestros scripts de prueba:
    mkdir test
  • También creamos dentro de test la carpeta libs que contendrá el framework bats:
    mkdir test/libs
  • Se clona el repositorio del proyecto bats:
    git clone https://github.com/sstephenson/bats test/libs/bats
  • También agregamos las librerías bats-support y bats-assert que añaden validaciones extras y mejoran el despliegue de los resultados de las pruebas:
    git clone https://github.com/ztombol/bats-support.git test/libs/bats-support
    git clone https://github.com/ztombol/bats-support.git test/libs/bats-assert
  • Se asume que las pruebas se ejecutarán desde la raíz del proyecto, es decir desde la carpeta miProyecto.

    Creamos un archivo llamado miTest.bats dentro de la carpeta test, este archivo contiene las pruebas que queremos llevar a cabo:

    touch test/miTest.bats

  • Los archivos de prueba .bats deben indicar en el encabezado la ruta hacia el binario de bats, por ejemplo:
    #!./test/libs/bats/bin/bats

    Agregamos entonces el siguiente contenido al archivo test/miTest.bats:

    #!./test/libs/bats/bin/bats
    
    load 'libs/bats-support/load'
    load 'libs/bats-assert/load'
    
    @test "User is root" {
        [ ! "$EUID" -ne 0 ]
    }
  • La prueba agregada valida si el script se ejecutó o no como usuario root, ejecutamos la prueba como un usuario normal:
    ./test/libs/bats/bin/bats test/miTest.bats

    Se genera una salida similar a la siguiente:

    Prueba fallida

    Prueba fallida

  • Ahora ejecutamos nuevamente la prueba pero usando el usuario root:
    sudo ./test/libs/bats/bin/bats test/miTest.bats

    , el resultado debe ser similar a: Prueba exitosa

Algunas consideraciones sobre bats

  • Para bats una prueba es exitosa si todos los comandos ejecutados dentro de una prueba devuelven 0 y es fallida si se devuelve un 1
  • .

  • Bats incluye el comando run permite correr un script o comando y almacena la salida en la variable especial status, esta variable contendrá un 0 o un 1 según lo explicado anteriormente:
    @test "status var test pass" {
        run echo "hello"
        [ $status -eq 0 ]
    }   
    
    @test "status var test fail" {
        run echo "hello"
        [ $status -eq 1 ]
    }
    
  • También existe la variable output que contiene la salida de texto del comando ejecutado:
    @test "output var test pass" {
        run echo "hello"
        [ $output == "hello" ]
    }
    
    @test "output var test fail" {
        run echo "hello" 
        [ $output == "hello2" ]
    }
    
  • Para agregar condiciones iniciales a las pruebas podemos usar la función setup(), en este caso se define la variable VAR1 previo al inicio de las pruebas.:
    setup() {
        VAR1=0
    }
    
    @test "test setup function pass" {
      [ $VAR1 -eq 0 ]
    }
    
    @test "test setup function fail" {
      [ $VAR1 -eq 1 ]
    }
    
  • De igual manera que con setup() podemos usar la función teardown() para ejecutar comandos después que se ejecutaron las pruebas, por ejemplo eliminar archivos innecesarios realizados durante algún proceso.
  • Si ahora nuestro archivo miTest.sh (gist en gihub) contiene algo similar a lo siguiente:
    #!./test/libs/bats/bin/bats
    
    load 'libs/bats-support/load'
    load 'libs/bats-assert/load'
    
    setup() {
        VAR1=0
    }
    
    @test "test setup function pass" {
      [ $VAR1 -eq 0 ]
    }
    
    @test "test setup function fail" {
      [ $VAR1 -eq 1 ]
    }
    
    @test "User is root" {
        [ ! "$EUID" -ne 0 ]
    }
    
    @test "status var test pass" {
        run echo "hello"
        [ $status -eq 0 ]
    }   
    
    @test "status var test fail" {
        run echo "hello"
        [ $status -eq 1 ]
    }
    
    @test "output var test pass" {
        run echo "hello"
        [ $output == "hello" ]
    }
    
    @test "output var test fail" {
        run echo "hello" 
        [ $output == "hello2" ]
    }
    

    Y lo ejecutamos, la salida de bats debe ser:

    Todas las pruebas

    v

Listo listo.

Entry filed under: bash scripting, bats, frameworks, programación.

Crear un slider de imágenes responsive usando slick

Dejáte un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Acerca de Mi:


Hell-Out world!!

Digo yo

Es difícil hacerse la vida fácil.

Dice Victor Frankl

Lo que importa no es tanto que la vida de una persona esté llena de dolor o de placer, sino que esté llena de sentido.

Digo yo

Que dura está la vida.

Dice Jhon Lennon

La vida es lo que pasa mientras haces planes.

Digo yo

Dónde haya un computín esté dónde esté algo comenzará en cero.

Dice Einstein

Dios no juega a los dados.

Dice Niels Bohr

Einstein no le diga a Dios lo que tiene que hacer.

Dice el Che:

Seamos realistas y hagamos lo imposible.

Dice Goethe:

Lo que no comprendemos no lo poseemos.

Digo yo:

Hay que tratar de travesear todo.

Dice Oscar Wilde:

Cualquier hombre puede llegar a ser feliz con una mujer, con tal de que no la ame.

Digo yo:

De fijo dijo eso porque era homosexual.

Artículos

diciembre 2017
L M X J V S D
« Oct    
 123
45678910
11121314151617
18192021222324
25262728293031

A %d blogueros les gusta esto: