Alt-F4 n°48 - Tests unitaires automatiques pour Angel  24-09-2021

Écrit par Lovely_Santa, édité par stringweasel, Nanogamer7, Conor_, Therenas, Firerazer,
traduit par bev, Firerazer

Sommaire

Après une longue pause, un ancien contrinuteur du nom de Lovely_Santa est de retour à la tâche ! La dernière fois que nous avions entendu parler de notre héros, c’était avec notre parution n°2 où il expérimentait les possibilités de modding du nouveau (en ce temps là) spidertron. Cette fois-ci, il reste sur son sujet de la suite de mods Angel, tout en écrivant quelque chose de tout à fait différent…

Une tentative réussie de tests automatiques de mods Lovely_Santa

Avant de vous parler de cette histoire d’automatisation de la partie la plus ennuyeuse de la création d’un mod pour Factorio, je dois vous ramener au commencement… Il était une fois, non… Il faut que je commence quelque part vers la fin de 2019. Et je ne parle pas des débuts bien connus de la COVID-19, mais de la triste nouvelle de Arch666Angel qui a alors décidé de ne plus travailler sur ses célèbres mods d’Angel. Tout cela est dû à des changements dans sa vie. Je ne vais pas vous en expliquer tous les détails, mais il en a résulté que quelques moddeurs ont souhaité reprendre ses projets et son œuvre.

Il a fallu attendre le 27 janvier 2020 pour convaincre Arch666Angel de laisser la communauté contribuer à sa création. Après avoir réglé tous les détails, il a sélectionné quelques personnes pour faire perdurer sa vision des mods, et c’est à ce moment-là que nous avons pu en informer la communauté. La principale communication s’est faite à l’époque via les forums de Factorio, où vous pouvez aujourd’hui encore lire le message d’annonce.

En janvier 2020, nous avions déjà commencé à mettre à jour les mods de la version 0.17 à la version 0.18, avec tous les changements introduits dans le jeu de base. Après l’approbation d’Arch666Angel, nous avons publié notre première version “Initial 0.18 release” ! Peu de temps après avoir célébré notre succès, la réalité nous est retombée dessus, avec un grand nombre de rapports de bugs sur les forums. Nous étions loin de nous douter de l’ampleur de cette entreprise, du temps que nous allions consacrer aux corrections de bugs et, surtout, de la qualité de la communauté qui allait nous aider à résoudre ces problèmes.

Tout a commencé modestement

Avec l’aide de la communauté, nous avons appris comment fonctionnait la bibliothèque d’Angel. Pour ceux qui ne savent pas ce qu’est une bibliothèque, il s’agit d’un ensemble de fonctions d’aide qui permettent de rendre plus abstraite la base de code de Factorio afin qu’il soit plus facile de programmer avec. Il s’agit principalement d’une liste d’outils intéressants pour le développeur, de sorte qu’il puisse se concentrer sur le développement de fonctionnalités, plutôt que d’écrire du code banal pour que quelque chose fonctionne. Vous pouvez comparer la bibliothèque d’Angel à certains mods autonomes comme Factorio Library, Bob’s Functions Library, ou même ma propre tentative : Lovely_santa’s library of knowledge. Il n’y a pas de “bonne” ou de “mauvaise” façon d’implémenter une bibliothèque, tant qu’elle remplit son rôle. En analysant la bibliothèque d’Angel, qui se trouve en fait au sein du mod Angel’s refining et non en tant que mod autonome, nous avons trouvé des moyens plus efficaces de traiter certains bugs apparaissant dans le mod.

Je suis maintenant persuadé que nous ne faisons plus d’erreurs de codage qui entraîneraient un crash brutal des mods. Aujourd’hui, les problèmes sont probablement des cas limites, des cas non gérés ou une configuration étrange du pack de mods. Le plus souvent, nous recevons des bugs de la part de personnes qui jouent avec certains mods d’Angel et certains mods de Bob. La raison en est simple : il existe de nombreuses configurations avec de nombreux paramètres, ce qui entraîne de nombreux oublis. Un petit exemple est présenté ci-dessous : vous corrigez un bug qui rend une technologie non accessible, dans une configuration exotique présentée ci-dessous. La raison pour laquelle cette technologie ne peut pas être recherchée est simple : elle a une technologie préalable qui n’est pas encore recherchée, mais comme la technologie préalable est cachée, elle n’apparaît pas dans l’arbre des technologies.

Le traitement du nickel ne peut pas être recherché.

Après un certain temps, vous remarquez qu’une autre configuration présente un problème similaire.

Le traitement du nickel ne peut pas être recherché. ENCORE !

Comme solution, nous avons commencé à créer une liste des configurations que nous devions tester. pezzawinkle a récemment dressé une liste pas si petite que ça de toutes les configurations qu’il teste à chaque fois qu’il prépare une nouvelle version.

Personnellement, je teste chaque modification que je fais avec toutes les configurations que j’ai influencées. La partie la plus fastidieuse de la correction des bugs est de devoir recharger tous les mods d’Angel dans le dossier mod, encore et encore. Le 11 avril 2020, j’ai donc créé un petit script python qui met à jour tous les mods d’Angel avec les dernières modifications.

