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?
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:
- "151980920 de Tests Unitaires pour les Scripts Shell
- Test Rien de ce Protocole dans les Scripts Shell
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.
APPUYEZ sur conforme Bash test: Bash Automated Testing System
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.
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
}
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
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.
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.
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.
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.
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"$@"
ouou
""
, 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.