J'étudie des techniques et des stratégies pour faire évoluer notre nombre croissant de tests d'intégration sur notre produit actuel, afin qu'ils puissent (humainement) faire partie de notre développement et du processus CI.
À environ 200+ tests d'intégration, nous atteignons déjà la marque de 1 heure pour terminer un test complet (sur une machine de développement de bureau), et cela affecte négativement la capacité d'un développeur à tolérer l'exécution de l'ensemble de la suite dans le cadre des processus de push de routine. Ce qui affecte la motivation à être discipliné pour bien les créer. Nous testons l'intégration uniquement des scénarios clés d'avant en arrière, et nous utilisons un environnement qui reflète la production, qui est construit à partir de zéro à chaque exécution de test.
En raison du temps qu'il faut pour exécuter, cela crée une boucle de rétroaction terrible et de nombreux cycles gaspillés en attente sur les machines pour terminer les tests, quelle que soit la concentration des tests. Peu importe l'impact négatif plus cher sur les flux et les progrès, la santé mentale et la durabilité.
Nous prévoyons d'avoir 10 fois plus de tests d'intégration avant que ce produit ne commence à ralentir (aucune idée vraiment, mais il ne semble pas que nous commencions encore en termes de fonctionnalités). Nous devons raisonnablement nous attendre à être dans les quelques centaines ou quelques milliers de tests d'intégration, je pense à un moment donné.
Pour être clair, pour essayer d'empêcher que cela ne devienne une discussion sur les tests unitaires par rapport aux tests d'intégration (qui ne devraient jamais être échangés). Nous effectuons les tests unitaires avec TDD ET les tests d'intégration dans ce produit. En fait, nous faisons des tests d'intégration aux différentes couches de l'architecture de services que nous avons, là où cela a du sens pour nous, car nous devons vérifier où nous introduisons des changements de rupture lors du changement des modèles de notre architecture vers les autres domaines de la système.
Un peu sur notre pile technologique. Nous testons actuellement un environnement d'émulation (gourmand en CPU et en mémoire) pour exécuter nos tests de bout en bout. Composé de services Web Azure REST avec un backend noSql (ATS). Nous simulons notre environnement de production en exécutant l'émulateur de bureau Azure + IISExpress. Nous sommes limités à un émulateur et un référentiel backend local par machine de développement.
Nous avons également un CI basé sur le cloud, qui exécute le même test dans le même environnement émulé, et les cycles de test prennent deux fois plus de temps (2 heures +) dans le cloud avec notre fournisseur de CI actuel. Nous avons atteint les limites du SLA des fournisseurs de CI cloud en termes de performances matérielles, et dépassé leur allocation lors de l'exécution des tests. Pour être juste envers eux, leurs spécifications ne sont pas mauvaises, mais elles sont clairement la moitié d'une machine de bureau grunty interne.
Nous utilisons une stratégie de test consistant à reconstruire notre magasin de données pour chaque groupe logique de tests et à précharger les données de test. Tout en assurant l'intégrité complète des données, cela ajoute un impact de 5 à 15% sur chaque test. Nous pensons donc qu'il y a peu à gagner à optimiser cette stratégie de test à ce stade du développement du produit.
Le long et le court de celui-ci est que: alors que nous pouvions optimiser le débit de chaque test (même si jusqu'à 30% -50% chacun), nous n'évoluerons toujours pas efficacement dans un proche avenir avec plusieurs centaines de tests. 1 heure est maintenant encore bien au-delà de ce qui est humainement tolérable, nous avons besoin d'un ordre de grandeur d'amélioration du processus global pour le rendre durable.
Donc, j'étudie quelles techniques et stratégies nous pouvons utiliser pour réduire considérablement le temps de test.
- Écrire moins de tests n'est pas une option. Permet de ne pas débattre de celui-là dans ce fil.
- L'utilisation d'un matériel plus rapide est certainement une option, bien que très coûteuse.
- Exécuter des groupes de tests / scénarios sur du matériel séparé en parallèle est également une option préférée.
- La création d'un regroupement de tests autour de fonctionnalités et de scénarios en cours de développement est plausible, mais en fin de compte pas fiable pour prouver une couverture complète ou la certitude que le système n'est pas affecté par un changement.
- L'exécution dans un environnement de transfert à l'échelle du cloud au lieu de s'exécuter dans l'émulateur de bureau est techniquement possible, bien que nous commencions à ajouter des temps de déploiement aux tests (~ 20 minutes chacun au début du test pour déployer les choses).
- La division des composants du système en pièces logiques indépendantes est plausible dans une certaine mesure, mais nous nous attendons à un kilométrage limité à ce sujet, car les interactions entre les composants devraient augmenter avec le temps. (c.-à-d. qu'un changement est en cours est susceptible d'affecter les autres de manière inattendue - comme cela arrive souvent lorsqu'un système est développé progressivement)
Je voulais voir quelles stratégies (et outils) les autres utilisent dans cet espace.
(Je dois croire que d'autres peuvent rencontrer ce genre de difficulté à utiliser certains ensembles technologiques.))
[Mise à jour: 16/12/2016: Nous avons fini par investir davantage dans les tests parallèles CI, pour une discussion des résultats: http://www.mindkin.co.nz/blog/2015/12/16/16-jobs]