Généralement, en plus de tester le code pendant son processus d'écriture, les développeurs sont également responsables des tests unitaires. Les tests qui vérifient les modules, méthodes, fonctions et procédures de bas niveau nécessitent généralement une plongée profonde dans le contexte du code, et si ces tests ne sont pas écrits pendant ou immédiatement après le développement, la complexité et les efforts nécessaires pour écrire de tels tests augmentent considérablement. Cela est dû au fait qu'après plusieurs jours, le développeur devra à nouveau se plonger dans le code, et quelqu'un qui n'a pas écrit le code devra également l'étudier pour comprendre comment le tester.
Par conséquent, je conclus que ce sont les développeurs qui doivent écrire les tests unitaires. Et si ces tests ne sont pas écrits immédiatement, il vaut mieux ne pas les écrire du tout et se concentrer sur les tests à un niveau supérieur. À mon avis, cette approche serait beaucoup plus efficace dans cette situation.
Ensuite, l'équipe d'Assurance Qualité (QA) entre en jeu. Leur travail diffère considérablement des tests écrits par les développeurs. Ils testent l'interaction de haut niveau des modules, la fonctionnalité (logique métier) de l'application et l'interaction avec l'utilisateur, mais n'effectuent pas de tests de code de bas niveau pour les raisons que j'ai évoquées ci-dessus. Cette équipe comprend à la fois des testeurs manuels et des personnes impliquées dans l'automatisation des tests. Qui exactement est responsable de l'intégration dans les pipelines CI est une question organisationnelle. Dans notre cas, supposons qu'il s'agisse d'un ingénieur DevOps responsable de l'ensemble du pipeline d'automatisation des tests.
L'équipe de test manuel étudie la documentation et la fonctionnalité de notre produit logiciel et rédige des scénarios étape par étape pour tester correctement le système. Ces scénarios sont ensuite utilisés à la fois pour les tests manuels et pour l'automatisation.
Une partie de l'équipe responsable de l'automatisation crée des tests, que je divise également en deux parties:
- Tests développeur
- Tests système
Veuillez noter que le terme "test système" ici a une signification légèrement différente de celle généralement comprise dans la théorie du test.
Les tests développeur sont des tests qui fonctionnent dans une partie isolée de l'application. Techniquement, ils sont les mêmes que les tests unitaires, créés selon les mêmes règles et en utilisant les mêmes frameworks, mais ils testent non pas le code de module de bas niveau mais l'interaction de plus haut niveau au sein de l'application (tests d'intégration) et, si possible, la correction de la fonctionnalité principale du système (tests fonctionnels). Essentiellement, dans le code, on peut émuler une demande utilisateur spécifique et vérifier comment le système y répond. Juste sans utiliser l'interface utilisateur. Ces tests, comme les tests unitaires, peuvent être exécutés sans déployer une installation complète du système. Ils sont généralement très rapides et ne nécessitent pas de ressources spéciales pour s'exécuter.
Les tests système sont tous les tests qui nécessitent un déploiement complet de l'instance du système. Cela comprend les tests API, les tests d'interface utilisateur, les tests de charge, et autres. Ils utilisent généralement des frameworks spéciaux et nécessitent plus de temps pour s'exécuter. Par conséquent, le "coût" d'exécution de tels tests est plus élevé.
En fin de compte, nous obtenons deux catégories de tests :
- rapides et "bon marché" mais plus superficiels et synthétiques
- lents et "chers" mais plus profonds et complets
En suivant le
principe de Pareto, nous pouvons nous attendre à ce que les tests rapides nous aident à détecter environ 80 % des bogues, tandis que les tests lents nous aideront à trouver les autres.
Et en fonction de cette logique, pour améliorer considérablement la qualité de notre logiciel, il suffit de lancer les tests rapides, par exemple, avec chaque demande de tirage, tandis que l'exécution des tests lents est moins fréquente et dans des cas spéciaux (par exemple, lors de la préparation des versions).
Et en fin de compte, nous obtenons le schéma suivant