Fix flaky System Tests (for good?)
Wir haben seit langem und weiterhin SystemTests die "reproduzierbar" flaky sind. Beim Ausführen
while true; do TEST=test/system/dsb_meldung_system_test.rb PARALLEL_WORKERS=1 rake test; done
auf meinem System dauert es in der Regel keine fünf Minuten bis die erste Exception kommt (bzw. retry_flaky_actions
oder Minitest::Retry
getriggert wird).
Das nutzen von generellen retries (auf Test Ebene) hat geholfen, geht aber extrem zu Lasten der Testlaufzeit auf CI. Die Verbesserung durch retry_flaky_actions
war da super, man muss aber immer wieder aufpassen, dass man nicht falsche Teile wiederholt (z.B. zweimal auf "kommentieren" klicken führt zu zwei Kommentaren und anschließend fehlschlagenden Test oder so).
Trotzdem schlagen weiterhin immer mal Tests (nach dem retry_flaky_actions
und dreimal Gesamtretry) fehl.
Das grundlegende Problem ist, dass wir ein JS Frontend haben bei dem Capybara nicht sicher sein kann wann dieses vollständig geladen ist. Capybara hat zwar ein Timeout und wartet entsprechend darauf, ob ein Button durch CSS sichtbar wird, aber ob der JS klickhandler diesen Button dann auch schon aktiv gemacht hat erkennt Capybara nicht. Die einzige halbwegs sicher Lösung bisher war ein langes sleep nach jeder Aktion einzubauen, was die Testzeiten natürlich nochmal in die Höhe treibt.
Mit capybara-lockstep scheint es jetzt möglich zu sein genau das zu tun was wir brauchen: Mit der Auswertung/Aktion so lange zu warten, bis der Browser bzw. das JS fertig mit laden ist.