Pourquoi voudriez-vous exécuter des tests unitaires sur un serveur CI?
Sûrement, au moment où quelque chose se met à maîtriser, un développeur a déjà exécuté tous les tests unitaires avant et corrige les erreurs qui auraient pu se produire avec son nouveau code. N'est-ce pas le but des tests unitaires? Sinon, ils viennent de commettre un code erroné.
master
doit toujours être sain d'esprit et, de préférence, automatiquement déployé à chaque fusion dans un environnement intermédiaire pour le contrôle et l'assurance qualité internes.Réponses:
Ou pas. Cela peut être dû à plusieurs raisons:
Mais le vrai problème est d'exécuter les tests sur une machine autre que la machine à développer. Celui qui est configuré différemment.
Cela aide à résoudre les problèmes où les tests et / ou le code dépendent de quelque chose de spécifique à une zone de développement (configuration, données, fuseau horaire, paramètres régionaux, etc.).
Voici d'autres bonnes raisons pour lesquelles CI construit des tests:
la source
En tant que développeur qui n'exécute pas tous les tests d'intégration et unitaires avant de s'engager dans le contrôle de code source, je vais proposer ma défense ici.
Je devrais construire, tester et vérifier qu'une application s'exécute correctement sur:
Ajoutez à cela Fortran (avec les compilateurs Intel et GNU), Python (et ses différentes versions en fonction du système d'exploitation) et les composants de script bash / bat et, eh bien, je pense que vous pouvez voir les choses se dérouler en spirale
Il me faudrait donc seize machines, pour pouvoir effectuer quelques tests plusieurs fois par jour. Ce serait presque un travail à plein temps que de gérer l'infrastructure pour cela. Je pense que presque tout le monde est d'accord pour dire que c'est déraisonnable, surtout en multipliant le nombre de personnes dans le projet. Nous avons donc laissé nos serveurs CI faire le travail.
Les tests unitaires ne vous empêchent pas de commettre un code erroné, ils vous disent s'ils savent que vous avez cassé quelque chose. Les gens peuvent dire que "les tests unitaires doivent être rapides" et continuer sur les principes, les modèles de conception et les méthodologies, mais en réalité, il est parfois parfois préférable de laisser les ordinateurs que nous avons conçus pour des tâches répétitives et monotones le faire et ne les impliquer que s'ils Dis-nous qu'ils ont trouvé quelque chose.
la source
Outre l'excellente réponse de Oded:
Une fois, j'ai travaillé sur une entreprise qui présentait de nombreux problèmes de déploiement en raison du processus de fusion et de déploiement. Cela était dû à un cadre de propriété étrange qui rendait les tests et l'IC difficiles. Ce n’était pas une expérience heureuse de constater que le code qui fonctionnait parfaitement pour le développement n’arrivait pas directement en production.
la source
Vous penseriez que non, mais les développeurs sont humains et oublient parfois.
En outre, les développeurs ne parviennent souvent pas à extraire le dernier code. Leurs derniers tests pourraient bien fonctionner, puis au moment de l’enregistrement, une autre personne commet un changement radical.
Vos tests peuvent également s'appuyer sur une ressource locale (non contrôlée). Quelque chose que vos tests d'unité locale n'auraient pas compris.
Si vous pensez que tout ce qui précède est fantaisiste, il existe un niveau supérieur à CI (sur TFS au moins) appelé Gated où les versions dont les tests ont échoué sont stockées et ne sont pas affectées à la base de code.
la source
En général, je configure mon CI pour s’exécuter sur chaque commit. Les branches ne sont pas fusionnées dans le maître tant que la branche n’a pas été testée. Si vous comptez exécuter des tests sur master, cela ouvre une fenêtre pour que la construction soit cassée.
L'exécution des tests sur une machine CI implique des résultats reproductibles. Étant donné que le serveur CI a un environnement propre connu extrait de votre VCS, vous savez que les résultats du test sont corrects. Lorsque vous exécutez localement, vous pouvez oublier de valider le code nécessaire à leur transmission ou disposer d'un code non engagé qui les fait passer alors qu'ils devraient échouer.
Cela permet également aux développeurs de gagner du temps en exécutant différentes suites en parallèle, en particulier s'il s'agit de tests lents de plusieurs minutes qui ne risquent pas de s'exécuter localement après chaque modification.
Dans mon travail actuel, notre déploiement de production est déclenché sur CI en passant tous les tests. Les scripts de déploiement empêcheront le déploiement à moins qu'ils ne passent. Cela rend impossible d'oublier accidentellement de les exécuter.
Le fait que CI fasse partie du flux de travail allège également le fardeau des développeurs. En tant que développeur, exécutez-vous habituellement un linter, un analyseur statique, un test unitaire, une couverture de code et un test d'intégration pour chaque modification? CI peut, de manière totalement automatique et sans avoir besoin d'y penser, ce qui réduit la fatigue des décisions.
la source
Au moment de maîtriser quelque chose, un développeur devrait déjà avoir exécuté tous les tests unitaires ... mais que se passe-t-il s'ils ne le font pas? Si vous n'exécutez pas les tests unitaires sur le serveur CI, vous ne le saurez pas tant que quelqu'un n'aura pas modifié les modifications apportées à leur ordinateur et découvert les tests qui viennent de se produire.
De plus, le développeur peut avoir commis une erreur et référencé une ressource locale spécifique à sa machine. Lorsqu'ils archivent le code et que l'exécution du CI échoue, le problème est immédiatement identifié et peut être corrigé.
la source
En supposant (contrairement à d’autres réponses) que les développeurs sont assez disciplinés et effectuent des tests unitaires avant de s’engager, il peut y avoir plusieurs raisons:
la source
Il est possible d'imaginer des cas où le changement A ne rompt pas le test et le changement B ne le rompt pas, mais A et B ensemble . Si A et B sont créés par des développeurs différents, seul le serveur CI détecte le nouveau bogue. A et B peuvent même être deux parties de la même phrase plus longue.
Imaginez un train conduit par les deux locomotives A et B. Peut-être qu’une seule suffirait et c’est la solution à appliquer. Cependant, si les deux "correctifs" sont appliqués en supprimant les deux, le train ne bougera pas.
En outre, tous les développeurs n'exécutent pas tous les tests unitaires, contrairement à la plupart des bons développeurs.
la source
Posons une question équivalente:
Il y a plusieurs raisons pour faire de l'EC, mais son objectif principal est de se faire une idée de l'état du code dans le temps. Le principal avantage (parmi plusieurs) que cela procure est que nous pouvons savoir quand la construction commence, déterminer ce qui l’a brisé, puis le réparer.
Si le code n'est jamais cassé, pourquoi utilisons-nous même un CI? Pour fournir des versions à tester, des versions nocturnes seraient suffisantes.
la source