Ich bin kein Softwareentwickler. Ich bin Doktorandin auf dem Gebiet der Geowissenschaften.
Vor fast zwei Jahren habe ich angefangen, eine wissenschaftliche Software zu programmieren. Ich habe nie Continuous Integration (CI) verwendet, hauptsächlich, weil ich anfangs nicht wusste, dass es das gibt und ich die einzige Person war, die an dieser Software arbeitete.
Jetzt, da die Basis der Software läuft, interessieren sich andere dafür und möchten einen Beitrag zur Software leisten. Es ist geplant, dass andere Personen an anderen Universitäten Ergänzungen zur Kernsoftware implementieren. (Ich habe Angst, sie könnten Bugs einführen). Außerdem wurde die Software ziemlich komplex und es wurde immer schwieriger, sie zu testen, und ich plane auch, weiter daran zu arbeiten.
Aus diesen beiden Gründen denke ich jetzt immer mehr über die Verwendung von CI nach. Da ich nie eine Ausbildung zum Softwareingenieur hatte und niemand in meiner Umgebung jemals von CI gehört hat (wir sind Wissenschaftler, keine Programmierer), fällt es mir schwer, mit meinem Projekt zu beginnen.
Ich habe ein paar Fragen, bei denen ich mich beraten lassen möchte:
Zunächst eine kurze Erklärung der Funktionsweise der Software:
Die Software wird von einer XML-Datei gesteuert, die alle erforderlichen Einstellungen enthält. Sie starten die Software, indem Sie einfach den Pfad zur XML-Datei als Eingabeargument übergeben. Anschließend wird sie ausgeführt und erstellt einige Dateien mit den Ergebnissen. Ein einzelner Lauf kann ~ 30 Sekunden dauern.
Es ist eine wissenschaftliche Software. Fast alle Funktionen haben mehrere Eingabeparameter, deren Typen meist sehr komplexe Klassen sind. Ich habe mehrere TXT-Dateien mit großen Katalogen, die zum Erstellen von Instanzen dieser Klassen verwendet werden.
Kommen wir nun zu meinen Fragen:
Unit-Tests, Integrationstests, End-to-End-Tests? : Meine Software besteht jetzt aus 30.000 Codezeilen mit Hunderten von Funktionen und ~ 80 Klassen. Es kommt mir irgendwie komisch vor, Unit-Tests für Hunderte von Funktionen zu schreiben, die bereits implementiert sind. Also habe ich darüber nachgedacht, einfach ein paar Testfälle zu erstellen. Bereiten Sie 10-20 verschiedene XML-Dateien vor und lassen Sie die Software laufen. Ich denke, das nennt man Ende-zu-Ende-Tests? Ich habe oft gelesen, dass Sie dies nicht tun sollten, aber vielleicht ist es für den Anfang in Ordnung, wenn Sie bereits eine funktionierende Software haben? Oder ist es einfach eine blöde Idee, CI zu einer bereits funktionierenden Software hinzuzufügen?
Wie schreibt man Unit-Tests, wenn die Funktionsparameter schwer zu erstellen sind? Angenommen, ich habe eine Funktion
double fun(vector<Class_A> a, vector<Class_B>)
und müsste normalerweise zuerst mehrere Textdateien einlesen, um Objekte vom TypClass_A
und zu erstellenClass_B
. Ich dachte darüber nach, einige Dummy-Funktionen zu erstellen,Class_A create_dummy_object()
ohne die Textdateien einzulesen. Ich dachte auch darüber nach, eine Art Serialisierung zu implementieren . (Ich plane nicht, die Erstellung der Klassenobjekte zu testen, da sie nur von mehreren Textdateien abhängen.)Wie schreibe ich Tests, wenn die Ergebnisse sehr unterschiedlich sind? Meine Software verwendet große Monte-Carlo-Simulationen und arbeitet iterativ. Normalerweise haben Sie ~ 1000 Iterationen und bei jeder Iteration erstellen Sie ~ 500-20.000 Instanzen von Objekten, die auf Monte-Carlo-Simulationen basieren. Wenn nur ein Ergebnis einer Iteration ein bisschen anders ist, sind die gesamten anstehenden Iterationen völlig anders. Wie gehen Sie mit dieser Situation um? Ich denke, das ist ein großer Punkt gegen End-to-End-Tests, da das Endergebnis sehr variabel ist?
Alle anderen Ratschläge von CI werden sehr geschätzt.