Scripting shell bash et tests unitaires avec bats

Voir :

https://github.com/containers/podman/blob/main/hack/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 }