Coaching Agile

Agile, Scrum et autres pensées
Laurent Carbonnaux
Affichage des articles dont le libellé est Intégration continue. Afficher tous les articles
Affichage des articles dont le libellé est Intégration continue. Afficher tous les articles

Intérêt de l'automatisation des tests


Suite à la lecture du billet sur l’intégration continu, un internaute voulait savoir comment vendre l’intérêt de l’automatisation de tests. Voici la réponse que je lui ai faite :

D'abord, on va parler argent, puisque c'est pour vendre!
Il faut voir pourquoi l'automatisation ne doit pas être vu comme un surcoût.
Dans un cycle de développement classique (V, cascade, RUP), il n'y a qu'une phase de livraison en fin de développement. De une à 4 par an, souvent.
Dans un cycle itératif (Agile, Lean), il y a un livraison possible au minimum à chaque fin d'itération : de 12 à 24 fois par an.
Le coût de l'automatisation est donc divisé de 6 à 24 fois.
Et de plus de 220 fois (nombre de jours ouvrés) pour ce qui est des tests unitaires passés au minimum 1 fois par jour.
Pas négligeable quand même.

Ensuite, les approches Test Driven (TDD, TDR, A-TDD) sont réputées pour diminuer le taux d'erreur et d'insatisfaction.
Taux d'erreur = bugs
Taux d'insatisfaction = incohérence aux réels besoins métiers, pas forcément à la spec
Leur automatisation garanti donc ce contrôle en continu. Et vous avez raison, aide au contrôle des effets de bords et à la fiabilisation.
Ces tests apportent aussi une "documentation" efficace du produit pour la maintenance de celui-ci:
Un nouveau développeur ou une nouvelle équipe sur un produit aura plus d'assurance de compréhension, de maintenabilité et de pérennité qu'en lisant la spec détaillée. Là aussi, gain économique si les charges sont favorisées sur les tests unitaires plutôt que sur de la doc inutile.

Côté fonctionnel, c'est un peu différent:
Pour moi, les tests fonctionnels sont là pour valider le produit au sens métier.
Si vous utilisez les pratiques TDR et/ou A-TDD, c'est extrêmement efficace et souvent peu coûteux de les automatiser.
Pour faire court, en A-TDD la spécification fonctionnelle est remplacée par des scénarios de tests. Leur automatisation est supportée par de nombreux outils (QTP, robotframework, ...).
Sinon, il est tout à fait possible d'automatiser des scénarios de tests "standards", mais leur maintenance peut s’avérer plus coûteuse, s'ils n'ont pas été pensés pour : Factorisation des cas de tests, double écriture des tests, par le métier dans un outil, puis par les développeurs dans l'automate de test.
Je conseille fortement dans ce cas l'utilisation d'outils dit "keyword driven", tels que robotframework, qui permettent d'utiliser le même outil pour les deux mondes.
Leur automatisation favorise donc effectivement la non régression et peuvent être utilisés sur des tests de performances et de montée en charge.


Intégration continue

L’objectif de l’intégration continue est de :

 
Fabriquer un état stable du produit à partir d’incréments fonctionnels à une fréquence élevée.

 
Pour atteindre cet objectif, plusieurs conditions sont nécessaires :
  • Chaque personne (ou équipe au niveau système) doit être responsable de l’intégration de sa partie
  • Le contrôle de l’état stable doit être défini communément
  • Le contrôle de l’état stable doit être passé avant intégration et revérifié après intégration
  • La fabrication et le contrôle de l’état stable doivent être automatisés
  • La fabrication et le contrôle de l’état stable doivent être effectués en moins d’un cycle d’intégration
  • La gestion de configuration doit être adaptée à ce processus (et non l’inverse)
  • Toute action apportant un état instable doit être corrigée en priorité avant toute autre action

 

 

Chaque personne (ou équipe au niveau système) doit être responsable de l’intégration de sa partie


 
Dans un contexte d’intégration continue, il est de la responsabilité de celui qui produit de vérifier que son apport ne casse rien. Et il lui faut aussi fournir les éléments de contrôle qui serviront aux autres pour vérifier que sa production reste stable.
  • Vérifier avant soumission que rien n’est cassé
  • Fournir les éléments de contrôle de la partie à soumettre
 

