Nous avons un système qui a des scripts bash en plus du code Java. Puisque nous essayons de tester tout ce qui pourrait éventuellement casser, et que ces scripts bash peuvent casser, nous voulons les tester.
Le problème est qu'il est difficile de tester les scripts bash.
Existe-t-il un moyen ou une meilleure pratique pour tester les scripts bash? Ou devrions-nous cesser d'utiliser des scripts bash et rechercher des solutions alternatives testables?
Réponses:
Il existe en fait un shunit2 , un framework de test unitaire basé sur xUnit pour les scripts shell basés sur Bourne. Je ne l'ai pas utilisé moi-même, mais cela vaut peut-être la peine d'être vérifié.
Des questions similaires ont déjà été posées:
la source
J'ai obtenu la réponse suivante d'un groupe de discussion:
Cette méthode ressemble à 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.
la source
Test Bash conforme au TAP : système de test automatisé Bash
chauves-souris
la source
Nikita Sobolev a écrit un excellent article de blog comparant quelques frameworks de test bash différents: Test des applications Bash
Pour les impatients: la conclusion de Nikita était d'utiliser Bats mais il semble que Nikita a raté le projet Bats-core qui me semble être celui à utiliser à l'avenir car le projet Bats original n'a pas été activement maintenu depuis 2013.
la source
Epoxy est un framework de test Bash que j'ai conçu principalement pour tester d'autres logiciels, mais je l'utilise également pour tester des modules bash, y compris lui - même et Carton .
Les principaux avantages sont une surcharge de codage relativement faible, une imbrication d'assertions illimitée et une sélection flexible d'assertions à vérifier.
J'ai fait une présentation en le comparant à BeakerLib - un framework utilisé par certains chez Red Hat.
la source
Pourquoi dites-vous qu'il est "difficile" de tester les scripts bash?
Quel est le problème avec les wrappers de test comme:
la source
J'ai créé shellspec parce que je voulais un outil facile à utiliser et utile.
Il a été écrit par un script shell POSIX pur. Il a testé avec de nombreux obus plus que shunit2. Il a des fonctionnalités puissantes que les chauves-souris / chauves-souris.
Par exemple, prise en charge du bloc imbriqué, facile à simuler / stub, facile à ignorer / en attente, tests paramétrés, numéro de ligne d'assertion, exécution par numéro de ligne, exécution parallèle, exécution aléatoire, formateur TAP / JUnit, couverture et intégration CI, profileur, etc. .
Voir la démo sur la page du projet.
la source
J'aime assez shell2junit , un utilitaire pour générer une sortie de type JUnit à partir de tests de script Bash. Ceci est utile car le rapport généré peut ensuite ê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 Bash complet comme shunit2 , il vous permet d'avoir de bons rapports sur les résultats des tests.
la source
Essayez bashtest . C'est un moyen simple de tester vos scripts. Par exemple, vous avez
do-some-work.sh
qui modifie certains fichiers de configuration. Par exemple, ajoutez une nouvelle lignePASSWORD = 'XXXXX'
au fichier de configuration/etc/my.cfg
.Vous écrivez des commandes bash ligne par ligne, puis vérifiez la sortie.
Installer:
Créer des tests est une simple écriture de commandes bash.
Fichier
test-do-some-work.bashtest
:Exécutez les tests:
Vous pouvez trouver quelques exemples ici et ici
la source
Peut-être que cela peut être utilisé ou contribué à
https://thorsteinssonh.github.io/bash_test_tools/
Destiné à é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 dire qu'ils devraient être testés dans leur environnement shell.
la source
Essayez d' assert.sh
J'espère que ça aide!
la source
Je ne peux pas croire que personne ne parle d' OSHT ! Il est compatible avec les deux TAP et JUnit, il est shell pur (qui est, pas d' autres langues concernées), il fonctionne de façon autonome aussi, et il est simple et direct.
Le test ressemble à ceci (extraits tirés de la page du projet):
Une course simple:
Le dernier test indique "pas ok", mais le code de sortie est 0 car c'est un
TODO
. On peut également définir verbose:Renommez-le pour utiliser une
.t
extension et placez-le dans unt
sous - répertoire, et vous pouvez utiliserprove(1)
(une partie de Perl) pour l'exécuter:Définir
OSHT_JUNIT
ou transmettre-j
pour produire une sortie JUnit. JUnit peut également être combiné avecprove(1)
.J'ai utilisé cette bibliothèque à la fois pour tester les fonctions en recherchant leurs fichiers, puis en exécutant des assertions avec
IS
/OK
et leurs négatifs, et des scripts en utilisantRUN
/NRUN
. Pour moi, ce cadre offre le plus de gain pour le moins de frais généraux.la source
J'ai essayé beaucoup de solutions présentées ici, mais j'ai trouvé la plupart d'entre elles encombrantes et difficiles à utiliser, j'ai donc créé mon propre petit cadre de test: https://github.com/meonlol/t-bash
C'est juste un fichier dans le dépôt que vous pouvez simplement exécuter directement, avec un ensemble de base d'assertions de style JUnit.
Je l'ai utilisé professionnellement dans plusieurs projets internes et j'ai pu rendre nos scripts bash super stables et résistants à la régression.
la source
Vous voudrez peut-être jeter un œil à bash_unit:
https://github.com/pgrange/bash_unit
la source
Jetez un œil à Outthentic , il est simple, extensible par de nombreux langages (Perl, Python, Ruby, Bash au choix) et un framework multiplateforme (Linux, Windows) pour tester toutes les applications en ligne de commande.
la source
J'ai eu du mal à justifier l'utilisation de bash pour des scripts plus volumineux lorsque Python présente d'énormes avantages:
if [ x"$foo" = x"$bar"]; then ...
» qui est sujette à des erreurs.getopt
module (et il existe un module encore plus simple pour analyser les arguments, mais le nom m'échappe).mysql
diriger vers la commande dans bash, mais ce n'est pas la meilleure façon d'écrire du code).$*
ou"$*"
ou"$@"
ou$1
ou"$1"
, les espaces dans les noms de fichiers ne sont pas un problème, etc., etc., etc.Maintenant, je n'utilise bash que pour le plus simple des scripts.
la source
if [[ $foo = $bar ]]; then ...
. Ce n'est toujours pas mieux que ce que Python a à offrir, mais c'est mieux que ce que vous avez présenté.trap
(pour nettoyer / annuler en cas d'erreur) ainsi que regex (ie[[ $1 =~ ^[1-3]{3}$ ]]
). Je suis à peu près sûr que la syntaxe obscure que vous avez utilisée fait référence à d'anciennes implémentations detest
, pas à bash. Bash est idéal pour s'interfacer avec les outils de ligne de commande existants ... Souvent, un seul tube versawk
ougrep
est beaucoup plus facile que l'alternative Python.optparse
ou son successeurargparse
. Je n'ai jamais vu personne utiliser legetopt
module et je ne l'ai pas utilisé personnellement. L'getopt
utilité est excellente cependant. L'analyse des arguments à partir du shell n'est pas du tout un problème une fois que vous avez un bon modèle. À moins que vous n'essayiez d'implémenter des sous-commandes de style git ou quelque chose du genre, ce n'est pas beaucoup de problèmes.