Slide 1

Slide 1 text

Wie wir unsere Testpipeline stabilisierten Alexander Schwartz, Principal Software Engineer @ Red Hat IT Tage Frankfurt | 2023-12-14

Slide 2

Slide 2 text

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.

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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/

Slide 6

Slide 6 text

• 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

Slide 7

Slide 7 text

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.

Slide 8

Slide 8 text

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.

Slide 9

Slide 9 text

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.

Slide 10

Slide 10 text

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)

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 13 Umsetzung für Keycloak Maven Surefire XML report flaky failure stack trace flaky failure System.out log message success https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html (ebenso: „flakyError“)

Slide 14

Slide 14 text

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 '

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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, …)

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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/

Slide 24

Slide 24 text

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/ ✅ ❌

Slide 25

Slide 25 text

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 @ahus1@fosstodon.org

Slide 26

Slide 26 text

Kontakt Alexander Schwartz Principal Software Engineer alexander.schwartz@gmx.net https://www.ahus1.de @ahus1de @ahus1@fosstodon.org CC BY-NC-SA 4.0 | Dezember 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 26