Notre équipe de développement utilise la stratégie de branchement GitFlow et c’est génial!
Récemment, nous avons recruté deux testeurs pour améliorer la qualité de nos logiciels. L'idée est que chaque fonctionnalité doit être testée/QA par un testeur.
Auparavant, les développeurs travaillaient sur des fonctionnalités dans des branches de fonctionnalités distinctes et les fusionnaient dans la branche develop
à la fin. Le développeur testera lui-même son travail sur cette branche feature
. Maintenant, avec les testeurs, nous commençons à poser cette question
Sur quelle branche le testeur doit-il tester les nouvelles fonctionnalités?
De toute évidence, il y a deux options:
develop
Au départ, nous pensions que c’était la voie à suivre pour les raisons suivantes:
develop
depuis le début de son développement.develop
) à la fois. Il n'a pas besoin de demander au développeur quelle branche correspond à quelle fonctionnalité (les branches de fonctionnalités sont des branches personnelles gérées exclusivement et librement par les développeurs concernés)Le plus gros problème avec ceci est:
La branche develop
est polluée par des bugs.
Lorsque le testeur trouve des bogues ou des conflits, il les signale au développeur, qui corrige le problème dans la branche de développement (la branche de fonctionnalité a été abandonnée une fois fusionnée), et des correctifs supplémentaires pourraient être nécessaires par la suite. Plusieurs sous-séquences commettent ou fusionnent (si une branche est recréée de nouveau sur la branche develop
pour corriger les bogues), il est très difficile, si possible, de revenir à la fonctionnalité de la branche develop
. Plusieurs entités fusionnent et sont corrigées sur la branche develop
à des moments différents. Cela crée un gros problème lorsque nous voulons créer une version avec seulement certaines des fonctionnalités de la branche develop
Nous avons donc réfléchi à nouveau et décidé de tester les fonctionnalités dans les différentes branches. Avant de tester, nous fusionnons les modifications de la branche develop
à la branche feature (rattrapons la branche develop
.). C'est bon:
develop
;Cependant, il y a quelques inconvénients
develop
. Cela signifie que vous devrez tester à nouveau la branche develop
lorsque les deux fonctionnalités seront fusionnées dans la branche develop. Et vous devez vous rappeler de tester cela à l'avenir.Ci-dessus est notre histoire. Avec des ressources limitées, je voudrais éviter de tout tester partout. Nous cherchons toujours un meilleur moyen de faire face à cela. J'aimerais savoir comment les autres équipes gèrent ce genre de situation.
La façon dont nous le faisons est la suivante:
Nous testons les branches après avoir fusionné le dernier code de branche développé. La raison principale est que nous ne voulons pas "polluer" le code de branche développé avant qu'une fonctionnalité ne soit acceptée. Au cas où une fonctionnalité ne serait pas acceptée après les tests mais que nous aimerions publier d'autres fonctionnalités déjà fusionnées sur develop, ce serait un enfer. Develop est une branche à partir de laquelle une libération est effectuée et devrait donc être dans un état libérable. La version longue est que nous testons en plusieurs phases. Plus analytiquement:
Que pensez-vous de cette approche?
Avant le test, nous fusionnons les modifications de la branche develop à la branche feature
Non, surtout si "nous" est le testeur d'assurance qualité. La fusion impliquerait la résolution de conflits potentiels, ce qui est mieux fait par les développeurs (ils connaissent leur code), et non par le testeur QA (qui doit procéder au test le plus rapidement possible).
Faites que le développeur fasse une rebase de sa branche feature
au-dessus de devel
, et Poussez cette feature
branche (validée par le développeur comme compilant et travaillant au-dessus de l'état de branche le plus récent devel
) .
Cela permet:
develop
, mais seulement si aucun conflit n'est détecté par GitHub/GitLab.Chaque fois que le testeur détecte un bogue, il le signale au développeur et delete à la branche de fonctionnalité actuelle.
Le développeur peut:
feature
.Idée générale: assurez-vous que la partie fusion/intégration est effectuée par le développeur, laissant les tests à l'AQ.
La meilleure approche est intégration continue , où l’idée générale est de fusionner les branches d’entités dans la branche développeur aussi souvent que possible. Cela réduit les frais généraux liés à la fusion des douleurs.
Fiez-vous autant que possible aux tests automatisés et lancez automatiquement les versions avec les tests unitaires de Jenkins. Demandez aux développeurs de fusionner leurs modifications dans la branche principale et fournissez des tests unitaires pour tout leur code.
Les testeurs/les responsables de l'assurance qualité peuvent participer à la révision du code, cocher des tests unitaires et écrire des tests d'intégration automatisés à ajouter à la suite de régression à mesure que les fonctionnalités sont complétées.
Pour plus d'informations, consultez ceci lien .
Nous utilisons ce que nous appelons "or", "argent" et "bronze". Cela pourrait s'appeler prod, staging et qa.
Je viens d'appeler cela le modèle du melting pot. Cela fonctionne bien pour nous car nous avons un besoin énorme d’AQ dans le domaine commercial, car les exigences peuvent être difficiles à comprendre par rapport aux techniques.
Lorsqu'un bogue ou une fonctionnalité est prêt à être testé, il passe en "bronze". Cela déclenche une génération jenkins qui pousse le code dans un environnement pré-construit. Nos testeurs (pas des super-techniciens en passant) ont juste mis le doigt sur un lien et ne se sont pas souciés du contrôle de source. Cette version exécute également des tests, etc. Nous avons déjà parcouru cette version en poussant le code dans l’environnement de test\qa si les tests (unité, intégration, Selenium) échouent. Si vous testez sur un système séparé (nous l'appelons lead), vous pouvez empêcher les modifications d'être transmises à votre environnement qa.
La crainte initiale était que nous aurions beaucoup de conflits entre ces fonctionnalités. Cela arrive si la fonctionnalité X donne l’impression que la fonctionnalité Y est en train de s’ouvrir, mais elle est assez peu fréquente et aide réellement. Cela aide à obtenir une large gamme de tests en dehors de ce qui semble être le contexte du changement. Plusieurs fois par chance, vous découvrirez comment vos changements affectent le développement parallèle.
Une fois qu'une fonctionnalité passe le contrôle de qualité, nous la déplaçons en "argent" ou en mise en scène. Une construction est exécutée et les tests sont exécutés à nouveau. Chaque semaine, nous transmettons ces modifications à notre arbre "or" ou à notre arbre de production, puis nous les déployons dans notre système de production.
Les développeurs commencent leurs modifications à partir de l'arbre d'or. Techniquement, vous pourriez commencer par la mise en scène, car celles-ci augmenteront bientôt.
Les correctifs d'urgence sont placés directement dans l'arbre d'or. Si un changement est simple et difficile à contrôler, il peut passer directement en argent, ce qui aboutira à l’arbre de test.
Après notre publication, nous plaçons les modifications de gold (prod) à bronze (test) juste pour que tout soit synchronisé.
Vous voudrez peut-être rebaser avant de placer votre nom dans le dossier intermédiaire. Nous avons constaté que la purge de l’arbre de test de temps en temps le maintient propre. Il arrive parfois que des fonctionnalités soient abandonnées dans l'arborescence de test, en particulier si un développeur s'en va.
Pour les grandes fonctionnalités multi-développeurs, nous créons un référentiel partagé séparé, mais nous le fusionnons dans l'arborescence de test de la même manière lorsque nous sommes tous prêts. Les choses ont tendance à rebondir du contrôle qualité, il est donc important de garder vos ensembles de modifications isolés afin que vous puissiez les ajouter, puis les fusionner/écraser dans votre arborescence intermédiaire.
"Baking" est aussi un bel effet secondaire. Si vous avez des changements fondamentaux que vous souhaitez laisser reposer pendant un moment, il existe un bel endroit pour cela.
Gardez également à l'esprit que nous ne conservons pas les versions antérieures. La version actuelle est toujours la seule version. Même dans ce cas, vous pourriez probablement avoir un arbre de pâtisserie principal où vos testeurs ou votre communauté pourront voir comment les différents contributeurs interagissent.
Je ne compterais pas uniquement sur les tests manuels. J'automatiserais les tests de chaque branche avec Jenkins. J'ai configuré un laboratoire VMWare pour exécuter des tests Jenkins sur Linux et Windows pour tous les navigateurs. C'est vraiment une excellente solution de test multi-navigateurs et multi-navigateurs. Je teste fonctionnel/intégration avec Selenium Webdriver. Mes tests de sélénium fonctionnent sous Rspec. Et je les ai spécialement écrites pour être chargées par jRuby sous Windows. Je réalise des tests unitaires classiques sous Rspec et des tests Javascript sous Jasmine. J'ai configuré les tests sans tête avec Phantom JS.