Alt-F4 #48 - Angel's Automated Unit Tests 24.09.2021
übersetzt von EDLEXUS, lektoriert von marceljoint
Nach langer Zeit meldet sich ein alter Bekannter namens Lovely_Santa zurück! Zuletzt haben wir von unserem Helden in Ausgabe #2 gehört, als er mit den Modding-Fähigkeiten des (damals) neuen Spidertron experimentierte. Dieses Mal bleibt er tatsächlich beim Thema Angel’s Mods, auch wenn er über etwas ganz anders schreibt …
Ein erfolgreicher Versuch, Modtests zu automatisieren Lovely_Santa
Bevor ich die Geschichte erzähle, wie wir die langweiligen Teile der Modentwicklung automatisiert haben, muss ich euch erzählen, wie alles angefangen hat. Unsere Geschichte beginnt vor langer Zeit, naja eher irgendwann Ende 2019. Und damit meine ich nicht die bekannte Geschichte, wie Covid-19 angefangen hat, sondern die traurige Geschichte von Arch666Angel, welcher sich aus der Entwicklung seiner bekannten Angel’s Mods zurückzieht. Der Grund dafür waren Veränderungen in seinem realen Leben, welche ich jetzt nicht weit ins Detail erklären werde, wichtig ist nur zu wissen, das einige Modder daran interessiert waren, seine Projekte und sein Vermächtnis zu übernehmen.
Es dauerte bis zum 27. Januar 2020 Arch666Angel davon zu überzeugen, dass die Community sein Projekt weiterführt. Nachdem die Details geklärt waren, wählte er einige Leute aus, die seine Visionen in den Mods weiterführen sollten, sodass wir nun auch die Öffentlichkeit über die Änderungen informieren konnten. Die meisten Interaktionen liefen über das Factorio-Forum, wo du auch heute noch die öffentliche Mitteilung lesen kannst.
Im Januar 2020 waren wir bereits dabei, die Mods von 0.17 auf 0.18 zu übertragen, mit all den Veränderungen des Grundspiels, die alle Mods zerschossen haben. Nach Arch666Angels Endabnahme veröffentlichten wir unsere erste 0.18 Version! Bald nachdem wir unseren Erfolg feierten, holte uns die Realität mit großen Mengen Bugreports in den Foren ein. Wir ahnten nicht, wie groß dieses Unterfangen werden würde, wie viel Zeit wir mit Bugfixing verbringen würden, aber vor allem ahnten wir nicht, wie hilfsbereit die Community ist, welche uns half, Fehler zu finden und zu beheben.
Es begann klein
Mithilfe der Community lernten wir, wie Angels Bibliothek funktionierte. Für alle, die nicht wissen, was eine Bibliothek ist: Eine Bibliothek ist eine Sammlung hilfreicher Funktionen, welche Factorios Codebase abstrahieren, um die Programmierung zu vereinfachen. Es ist hauptsächlich eine Liste mit Quality of Life-Funktionen für den Entwickler, so das er sich darauf konzentrieren kann, neue Features zu programmieren, und nicht seine Zeit mit Grundlagen zu verschwenden. Man kann Angels Bibliothek mit anderen Einzelmods wie der Factorio Library, Bob’s Functions Library mod, oder meiner eigenen Lovely_santa’s library of knowledge vergleichen. Es gibt keinen ‘richtigen’ oder ‘falschen’ Weg, eine Bibliothek zu implementieren, solange sie das tut, was sie soll. Durch unser neues Verständnis von Angels Bibliothek, welche zu Angel’s Refining gehört und keine eigenständige Mod ist, konnten wir auftretende Bugs effektiver bekämpfen.
Ich kann nun relativ sicher sagen, dass wir keine Programmierfehler mehr machen, die das Spiel oder die Mods zum Absturz bringen. Heutzutage liegen die Fehler eher in unbedachten Randfällen oder komischen Modpacks. Meistens bekommen wir Fehlermeldungen von Spielern, welche mit einigen Angel’s Mods und einigen Bob’s Mods spielen. Der Grund dafür ist simpel: Es gibt viele Einstellungen mit vielen Möglichkeiten, von denen einige Kombinationen nicht bedacht wurden. Ein kleines Beispiel wird im Folgenden erläutert: Man behebt einen Bug, bei dem eine Technologie nicht erforschbar ist, aber nur in einer exotischen Modkombination. Der Grund, warum sie nicht erforschbar ist, ist simpel: Es benötigt eine andere Technologie, welche bisher noch nicht erforscht wurde, weswegen die Technologie nicht erforsch werden konnte, allerdings ist die benötigte Technologie verborgen, kommt also nicht im Technologiebaum vor.
Nach einer Weile findest du eine Konfiguration mit einem ähnlichen Fehler.
Als eine Lösung legten wir eine Liste mit Kombinationen an, welche wir testen mussten. pezzawinkle hat eine winzige Liste mit Kombinationen angelegt, welche er vor jeder Veröffentlichung testet.
Ich für meinen Teil teste jede Veränderung, die ich mache, mit allen Einstellungen, die diese Veränderung betrifft. Der anstrengendste Teil des Bugfixings ist es, alle Angel’s Mods immer wieder in den Modordner zu kopieren. Am 11. April 2020 schrieb ich ein kleines Python-Skript, um alle Angel’s Mods mit den neusten Veränderungen upzudaten.
Das Skript sparte mir viel Zeit und schuf die eine oder andere sporadische Kaffeepause, während es die neuen Mods lud, nachdem ich die eine Zeile veränderte, die sich nicht wie gewünscht verhalten hat. Über die Zeit hatte ich aber mit der Verwendung des Skripts ein anderes Problem: Bob. Ha, Bobbingabout veröffentlichte ein Update für seine Mods, welches all die Arbeit, die ich mir beim Bugfixen gemacht habe, zunichte machte … Am 3. Mai 2021, fast ein Jahr später, schrieb ich ein weiteres Python-Skript, welches alle Bob’s Mods vom Modportal runterlud, anstelle sie eine nach der anderen im Spiel zu laden.
Der Ball kam ins Rollen
Am Ende von 2020 entschieden wir uns dazu, ein großes Feature in Angel’s Industries anzugehen: eine anständige Implementierung der Komponenten- und Technologieüberarbeitung. Das war das letzte Feature, an dem Arch666Angel gearbeitet hat, bevor er sich aus dem Modding zurückgezogen hat. Am 26. Mai 2021 (ein halbes Jahr nach der letzten Version) präsentierten wir die neue Version der Öffentlichkeit, worauf bald eine Welle an Bugreports folgte.
Wir fanden, dass wir mit der neuen Überarbeitung viel mehr Konfigurationen geschaffen haben, mit viel mehr Einstellungen. An dieser Stelle wurde es sehr anstrengend, alles per Hand zu testen und instand zu halten. Ich dachte darüber nach, einige Modultests zu schreiben, um uns etwas von der Arbeit abzunehmen. Nach einigen Diskussionen mit der, wie immer hilfreichen, Moddingcommunity, entschloss ich mich am 30. Juni 2021 dazu, die Modultestinfrastruktur zu schaffen, in einer eigenen Mod: Angel’s Dev - Unit Tests. Diese Mod ist allerdings nicht auf dem Modportal zu finden.
Ich hatte bereits einen Weg, die Angel’s Mods direkt aus dem GitHub-Ordner in den Factorio-Modordner zu bauen, und auch ein ähnliches Skript um Bob’s Mods direkt vom Modportal zu holen. Um verschiedene Konfigurationen zu testen, benötigte ich zwei zusätzliche Skripts: Das erste Skript liest und schreibt die mod-settings.dat
-Datei neu mit den Modeinstellungen. Die Einstellungsdatei speichert all die Nutzereinstellungen, welche zu verschiedenen Modkonfigurationen führen können. Beispielsweise kann in Angel’s Industries umgeschaltet werden zwischen special vanilla, bobs-angels (= typische Überarbeitung, kann aber auch ohne Bob’s Mods gespielt werden), component overhaul (Komponentenüberarbeitung) oder science overhaul (Wissenschaftsüberarbeitung). Es kann im Prinzip das gesamte Verhalten der Mods mit nur einigen wenigen Checkboxen verändern werden:
Da das laden und speichern von Modeinstellungen eine Sache ist, die vom Grundspiel erledigt wird, war es ein Teil, den ich vorher beim Mods schreiben noch nicht benötigt habe. Allerdings war ich positiv überrascht, als ich ausgiebige Dokumentation auf dem Factorio-Wiki dazu gefunden habe.
Das zweite Skript konfiguriert die mod-list.json
-Datei, welche Informationen darüber enthält, welche Mods aktiv sind. Das ist der Teil, mit dem die meisten Leute vertraut sind, die gemoddetes Factorio spielen. Sie laden Mods vom Modportal herunter, und nachdem sie ein Spiel beendet haben, deaktivieren sie die Mods und spielen mit anderen Mods. Ein Beispiel der Bob’s Angel’s Modliste ist unten gezeigt, und alle Einstellungen wurden über das Skript vorgenommen.
Mit diesen vier Skripts ist alles an einer Stelle, um Factorio mit einer bestimmten Konfiguration an aktuellsten Mods und ihren Einstellungen zu starten. Es ging jetzt nur noch darum, Factorio zu sagen, immer wieder mit verschiedenen Einstellungen zu starten. Vorausgesetzt eine Mod im Spiel (in diesem Fall ‘Angel’s Dev - Unit Tests’) erzählt der Testinfrastruktur, das der Test beendet ist, kann es Factorio beenden und mit einer neuen Konfiguration zu starten. Zu diesen Zeitpunkt konnte die Testinfrastruktur prüfen, ob alle Konfigurationen ohne Absturz laden, ohne abzustürzen. Nachdem das Spiel geladen wurde, kann die Modultestmod alles im Spiel verifizieren, zur Runtime.
Das letzte Puzzlestück
Eine Woche später, am 8. Juni 2021, war ich fertig mit dem grundlegendsten Modultest, welcher nicht mehr tat, als auszugeben, welche Mods im Spiel aktiv sind. Nachdem der Modultest fertig damit war, die Ergebnisse zu speichern, konnte das Hauptskript die neue Konfiguration laden. Eine Beispielausgabe für einen einzelnen Modultest mit einer einzigen Konfiguration ist im Folgenden zu sehen:
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)
Wie jeder Entwickler weis, könnte dieses minimal viable product (MVP) noch einige Verbesserungen vertragen. Nach ausgiebiger Verwendung fügte ich am 22. August 2021 zwei weitere Features hinzu, wobei das erste eine zusätzliche Datei anlegte, in der alle Testkonfigurationen hinterlegt sind, so das es einfacher wird, neue Konfigurationen hinzuzufügen, falls diese benötigt werden. Das zweite Feature fügte die Möglichkeit hinzu, die Testergebnisse in einer Datei zu speichern. Dadurch konnten neue Testergebnisse mit alten verglichen werden, auch mit externen Werkzeugen wie ExamDiff Pro. Dies ist hauptsächlich dafür da, zu prüfen, das bestimmte Fehler nicht mehr auftreten (Fehlermeldung fehlt in neuem Ergebnis), ohne eine neue Mitteilung hinzuzufügen.
Das Endergebnis
Nach Fertigstellung der Minimallösung haben wir bereits ein Update veröffentlicht. Nach zwei Wochen warten auf große Fehler, die das Spiel zum abstürzen bringen, waren wir überrascht darüber, das wir fast keine Fehler dieser Art hatten. Ich habe für mich selbst eine Neue ‘Regel’ zur Instandhaltung der Angel’s Mods: Wenn ein Bug gefunden wird, baue ich erst einen passenden Modultest, um den Bug zu finden, bevor ich ihn behebe. Es dauert leider relativ lange, alle Modultests durchlaufen zu lassen, aber diese Zeit wird trotzdem effektiv für Kaffeepausen genutzt.
Aktuell prüfen die (wenigen) Modultests die wir haben nur die Ladephase des Spiels (auch bekannt als die Data Stage). Allerdings hält uns nichts davon ab, komplexere Tests zu schreiben, die auch während des Spiels Tests durchführen (auch bekannt als die Runtime Stage).
Ich hoffe, das hilft mir (als Entwickler) dabei, weniger Zeit mit Bugs zu verbringen und mehr Zeit damit neue Features zu implementieren. Ich verstehe, dass dies nicht für kleine, einzelne Mods nötig ist, aber es ist sehr praktisch, um eine große Codebase instand zu halten, insbesondere wenn man mit mehreren Leuten arbeitet, die nicht die Möglichkeit haben, über jede Codezeile drüberzuschauen und jedes Detail jedes neuen Features zu kennen.
Das ist meine Geschichte, in der ich selbst gelernt habe, wie und warum große Firmen Modultests, Codeintegration und viele Automatikwerkzeuge verwenden, um ihren Prozess für neue Features zu vereinfachen, mit der Garantie, das ihr Code das tut, was er soll und nicht Millionen Nutzer frustriert mit einer inhaltslosen Fehlermeldung wie “Aufgabe erfolgreich fehlgeschlagen. Kontaktieren sie die Entwickler.” zurücklässt.
Beitragen
Wie immer suchen wir nach Leuten, die zu Alt-F4 beitragen wollen, sei es mit einem Artikel oder durch Hilfe bei Übersetzungen. Wenn du etwas Interessantes im Kopf hast, das du mit der Community in einer eleganten Art teilen möchtest, hier kannst du das tun. Falls du dir unsicher bist, beantworten wir gerne Fragen zu Inhalt und Struktur. Falls das nach etwas klingt, woran du interessiert bist, tritt unserem Discord bei, um es nicht zu verpassen!