Le contrôle de l’état stable doit être défini communément

Il s’agit des tests de non régression. Qu’ils soient de niveau tests unitaires, tests d’intégration ou tests fonctionnels.

 
Ces tests doivent être définis au niveau global et non pas au choix par personne ou équipe.
Cela permet de garantir que les vérifications effectuées avant soumission soient cohérentes d’une personne (ou équipe) à l’autre.

 
Plusieurs niveaux de contrôles peuvent être définis en fonction du temps d’exécution de ceux-ci et la fréquence de passage adaptée.
Par exemple, les tests unitaires peuvent être passés tous les jours, les tests fonctionnels complets toutes les semaines, un sous-ensemble des tests fonctionnels minimum peut être défini pour passé tous les jours, c’est ce que j’appelle les tests de maturité. Ils ne couvrent pas la totalité des fonctionnalités, mais servent à vérifier le plus rapidement possible (1 à 2 heures), que le produit ne plante pas sur les cas nominaux.

 

Le contrôle de l’état stable doit être passé avant intégration et revérifié après intégration

Processus à respecter absolument.
  1. Je pars d’un état stable (nouveau branchement ou mise à jour)
  2. Je développe mon code (et tests). Partie techniquement cohérente, doit correspondre à une tâche du backlog de sprint pour ceux qui ont la chance d’être en mode Agile
  3. Je passe mes tests
  4. Je me remets à jour du dernier état stable.
  5. Je repasse mes tests et passe les tests de contrôle d’état stable
  6. Si ok, je soumets mon développement
 Si non, je corrige et reproduit le cycle depuis étape 2

 
Entre étape 4 et 6, il ne faut pas qu’il y ait d’autres soumissions. N’importe quel mécanisme de sémaphore peut être utilisé, de la peluche gizmo au blocage de l’outil de gestion de conf. (Je préfère de loin la peluche)

 

La fabrication et le contrôle de l’état stable doivent être automatisés

Dans un processus où il n’y a qu’une livraison de temps en temps (cycle en V ou en cascade), le coût d’automatisation est élevé par rapport au nombre de fois où il est exécuté.
Dans le cas de l’intégration continue, avec un passage au moins quotidien, le rapport du coût d’automatisation sur le nombre d’exécution est réduit.

 
De plus l’approche Test Driven réduit encore ce coût par la mise en commun des charges de spécifications et de tests.

 
D’autre part, il y a maintenant une multitude d’outils d’excellente qualité répondant à tous les niveaux d’automatisation des builds et des tests et ce dans la plupart des langages de programmation actuels.

 

La fabrication et le contrôle de l’état stable doivent être effectués en moins d’un cycle d’intégration

Comme évoqué plus haut, lors d’une phase d’intégration, il ne doit pas y avoir d’autres soumissions en parallèle. Pour ne pas bloquer le processus d’intégration continue, cette contrainte impose que les temps d’intégration soit très raccourcis.
Tant la fabrication du produit (build) que les tests de non régression (contrôle de l’état stable).
Un effort important est à consacrer à cette diminution du temps de cycle.

 
Des cycles différents peuvent être effectués, par exemple :
  • Cycle rapide (daily build) : build incrémental et tests de régression minimum
  • Cycle moyen (Weekly build) : build total et tests de non régression normal
  • Cycle long avant livraison (Release build) : build complet et tests complets

 
L’intérêt aussi d’un cycle court est qu’il limite le volume produit, les risques d’impact et de conflit et donc la charge d’intégration.

 

La gestion de configuration doit être adaptée à ce processus (et non l’inverse)

La gestion des projets (VOB ClearCase, repository Subversion,…), des composants, des branches doivent être adaptés pour faciliter ce processus.
Eviter l’organisation par composant, mais bien par projet incluant les composants.
Limiter le nombre de branches :
  • Un tronc commun
  •  Une branche par version ou feature pour les gros projets (organisation Feature team)
  •  Seulement deux versions : 
    • celle représentant la dernière version en production
    • celle pour le développement en cours
  •  Eventuellement une branche spécifique dans le cadre des prototypages, pour lesquels la totalité du code produit ne sera peut être pas réintégré, voire pas du tout.

 

 

Toute action apportant un état instable doit être corrigée en priorité avant toute autre action