Ce script m’a fait gagner énormément de temps, me permettant de faire une pause-café de temps en temps pendant qu’il rechargeait les mods, après avoir modifié cette ligne qui ne se comporte jamais comme prévu. En utilisant ce script au fil du temps, j’ai rencontré un autre problème : Bob. Oui, Bobbingabout avait publié une mise à jour de ses mods, et cela a cassé tout le travail que je venais de faire pour corriger un bug… Le 3 mai 2021, presque un an plus tard, j’ai créé un autre petit script python pour télécharger tous les mods de Bob depuis le portail, plutôt que de le faire en jeu, un par un.

Tout s’est accéléré

À la fin de 2020, nous avons décidé de travailler sur une grande fonctionnalité au sein du mod Angel’s Industries : une implémentation adéquate de la refonte des composants et des technologies. Il s’agissait de la dernière fonctionnalité sur laquelle Arch666Angel travaillait avant de se retirer du modding. Le 26 mai 2021 (six mois après la dernière version), nous avons présenté la nouvelle version de la refonte au public, après quoi les rapports de bugs ont commencé à affluer rapidement.

Nous avons réalisé qu’avec les refontes, nous avons créé beaucoup plus de configurations, avec encore plus de paramètres. À ce stade, il est devenu assez difficile de maintenir et de tester tout cela à la main. J’ai donc commencé à envisager de créer des tests unitaires pour nous soulager de ce fardeau. Après quelques discussions et propositions de la part de la communauté des moddeurs, toujours très coopérative, j’ai finalement décidé le 30 juin 2021 de m’engager dans la création d’une infrastructure de tests unitaires, regroupée dans un mod séparé : Angel’s Dev - Unit Tests. Vous ne trouverez pas ce mod sur le portail de mods.

J’avais déjà un moyen de transférer les mods d’Angel depuis le dossier Github vers le dossier des mods de Factorio et un script similaire pour télécharger les mods de Bob depuis le portail des mods. Afin de tester différentes configurations, j’ai dû écrire deux scripts supplémentaires. Le premier script lit et réécrit le fichier mod-settings.dat avec les paramètres du mod. Ce fichier stocke tous les paramètres configurés par l’utilisateur, ce qui peut conduire à des configurations très différentes du mod. Par exemple, dans Angel’s Industries, il peut être utilisé pour choisir entre spécial vanilla, bob-angels (= refonte classique, également possible sans les mods de Bob), révision des composants ou révision des sciences. En gros, il peut changer le comportement complet des mods d’Angel avec seulement quelques cases à cocher :

Configurations dans Angel’s Industries

Étant donné que le chargement et la sauvegarde des paramètres des mods sont entièrement gérés par le jeu de base, c’est une partie que je n’avais pas abordée auparavant lors de la création de mods. Cependant, j’ai été très surpris de trouver une documentation complète sur le Wiki de Factorio à ce sujet.

Le deuxième script configure le fichier mod-list.json, qui contient les informations sur les mods qui doivent être activés. C’est la partie la plus connue des personnes qui jouent à Factorio avec des mods. Ils téléchargent des mods depuis le portail, et après avoir terminé la partie, ils désactivent les mods et jouent ensuite avec d’autres mods. Un exemple de la liste de mods de Bob Angel est présenté ci-dessous, entièrement configurée par un script.

Liste des mods de Factorio avec tous les mods de Bob Angel activés, configurée par un script

Avec ces quatre scripts, tout est en place pour lancer Factorio avec une configuration donnée des derniers mods et de leurs paramètres. Il ne restait plus qu’à demander à Factorio de se lancer encore et encore avec différents paramètres de mods. En supposant qu’un mod en jeu (“Angel’s Dev - Unit Tests” dans ce cas) indique à l’infrastructure de test que les tests sont terminés, celle-ci peut alors arrêter Factorio et lancer la prochaine configuration à vérifier. À ce stade, l’infrastructure de tests unitaires pourrait vérifier si toutes les configurations ont bien été chargées sans se planter. Après le chargement du jeu, le module de test unitaire pourrait vérifier tout ce qui se passe pendant le jeu, en cours d’exécution.

La dernière pièce du puzzle

Une semaine plus tard, le 8 juin 2021, j’ai fini d’écrire le test unitaire le plus basique qui ne fait rien d’autre que de signaler quels mods sont actifs dans le jeu. Après que le test unitaire a fini d’enregistrer les résultats, le script principal peut lancer la configuration suivante. Vous trouverez ci-dessous un exemple de résultat de ce test unitaire pour une seule configuration :

