On Github MichaelBorde / TestsAutomatisesEnBash-Presentation-RevealJs
Et si nous automatisions les opérations répétitives et sensibles ?
Puisque c'était possible, nous avons alors décidé d'automatiser certaines opérations répétitives et sensibles du quotidien.18 vaillants scripts
Mais bien vite nous avons imaginé de nombreux cas d'utilisations : créer des branches git ou des jobs Jenkins en masse, livrer les projets de manière automatique, etc. Au final nous avons un peu moins de 20 scripts.Développeurs, administrateurs, livreurs, etc.
Ils concernent un peu tout le monde : développeurs, administrateurs, etc.avec un mode de tests manuels, mais chut!
Ils sont utilisables sur un poste de développement Windows, un serveur Linux ou via un job Jenkins. Il y a même un mode de tests manuels pour vérifier qu'on ne va pas déclencher l'enfer en situation réelle../execute -p "*reference*" -y jar -b integration "mvn clean install" ./assigne-version -c auto "3.4.2-SNAPSHOT"Je vous donne un exemple de script qu'il m'arrive d'utiliser plusieurs fois par jours. Pour tous les projets qui s'appellent plus ou moins "reference", de type "jar" et sur la branche "integration", exécute la commande "mvn clean install". Et en dessous un autre script plus malin. Pour tous les projets dont le cycle de vie est géré en "automatique", assigne la version "3.4.2-SNAPSHOT".
En Python !
© Toute la production de Dawson's Creek En python ! Il est malheureux Dawson, il n'a pas envie de faire du Python, il veut sortir avec Katie Holmes comme tout le monde. Quelqu'un fait du Python dans la salle? J'aime mieux faire du cheval, c'est plus large.Eh oui, scripter en Bash c'est un peu...
Mais c'est compréhensible. Quand je regarde des exemples de code sur le net je me dis que scripter en Bash c'est un peu de chance et beaucoup de Stackoverflow. Heureusement dans les situations désespérées il reste le Nécronomicon.https://github.com/creationix/nvm
(Node Version Manager - Simple bash script to manage multiple active node.js versions)
Pour se donner une petite idée, nous allons regarder le code d'un "script bash simple pour gérer les versions de Node.js".Et si Bash était un langage de programmation ?
Et si Bash n'était pas un langage de script mais un langage de programmation comme les autres ?Bof...
Après avoir regardé des projets comme Bats ou ShUnit, je n'étais pas beaucoup emballé!Je vais créer mon api de tests automatisés en Bash !
Alors j'ai décidé de créer ma propre api de tests automatisés en Bash ! Serious Business !Une si bonne idée...
Une si bonne idée! Vous me voyez annoncez aux collègues un beau matin : "Nous allons faire du TDD en Bash avec une API sur mesure et nous serons payés pour ça!". Je reformule : "Hey les mecs, j'ai une idée : on va faire un BBQ dans la piscine!". Ils m'ont dit "banco".function executeur_executeLesFichiersDeTestDansLeRepertoire() { local repertoire="$1" _initialiseLExecutionDesTests _executeTousFichiersDeTest "${repertoire}" "*Test.sh" _afficheLeResultatDesTests _retourneUnCodeEnFonctionDuResultatDesTests }L'exécuteur exécute tous les fichiers de tests qui respectent un certain motif pour un répertoire donné. Il affiche le résultat global des tests et retourne un code en fonction de l'exécution.
function _executeLeFichierDeTest() { local fichier="$1" source "${fichier}" local fonctions=("$(_fonctionsPubliquesDansLeFichier "${fichier}")") _executeFonctionSiPresente "avantTousLesTests" "${fonctions[@]}" _executeTousLesTests "${fonctions[@]}" _executeFonctionSiPresente "apresTousLesTests" "${fonctions[@]}" }Pour un fichier de test, il récupère les fonctions publiques qui par convention seront les fonctions de test. Il exécute tous les tests entre les setups et teardowns globaux si présents.
function _executeLaFonctionAuMilieuDuSetupEtTeardown() { local fonction="$1" shift 1 _executeFonctionSiPresente "avantChaqueTest" "$@" \ && ${fonction} \ && _executeFonctionSiPresente "apresChaqueTest" "$@" _analyseLExecutionDuTest "${fonction}" $? }Pour une fonction de test, il l'exécute entre le setup et teardown si présents et analyse le code retour.
function affirmation_affirmeEgalite() { local attendu="$1" local obtenu="$2" if [[ "${attendu}" != "${obtenu}" ]]; then _affirmationEnErreur "Obtenu : ${obtenu}, attendu : ${attendu}." fi }Voici une affirmation triviale pour l'égalité. C'est le plus simple qui fonctionne. J'affirme que le résultat obtenu correspond au résultat attendu. Sinon j'échoue avec un message d'erreur sympa.
function affirmation_affirmeSucces() { ( $@ ) if (( $? != 0 )); then _affirmationEnErreur "La commande a échoué au lieu de réussir." fi }Une autre pour affirmer le succès d'une commande. C'est très utile puisque les fonctions Bash ne retournent que des codes d'erreur.
function recupereBienLaVersionDunPom() { local pom="${_ressources}/pom_1.0.xml" local version="$(maven_recupereLaVersionDuPom "${pom}")" affirmation_affirmeEgalite "1.0" "${version}" }Un premier test unitaire qui concerne le module dédié à Maven. Etant donné un pom.xml en version 1.0, si je demande la version de ce pom, j'obtiens bien 1.0. Pour ceux qui ne connaissent pas Maven, un pom est un descripteur XML à l'intérieur duquel on trouve une propriété version. On remarque qu'il est possible en Bash de respecter le Arrange Act Assert pour améliorer la lisibilité des tests. L'exemple ici est trivial mais il est toujours possible de faire des extractions de fonctions pour les cas plus complexes.
function ilEstPossibleDeChangerLaBrancheDUnEntrepot() { entrepot_cloneLaBrancheDeLEntrepot "integration" "module-a" source "${REPERTOIRE_SCRIPT}/checkout" -p "mod*" "master" local branche="$(_recupereLaBrancheCouranteDeLEntrepot "module-a")" affirmation_affirmeEgalite "master" "${branche}" }Un exemple plus ambitieux avec un test d'intégration. Je clone l'entrepôt module-a sur la branche integration, je demande un changement vers la branche master de tous les entrepôts qui commencent par mod et j'affirme que module-a est sur la branche master.
... ensuite naquit shebang_unit.http://github.com/arpinum/shebang_unit
Ensuite nacquit shebang_unit que j'ai partagé sur Github. C'est la petite soeur libre de droit et en Anglais de l'API que je viens de présenter. Nous allons un peu l'étudier.