Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Wie wir unsere Test-Pipeline stabilisierten

Wie wir unsere Test-Pipeline stabilisierten

Je größer ein Projekt wird, desto mehr Testfälle gibt es, und desto länger dauert meist auch die Ausführung. Instabile Tests und abbrechende Builds werden dann zu einem großen Ärgernis, das für Frustration sorgt.

Im Open-Source-Projekt Keycloak sind wir das Problem in in 2023 neu angegangen: Statt abbrechender Builds gibt es bei uns nun kontrollierte Wiederholungen, Protokollierung und Überwachung, und das ganze automatisiert über Maven und GitHub-APIs. Builds brechen dadurch seltener ab, und instabile Tests können besser identifiziert und angegangen werden.

Der Vortrag stellt unsere Lösung im Detail vor und berichtet über die Erfahrungen damit. Alle Teile sind öffentlich auf GitHub verfügbar.

Alexander Schwartz

December 14, 2023
Tweet

More Decks by Alexander Schwartz

Other Decks in Programming

Transcript

  1. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 2 Motivation Dieser Vortrag ist für dich, … … wenn mindestes eines der folgenden Dinge zutrifft: • Wenn du an GitHub APIs und Erweiterungen interessiert bist. • Tests mit Maven ausführst. • Hoffnung für deine eigene Pipeline benötigst. • Open Source DIY magst. Er ist eher nicht für dich: • Wenn du eine schlüsselfertige Lösung suchst.
  2. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 3 Wie wir unsere Testpipeline stabilisierten Motivation 1 Umsetzung für Keycloak 2 Einsatz in der Praxis 3 Zusammenfassung 4
  3. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 4 Wie wir unsere Testpipeline stabilisierten Motivation 1 Umsetzung für Keycloak 2 Einsatz in der Praxis 3 Zusammenfassung 4
  4. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 5 Ein einziger Testfall hält die ganze Pipeline auf? Motivation https://www.testautomatisierung.org/flaky-tests-und-der-umgang-mit-diesen-1/
  5. • Concurrency-Tests • UI-Tests • Komplexe Infrastruktur gerade bei E2E-Tests

    • Externe Ressourcen • Aufräumen und Re-Initialisieren von Ressourcen CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 6 Komplexität macht Testfälle instabil Motivation
  6. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 7 Handlungsmöglichkeiten für instabile Testfälle Motivation Aktion Bewertung Manuell neu starten * Mühsam und langfristig teuer. * Erfordert auf GitHub Berechtigung mit Schreibzugriff auf das Repository.
  7. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 8 Handlungsmöglichkeiten für instabile Testfälle Motivation Aktion Bewertung Manuell neu starten * Mühsam und langfristig teuer. Sofort beheben Kurz- und langfristig teuer, stressig und schwierig. * Erfordert auf GitHub Berechtigung mit Schreibzugriff auf das Repository.
  8. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 9 Handlungsmöglichkeiten für instabile Testfälle Motivation Aktion Bewertung Manuell neu starten * Mühsam und langfristig teuer. Sofort beheben Kurz- und langfristig teuer, stressig und schwierig. Automatisch wiederholen, Informationen sammeln und Statistiken erstellen Initialer Invest, ruhiges und fokussiertes Arbeiten an den instabilen Tests. Disziplin notwendig, sich (trotzdem) drum zu kümmern. * Erfordert auf GitHub Berechtigung mit Schreibzugriff auf das Repository.
  9. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 10 Wie testet Keycloak? Motivation • Ca. 70 Checks in GitHub Workflows • Conditionals abhängig von Code-Änderungen • 10 min Unit-Tests • 200 min Base-Integrationstests • 175 min Quarkus-Integrationstests • 300 min verschiedene Integrations-Szenarien (verschiedene Browser, Betriebssysteme, Datenbanken, Storage-Backends)
  10. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 11 Wie wir unsere Testpipeline stabilisierten Motivation 1 Umsetzung für Keycloak 2 Einsatz in der Praxis 3 Zusammenfassung 4
  11. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 12 Umsetzung für Keycloak Maven Surefire to the rescue mvn test -Dsurefire.rerunFailingTestsCount=2 ... https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html
  12. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 13 Umsetzung für Keycloak Maven Surefire XML report <testcase name=".." classname=".." time="0.1"> <flakyFailure message="exception message" type="assertion exception"> <stackTrace>flaky failure stack trace</stackTrace> <system-out> flaky failure System.out log message </system-out> </flakyFailure> <system-out> success </system-out> </testcase> https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html (ebenso: „flakyError“)
  13. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 14 Umsetzung für Keycloak Upload Flaky Tests Action (Pull Requests und Nightly Runs) for dir in $(find -type d -name 'surefire-reports*'); do for i in $(grep -l -E '<flakyFailure|<flakyError' $dir/TEST-*.xml); do ... https://github.com/keycloak/keycloak/blob/main/.github/actions/upload-flaky-tests/action.yml - uses: actions/upload-artifact@v3 if: ${{ steps.flaky-tests.outputs.flakes }} with: name: flaky-tests-${{ github.job }}-${{ join(matrix.*, '-') }} path: ${{ steps.flaky-tests.outputs.flakes }} if-no-files-found: error
  14. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 15 Umsetzung für Keycloak Einfacher Fall: Nightly Run 1. Branch prüfen (main, latest release) 2. Artefakte mit „flaky-tests-“ suchen, herunterladen und parsen 3. GitHub-Issue zum Test existiert schon: • Kommentar hinzufügen 4. GitHub-Issue existiert noch nicht: • Issue erstellen https://github.com/keycloak/keycloak-github-bot/blob/main/src/main/java/org/keycloak/gh/bot/ReportFlakyTests.java
  15. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 16 Umsetzung für Keycloak Einfacher Fall: Nightly Run
  16. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 17 Umsetzung für Keycloak Etwas komplizierter: Pull requests 1. Branch prüfen (main, latest release) 2. Artefakte mit „flaky-tests-“ suchen, herunterladen und parsen 3. Label „flaky-test“ dem Pull Request hinzufügen 4. GitHub-Issue zum Test existiert schon: • Kommentar dem Issue hinzufügen 5. GitHub-Issue existiert noch nicht: • Kommentar dem Pull-Request hinzufügen, inklusive 1-Click-Issue-Erstellung (Ausführung Erfordert auf GitHub Berechtigung mit Schreibzugriff auf das Repository) https://github.com/keycloak/keycloak-github-bot/blob/main/src/main/java/org/keycloak/gh/bot/ReportFlakyTests.java
  17. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 18 Umsetzung für Keycloak Kommentar für unbekannten instabilen Test im Pull Request
  18. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 19 Umsetzung für Keycloak Bekannter instabiler Test als Kommentar im GitHub Issue
  19. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 20 Wie wir unsere Testpipeline stabilisierten Motivation 1 Umsetzung für Keycloak 2 Einsatz in der Praxis 3 Zusammenfassung 4
  20. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 21 Einsatz in der Praxis Handhabung • Suchen aller GitHub Issues für flaky Tests • Erstellungdatum, letzte Aktivität, wieviel Aktivität • Guter Erfolg zu Beginn – es braucht eine*n Aufpasser*in • Schwieriger Bodensatz von komplizierten instabilen Tests bleibt • Was noch nicht wiederholt wird: Ursachen außerhalb von JUnit Integrationstests (Container-Download-Fehler, Node-Download-Fehler, …)
  21. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 22 Wie wir unsere Testpipeline stabilisierten Motivation 1 Umsetzung für Keycloak 2 Werkzeuge 3 Zusammenfassung 4
  22. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 23 Ein einziger Testfall hält die ganze Pipeline auf? Zusammenfassung https://www.testautomatisierung.org/flaky-tests-und-der-umgang-mit-diesen-1/
  23. CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere

    Testpipeline stabilisierten | Alexander Schwartz 24 Ein einziger Testfall hält die ganze Pipeline auf? Zusammenfassung https://www.testautomatisierung.org/flaky-tests-und-der-umgang-mit-diesen-1/ ✅ ❌
  24. Keycloak Upload Action https://github.com/keycloak/keycloak/tree/main/.github/actions/upload-flaky-tests Keycloak GitHub Bot https://github.com/keycloak/keycloak-github-bot Quarkus GitHub

    App https://docs.quarkiverse.io/quarkus-github-app/dev/ Maven Surefire Plugin – Rerun Tests https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html Links CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 25 @ahus1de @[email protected]
  25. Kontakt Alexander Schwartz Principal Software Engineer [email protected] https://www.ahus1.de @ahus1de @[email protected]

    CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 26