Table des matières

,

Scripting shell bash et tests unitaires avec bats

apt-get install -y --no-install-recommends bats

test/spec.bats

#!/usr/bin/env bats
 
set -euo pipefail
 
@test "Check apache2 is up" {
  ps aux | grep "apache2"
}

test/spec.bats

#! /usr/bin/env bats
 
set -eu
 
setup() {
        # Appelée avant chaque test unitaire
        #echo "$(date --iso-8601=second BEGIN $BATS_TEST_NUMBER $BATS_TEST_NAME" > /dev/stdin
        true
}
 
teardown() {
        # Appelée après chaque test unitaire
        #echo "$(date --iso-8601=second) END   $BATS_TEST_NUMBER $BATS_TEST_NAME" > /dev/stdin
        true
}
 
setup_file() {
        # Appelée une seule fois au début du lancement de ce script
        echo "$(date --iso-8601=second) BEGIN $(basename $BATS_TEST_FILENAME)" > /dev/stdin
}
 
teardown_file() {
        # Appelée une seule fois en dernier lors de l’exécution de ce script
        sleep 1
        echo -e "\b$(date --iso-8601=second) END   $(basename $BATS_TEST_FILENAME)" > /dev/stdin
}
 
### Exemple de tests
 
@test "prereq - create account" {
        ansible -b -i tests/inventory -m user -a 'name=testplop' all
}
 
@test "Check required fields" {
        ansible-playbook --check tests/test.yml -i tests/inventory |grep -q 'NameError.'
}

Dépendance et condition

test/spec.bats

foo() {
        echo foobar > /tmp/plop
}
 
@test "foobar" {
        run foo
}

Autres

tests/spec.sh

#! /bin/bash
 
set -eu
 
if [ -z "${ALREADY_RUN:-}" ]
then
        export ALREADY_RUN=yes
fi

test/spec.bats

#! /usr/bin/env bats
 
set -eu
 
load spec.sh
 
@test "clean" {
        if [ ! -z  "${ALREADY_RUN:-}" ]
        then
                ssh server -- sudo find /opt/app1/ -type f -delete
        fi
}