Aller au contenu

Bats

À quoi il sert

Bats (Bash Automated Testing System) exécute des fichiers .bats dont chaque bloc @test "description" { ... } est un test écrit en Bash. La commande run lance l'outil à tester dans un sous-shell et range son code dans $status, sa sortie dans $output et ses lignes dans $lines ; le test échoue dès qu'une de ses commandes échoue. Les fonctions setup et teardown encadrent chaque test, setup_file et teardown_file chaque fichier, et $BATS_TEST_TMPDIR donne à chaque test un répertoire temporaire qui lui est propre. Les résultats sortent au format lisible ou en TAP (--tap), que les outils d'intégration continue savent agréger. Le projet maintenu est bats-core, issu en 2017 d'un fork du Bats original de Sam Stephenson, archivé depuis ; Ubuntu 24.04 fournit la version 1.10.0, Debian 13 la 1.11.1, avec les bibliothèques d'assertions bats-support et bats-assert en paquets séparés.

Quand le choisir

Pour tester un script Bash ou n'importe quel outil en ligne de commande depuis l'extérieur : codes de sortie, messages, fichiers produits, comportement face à une dépendance qui échoue (simulée par une doublure placée en tête du PATH). Pour du code Python, pytest est plus adapté ; pour des fonctions shell très nombreuses, ShellSpec offre un style plus structuré. Bats reste le choix le plus répandu, et le plus simple à lire pour qui connaît Bash.

Points d'attention

  • run avale le code de sortie : run commande réussit toujours, il faut ensuite vérifier $status (ou assert_success, assert_failure 3). Depuis la version 1.5.0, run -3 commande fait échouer le test si le code n'est pas 3, à condition de déclarer bats_require_minimum_version 1.5.0.
  • Le corps d'un test s'exécute avec set -e, mais une commande précédée de ! ne fait pas échouer le test : utilisez run ! ou refute.
  • Chaque test tourne dans son propre processus : une variable affectée dans un test n'existe pas dans le suivant, et rien de ce que fait run ne remonte au test.
  • bats_load_library bats-assert cherche dans BATS_LIB_PATH, /usr/lib/bats par défaut, là où les paquets Debian et Ubuntu installent les bibliothèques.
  • Un test ne doit jamais toucher un vrai service : fixez les chemins et les commandes externes par des variables d'environnement et des doublures, dans $BATS_TEST_TMPDIR.

Par où commencer

La leçon Déboguer, analyser et tester du cours Bash pour l'automatisation, qui couvre publier-export par une suite Bats avec une doublure de aws, puis l'exécute dans make verifier et GitHub Actions. Puis la documentation de bats-core, en particulier la page Writing tests.