En plus de roundup et shunit2, ma revue des outils de test unitaire de shell incluait également assert.sh et shelltestrunner.
Je suis en grande partie d'accord avec la critique de l'auteur de roundup à l'égard de shunit2 (quelque peu subjective), donc j'ai exclu shunit2 après avoir examiné la documentation et les exemples. Bien que cela m'ait semblé familier, ayant une certaine expérience avec jUnit.
À mon avis, shelltestrunner est l'outil le plus original parmi ceux que j'ai examinés car il utilise une syntaxe déclarative simple pour la définition des cas de test. Comme d'habitude, tout niveau d'abstraction offre une certaine commodité au détriment de la flexibilité. Malgré que la simplicité soit attrayante, j'ai trouvé l'outil trop limité pour le cas que j'avais, principalement en raison de l'absence d'une façon de définir des actions de configuration/lecture (par exemple, manipuler les fichiers d'entrée avant un test, supprimer les fichiers d'état après un test, etc.).
J'étais d'abord un peu confus que assert.sh ne permette d'assertir que la sortie ou le statut de sortie, alors que j'avais besoin des deux. J'ai passé suffisamment de temps à écrire quelques cas de test en utilisant roundup. Mais j'ai vite trouvé le mode set -e
de roundup inconfortable, car un statut de sortie non nul est attendu dans certains cas comme moyen de communiquer le résultat en plus de stdout, ce qui fait échouer le cas de test en mode dit. L'un des exemples montre la solution :
status=$(set +e ; rup roundup-5 >/dev/null ; echo $?)
Mais que faire si j'ai besoin à la fois du statut de sortie non nul et de la sortie ? Je pourrais bien sûr faire un set +e
avant l'invocation et un set -e
après ou un set +e
pour l'ensemble du cas de test. Mais cela va à l'encontre du principe de roundup "Tout est une assertion". Donc j'avais l'impression de commencer à travailler contre l'outil.
À ce moment-là, j'ai réalisé que le "défaut" de assert.sh de ne permettre d'asserter que le statut de sortie ou la sortie est en fait un faux problème, car je peux simplement passer test
avec une expression composée comme ceci
output=$($tested_script_with_args)
status=$?
expected_output="l'attente"
assert_raises "test \"$output\" = \"$expected_output\" -a $status -eq 2"
Comme mes besoins étaient vraiment basiques (exécuter un ensemble de tests, afficher que tout s'est bien passé ou ce qui a échoué), j'ai apprécié la simplicité de assert.sh, donc c'est ce que j'ai choisi.
0 votes
Roundup formalise certaines tâches / balises pour vous. Une fois que vous avez surmonté l'obstacle de l'apprentissage, c'est assez utile. Personnellement, j'aime mieux l'approche de haridsv, car cela ne nécessite pas que j'installe un autre paquet. J'ai appliqué cette approche aux tests de scripts shell et python.
1 votes
Vous pouvez également vérifier l'utilitaire bashtest : github.com/pahaz/bashtest (c'est une manière simple d'écrire des tests bash)
1 votes
Découvrez cet aperçu de presque tous les outils possibles : medium.com/wemake-services/…
0 votes
@sobolevn article très intéressant, merci !