Respecter le « Stop the line »
Rien de ne sert de produire plus, si la sortie est fermée.

 
Les outils d’intégration continue doivent alerter tout le monde.
Soit par mail, soit par un écran visible de tous, soit par add-on i-buddy
L’alerte doit être simple
  • Etat du build : ok ou en erreur, vert ou rouge
  • et/ou
  • Etat des tests : ok ou anomalie détectée, vert ou rouge
Toute personne de l’équipe doit se sentir responsable de la remise en état du produit.

 

Liste d'évaluation des outils de test fonctionnel

Un résultat assez détaillé d'évaluation des différents outils de test du marché (manque QTP Pro) est proposé dans ce spreadsheet .

Initialisé par Gerard Meszaros, il a été complété lors du dernier workshop de l'Agile Alliance Functional Testing Tools group. Une discussion est en cours pour le transférer sur wikipedia.

Vous pouvez demander un accès en écriture pour y ajouter l'évaluation d'un outil non listé.

Intégration continue : Le petit plus d'Emmanuel Chenu

J'adore l'idée!
En plus de son côté ludique, c'est simple, efficace, pragmatique comme d'hab.
A conseiller absolument.
Pour 20€ seulement, moins cher qu'un écran plat 20 pouces en vert et rouge et tellement plus accrocheur.

A lire ici :
INTEGRATION CONTINUE + ANDON = JIDOKA

A voir ici :
i-buddy

Bonne rentrée à toutes et à tous!

Source et rangement

Tout comme à la maison (d’après ma femme !), il est utile pour retrouver ces petits de faire un peu de rangement.
L’organisation du code source ne déroge pas à cette règle. Cela peut paraître simpliste, voir inutile de faire un papier sur ce sujet, mais l’expérience me prouve que ce sujet n’est pas toujours appliqué.


Le principe est simple :

  • L’environnement de développement doit être identique à l’environnement de production.


J’entends par là que les sources, les fichiers de configuration, les scripts et tous autres artefacts qui servent à la mise en œuvre de l’application doivent être rangés dans des répertoires organisés de la même manière que ceux déployer pour exécution.
Ce principe de base d’organisation de la configuration logicielle simplifie le déploiement, les procédures d’installation en évitant les « pertes » de fichiers.

Autre avantage à cette organisation des sources et de limiter la divergence d’exécution entre la version lancée sous Eclipse et celle déployée. De permettre donc de traiter (identifier, voir reproduire) les bugs en environnement de dév, plutôt qu’en environnement d’intégration où il n’y a souvent pas de débugger.

Avec Eclipse, j’engage les développeurs à utiliser un projet par package fonctionnel mais aussi technique : 1 pour le client, 1 pour le serveur, 1 pour les tests, 1 pour les « commons ».
Cela garantie la séparation des couches et évite au développeur de tirer des classes serveurs directement dans le package client.
L’utilisation des Working Set Eclipse permet d’améliorer la vue lorsqu’il y a une multitude de projets.
Sans parler de standardisation (breeuuu…), l’organisation des sources pour le développement d’une appli web est souvent contrainte par l’organisation des conteneurs (webapps).
Répertoire WEB-INF, lib, js, conf, … Certains plugins Eclipse imposent même l’arborescence des sources.
Il est intéressant de s’inspirer de ces principes pour le développement d’application non web.

Agilité et Web2.0

Je viens de participer à un séminaire organisé par le CNES sur le thème :
"Impact et retours du Web 2.0 en entreprise".
http://cct.cnes.fr/cct05/public/sommaire.htm

J'ai pour ma part présenté l'apport du Web 2.0 dans le contexte de nos projets Agiles.

L'apport fonctionnel dans un premier temps: Communautaire, participatif et créatif.
Puis l'apport des technologies Web2.0 (type Ajax, Flex, ...), apportant une souplesse ergonomique fort pratique, et changeant nos vieux sites Web en un framework collaboratif grâce à l'intégration de différents outils : Confluence, Rally, Trac, Eclipse (Mylin), Continuum, ...

Il est intéressant de voir que le Web 2.0, tout comme l'Agilité, fait encore peur en entreprise.
Est-ce la peur de la perte de contrôle pour certains au regard de la prise de responsabilité par les autres?
A suivre...