angelsdev-unit-test: Testing Special vanilla (light)
angelsdev-unit-test: Launching factorio.exe
angelsdev-unit-test: Starting 1 unit tests...
angelsdev-unit-test: Starting unit test 001.
angelsdev-unit-test:     Unit testing mod configuration:
angelsdev-unit-test:     angelsdev-unit-test version 0.0.1
angelsdev-unit-test:     angelspetrochem version 0.9.21
angelsdev-unit-test:     angelsrefining version 0.12.1
angelsdev-unit-test:     angelssmelting version 0.6.18
angelsdev-unit-test:     base version 1.1.38
angelsdev-unit-test: Unit test 001 PASSED!
angelsdev-unit-test: Finished testing! All unit tests passed!
angelsdev-unit-test: Closing factorio.exe
... <output of other configurations>
angelsdev-unit-test: Summary:
angelsdev-unit-test: [PASSED] Special vanilla (light)
angelsdev-unit-test: [PASSED] Special vanilla (regular)
angelsdev-unit-test: [PASSED] Special vanilla (extended)
angelsdev-unit-test: [PASSED] Special vanilla (BA)
angelsdev-unit-test: [PASSED] BA (light)
angelsdev-unit-test: [PASSED] BA (regular)
angelsdev-unit-test: [PASSED] BA (extended)
angelsdev-unit-test: [PASSED] BA (extended components)
angelsdev-unit-test: [PASSED] BA (extended technology)
angelsdev-unit-test: [PASSED] BA (BobPower non-default + overhaul)
angelsdev-unit-test: [PASSED] BA (BobPower non-default + components)
angelsdev-unit-test: [PASSED] BA (BobPower non-default + technology)
angelsdev-unit-test: [PASSED] BA (BobAssembly non-default + overhaul)
angelsdev-unit-test: [PASSED] BA (BobLogistics non-default + overhaul)
angelsdev-unit-test: [PASSED] BA (BobRevamp non-default + overhaul)
angelsdev-unit-test: [PASSED] BA (Bob other non-default + overhaul)
angelsdev-unit-test: [PASSED] Pure Angels (overhaul)
angelsdev-unit-test: [PASSED] Pure Angels (components)
angelsdev-unit-test: [PASSED] Pure Angels (technology)

Comme tout développeur le sait, ce produit minimum viable (PMV) a encore besoin d’être peaufiné. Après une utilisation intensive, le 22 août 2021, j’ai ajouté deux fonctionnalités supplémentaires, dont la première consiste à ajouter un fichier séparé contenant toutes les configurations de test, de sorte qu’il devient plus facile d’ajouter de nouvelles configurations si nécessaire. La deuxième fonctionnalité permet d’enregistrer les résultats des tests dans un fichier. Grâce à cela, les nouveaux résultats de test peuvent être comparés avec les anciens résultats en utilisant des outils externes tels que ExamDiff Pro. C’est principalement destiné à vérifier que certains problèmes signalés sont résolus (lignes manquantes dans les nouveaux résultats de test), sans introduire de nouveaux problèmes (lignes ajoutées dans les nouveaux résultats de test).

Le résultat

Nous avons déjà publié une mise à jour depuis l’utilisation du produit minimum viable. Après deux semaines d’attente de bugs majeurs susceptibles de casser le jeu, nous avons été surpris de constater que nous n’en avions pratiquement pas. J’ai personnellement adopté une nouvelle “règle” lors de la maintenance des mods d’Angel : si un bug est découvert, il faut d’abord créer un test unitaire approprié pour le repérer, avant de résoudre le problème. Malheureusement, l’exécution de tous les tests unitaires prend un certain temps, mais il est facile de contourner ce problème en le faisant pendant une pause-café.

Actuellement, les (quelques) tests unitaires dont nous disposons ne vérifient que la phase de chargement du jeu (également appelée phase de données). Cependant, rien ne nous empêche de créer également des tests unitaires complexes qui surveillent le comportement pendant le jeu (phase d’exécution).

J’espère que cela m’aidera (en tant que développeur) à passer moins de temps à l’avenir à corriger les bugs, et à passer plus de temps à mettre en œuvre de nouvelles fonctionnalités. Je comprends que cela n’est pas nécessaire pour de petits mods autonomes, mais c’est très utile pour maintenir une base de code assez importante, surtout lorsque vous développez à plusieurs et que vous n’êtes pas en mesure de vérifier chaque ligne de code que quelqu’un d’autre a écrite, ni de connaître tous les détails de chaque fonctionnalité qui a été ajoutée.

Voici mon histoire personnelle, expliquant comment j’ai appris par moi-même comment et pourquoi les grandes entreprises utilisent des tests unitaires, l’intégration de codes et de nombreux outils pour automatiser leur processus de diffusion de nouvelles fonctionnalités, avec la certitude que le code réussira à faire ce qu’il était censé faire, et ne frustrera pas des millions de personnes avec un petit message peu explicite “La tâche a échoué avec succès. Contactez les développeurs.”

Contribuer

Comme toujours, nous attendons vos contributions pour les Alt-F4, que cela soit par la soumission d’un article ou en aidant pour les traductions. Si vous avez quelque chose d’intéressant en tête que vous souhaitez partager avec la communauté, vous êtes au bon endroit. Si vous n’êtes pas sûr, nous serons heureux de vous aider en discutant structure, contenu et idées. Donc si vous voulez vous impliquer dans les Alt-F4, rejoignez-le Discord pour ne rien rater !