Czy wiesz, w jakiej kolejności są odpalane Twoje testy? Ja nie wiem. Bo za każdym razem są uruchamiane w losowej kolejności. Takie działanie ma zapobiegać zależnościom między testami, ponieważ powinny onne działać niezależnie. Czasem nawet współbieżnie. Jeśli chcesz nadać wartości zmiennym, albo zainicjalizować klasę, powinno się to odbywać w metodach z adnotacjami @Before i @BeforeClass, a w JUnit 5 @BeforeEach i @BeforeAll. Taki układ zapewni Ci identyczny stan początkowy każdego testu i zapobiegnie dziwnym błędom.

Jeśli masz coś do “posprzątania” po teście, użyj metody z adnotacją @After / @AfterEach. Jeśli sprzątanie dotyczy całej klasy testowej, należy użyć @AfterClass / @AfterAll.

Sprzątanie jest szczególnie ważne w testach integracyjnych. Kiedyś boleśnie się o tym przekonałam. Pewnego dnia podczas uruchamiania testów lokalnie, zaczęłam dostawać dziwne błędy. Jeden test dotyczący kodu zniżkowego w koszyku zakupowym przestał przechodzić i pokazywał niespodziewane wyniki. Z każdym uruchomieniem było coraz gorzej, bo oczekiwana cena produktu w koszyku coraz bardziej różniła się od tej prawdziwej. Zrobiłam najlepszą rzecz, którą można zrobić w tej sytuacji, czyli poszłam na kawę 😉

Kiedy wróciłam, zauważyłam coś, co wcześniej nie było oczywiste. Test sprzątał sam po sobie. Nie było metody z adnotacją @AfterEach, tylko na samym końcu testu po asercjach kod zniżkowy był usuwany z koszyka. Wszystko stało się jasne, kiedy asercja w teście się nie zgadzała, dalsze polecenia nie były wykonywane. W ten sposób z każdym uruchomieniem testu do mojego koszyka trafiały kolejne kody zniżkowe, coraz bardziej obniżając cenę. Kiedy wydzieliłam kod sprzątający to właściwych metod, wszystko wróciło do normy.

dwa morały z tej historii. Po pierwsze, należy używać metod pomocniczych, żeby ustawiać i usuwać kontekst, w którym działają testy. Po drugie, jeśli masz dziwne błędy i zakopujesz się w nich, zrób sobie przerwę i pomyśl o czymś innym. Twój mózg w międzyczasie odnajdzie rozwiązanie 😉