Wie die Server-Testlaufzeit von 13 auf 2 Minuten gesunken ist! ⚡

Hallo zusammen, und vor allem hallo an die @contributors für diesen etwas technischeren Post als gewöhnlich!

Ihr werdet es nicht glauben, ich habe es geschafft, die Ausführungszeit der Servertests um 80% zu reduzieren, also 5 Mal schneller als vorher… :sweat_smile:

Schluss mit den 13 MINUTEN Wartezeit :grimacing:

Ich hatte schon lange den Verdacht, dass da etwas nicht stimmt, aber ich habe es schließlich zufällig herausgefunden.

Im Grunde wird zwischen jedem Test eine Funktion beforeEach ausgeführt, die die Datenbank leert und dann wieder füllt.

Das ist normal, denn zwischen jedem Test möchte man, dass die Datenbank vollständig leer ist, damit die Tests unabhängig voneinander sind.

Dieses beforeEach wird 1.800 Mal ausgeführt, da wir 1.800 Tests in Gladys haben…

Jede Optimierung dieser Funktion bringt uns also eine 1.800-fache Optimierung…

Als ich in den Code dieser beiden Funktionen « cleanDb » und « seedDb » eintauchte, stieß ich auf Folgendes:

Ich war ziemlich überrascht, dass es eine Funktion « callLater » gibt, die tatsächlich eine 10ms-Pause zwischen jedem Clean/Befüllen jedes Seeds hinzufügt :thinking:

Da wir 16 Tabellen während der Tests leeren/füllen, gibt es 16 * 10 ms * 2 = 320 ms Totzeit, zwischen jedem Test !! :melting_face:

Bei 1.800 Tests macht das 1.800 * 320 = 576 Sekunden = 9,6 Minuten!

Jetzt fange ich an, richtig zu schwitzen, all diese verlorene Zeit… ^^

Ich versuche, den Code durch Folgendes zu ersetzen:

Eine optimiertere Version ohne Wartezeit.

Und das Ergebnis ist eindeutig:

Es gibt noch viel zu tun

Die Ausführungszeit der Tests wurde also deutlich reduziert, aber es gibt noch einen großen Block, der reduziert werden muss: die Installationszeit der Abhängigkeiten im CI, die ein sehr großer Teil ist:

Trotz des npm-Caches dauert die Installation der Abhängigkeiten fast 11 Minuten, was viel zu lange ist.

Bestimmte Pakete werden bei jeder Installation kompiliert und brauchen eine Ewigkeit, um kompiliert zu werden, insbesondere open-zwave-shared (das bald entfernt wird), und node-webcrypto-ossl, das ebenfalls entfernt wird, wenn wir auf Node.js 16 umsteigen, da diese Bibliothek jetzt in Node.js integriert ist.

Ich kann es kaum erwarten!

@Romuald_Pochet Ich habe mir erlaubt, deinen PR auf ZwaveJS2mqtt zu rebase, damit deine Entwicklung schneller vorankommt :slight_smile: Denk daran, lokal zu pullen, und sag mir, ob du den Unterschied siehst!

:+1:
Ich habe nicht alles verstanden, aber herzlichen Glückwunsch und vielen Dank für die ganze Arbeit.