Unités de test des scripts bash

nous avons un système qui a des scripts bash tournant en dehors du code Java. Puisque nous essayons de tester tout ce qui pourrait se casser, et que ces scripts de bash peuvent se casser, nous voulons les tester.

le problème est qu'il est difficile de tester des scripts bash.

y a-t-il un moyen ou une pratique exemplaire pour tester les scripts bash? Ou devrions-nous cesser d'utiliser des scripts bash et chercher des solutions alternatives qui sont testables?

87
demandé sur Eric Leschinski 2009-08-27 11:33:47

13 réponses

il y a en fait un unit testing framework pour les scripts shell . Je ne l'ai pas utilisé moi-même, mais il pourrait être intéressant de vérifier.

des questions similaires ont déjà été posées:

38
répondu ire_and_curses 2017-05-23 11:55:10

j'ai reçu la réponse suivante d'un groupe de discussion:

il est possible d'importer (y compris, quoi que ce soit) une procédure (fonction, quel que soit son nom) d'un externe fichier. C'est la clé de la rédaction d'un script de test: vous casser votre script vers des procédures indépendantes qui peut ensuite être importé dans les deux votre script d'exécution et vos tests script, et puis vous avez votre course script d'être aussi simple que possible.

cette méthode est comme l'injection de dépendances pour les scripts, et semble raisonnable. Il est préférable d'éviter les scripts bash et d'utiliser un langage plus testable et moins obscur.

25
répondu nimcap 2009-09-01 07:43:40

Epoxy est un cadre D'essai Bash j'ai conçu principalement pour tester d'autres logiciels, mais je l'utilise pour tester les modules bash aussi, y compris elle-même et Carton .

les principaux avantages sont un codage aérien relativement faible, un enchevêtrement illimité d'assertions et une sélection flexible d'assertions à vérifier.

j'ai fait un présentation en la comparant à BeakerLib - un cadre utilisé par certains à Red Hat.

7
répondu spbnick 2013-09-28 08:59:43

Pourquoi dites-vous qu'il est" difficile " de tester les scripts bash?

Quel est le problème avec le test de wrappers comme:

 #!/bin/bash
 set -e
 errors=0
 results=$($script_under_test $args<<ENDTSTDATA
 # inputs
 # go
 # here
 #
 ENDTSTDATA
 )
 [ "$?" -ne 0 ] || {
     echo "Test returned error code $?" 2>&1
     let errors+=1
     }

 echo "$results" | grep -q $expected1 || {
      echo "Test Failed.  Expected $expected1"
      let errors+=1
 }
 # and so on, et cetera, ad infinitum, ad nauseum
 [ "$errors" -gt 0 ] && {
      echo "There were $errors errors found"
      exit 1
 }
6
répondu Jim Dennis 2009-08-27 07:56:42

Essayer bashtest . C'est un moyen simple de tester vos scripts. Par exemple, vous avez do-some-work.sh qui change certains fichiers de configuration. Par exemple, ajouter une nouvelle ligne PASSWORD = 'XXXXX' au fichier de configuration /etc/my.cfg .

vous écrivez des commandes bash ligne par ligne et vérifiez ensuite la sortie.

Installation:

pip3 install bashtest

Create tests est une simple écriture de commandes bash.

Fichier test-do-some-work.bashtest :

# run the script  
$ ./do-some-work.sh > /dev/null

# testing that the line "PASSWORD = 'XXXXX'" is in the file /etc/my.cfg   
$ grep -Fxq "PASSWORD = 'XXXXX'" /etc/my.cfg && echo "YES"
YES

Exécution des tests:

bashtest *.bashtest

vous pouvez trouver quelques exemples ici et ici

3
répondu pahaz 2016-07-26 05:27:48

peut-être que cela peut être utilisé, ou contribué à

https://thorsteinssonh.github.io/bash_test_tools /

avait pour but d'écrire des résultats dans le protocole TAP qui, j'imagine, est bon pour CI, et bon pour ceux qui veulent des environnements shell. J'imagine que certaines choses fonctionnent dans des environnements shell, donc, certains pourraient soutenir qu'elles devraient être testées dans leur environnement shell.

3
répondu hrob 2016-09-09 00:59:50

essayez assert.sh

source "./assert.sh"

local expected actual
expected="Hello"
actual="World!"
assert_eq "$expected" "$actual" "not equivalent!"
# => x Hello == World :: not equivalent!

Espère que cela aide!

3
répondu Mark 2017-05-06 20:47:58

Nikita Sobolev a écrit un excellent billet de blog comparant quelques cadres de test bash différents: Testing Bash applications

pour l'impatient: la conclusion de Nikita était d'utiliser chauves-souris mais il semble que Nikita a manqué le chauves-souris-noyau projet qui me semblent être celui à utiliser aller de l'avant car le projet original de chauves-souris n'a pas été activement maintenu depuis 2013.

3
répondu cb2 2018-04-12 14:55:40

j'aime bien shell2junit , un utilitaire pour générer JUnit-comme sortie de script Bash tests. Ceci est utile parce que le rapport généré peut alors être lu par des systèmes d'intégration continue, tels que les plug-ins JUnit pour Jenkins et Bamboo.

bien que shell2junit ne fournisse pas le cadre de script complet de Bash comme shunit2 , il vous permet d'avoir un bon rapport des résultats des tests.

2
répondu Steve HHH 2014-01-17 22:33:59

vous pourriez vouloir jeter un oeil à bash_unit:

https://github.com/pgrange/bash_unit

0
répondu pgrange 2016-04-04 09:30:00

regardez Outthentic , c'est simple, extensible par de nombreux langages ( Perl, Python, Ruby, Bash on choice ) et plate-forme croisée ( Linux, Windows ) framework pour tester toutes les applications en ligne de commande.

0
répondu Alexey Melezhik 2018-09-28 19:27:46

j'ai eu du mal à justifier l'utilisation de bash pour des scripts plus gros quand Python a de tels avantages énormes:

  • Try/Except permet d'écrire des scripts plus robustes avec la possibilité d'annuler les changements en cas d'erreur.
  • vous ne devez pas utiliser une syntaxe obscure telle que ' if [ x"$foo" = x"$bar"]; then ... ' qui est sujette à des erreurs.
  • analyse facile des options et des arguments à l'aide du module getopt (et il y a un module encore plus facile pour analyser les arguments, mais le nom m'échappe).
  • Python vous permet de travailler avec des listes/dicts et des objets au lieu de chaînes et tableaux de base.
  • accès à des outils langagiers appropriés tels que regex, bases de données (bien sûr, vous pouvez tout insérer dans la commande mysql à bash, mais ce n'est pas la meilleure façon d'écrire du code).
  • pas besoin de vous soucier d'utiliser la forme correcte de $* ou "$*" ou "$@" ou ou "" , les espaces dans les noms de fichiers n'est pas un problème, etc, etc, etc.

maintenant, je n'utilise bash que pour les scripts les plus simples.

-2
répondu too much php 2009-08-27 07:45:38