2012. április 17., kedd

esti mese: kicsi mock és a memory leakek

Hol volt, hol nem volt...
Az oVirt engine-ben egészen félelmetes mennyiségű statikus kódunk van, statikus változókkal. Ez önmagában még nem lenne baj, persze egy tipikus Util osztály csak statikus metódusokból áll, ilyet kb mindenki csinál. A gubanc talán ott kezdődött, hogy IoC helyett is statikus metódusokat használunk. Pl ha szükséged van egy Dao objektumra, akkor így kéred el: DbFacade.getKakukkDao(), ami egy statikus metódus. Na most mi van akkor, amikor egy olyan kódot tesztelnél, ami ilyen módon szeretne egy DAO-t használni?
Mondjuk egy dummy DAO-t gyorsan összemockolsz easymock-kal, de hogyan tömöd bele abba a statikus metódusba, amit a tesztelendő kódod meg fog hívni? A válasz általában az az lenne, hogy sehogy, dögöljön meg aki írta.
No itt jön a képbe a PowerMock, ami arra az elvetemültségre képes, hogy a classloadered buherációjával lecseréli a statikus metódust. Ez a dolog tette lehetővé azt, hogy az egyébként tesztelhetetlen kódot módosítás nélkül mégiscsak tesztelni tudjuk unit-tesztekkel. Majdnem mindenki boldog volt, amíg N-nél több tesztig el nem jutottunk. Azt hiszem én vettem észre elsőként, mert én buheráltam a sonar-t az oVirt-en. Erről jut eszembe hogy kitettem egy openshift-es gépre a fél évig gyüjtött kódanalízist, ha kedved szottyan olvasgatni elalvás elött. Csak aztán ne nekem panaszkodj, ha rosszat álmodsz :-)
Szóval a Powermock-nak van egy nagyon rossz szokása: rettenetes memory leak-eket csinál a permgen space-ben. Párat talán kijavítottak a srácok, pár új meg talán jött útközben, de akármire is próbáltam felűberelni a Powermock + Mockito párost, mindi maradt egy szép nagy leak. Én viszont akkor is le akartam futtatni a teszteket, szóval a következőket heggesztettem rá a maven buildre:

  • A surefire plugin startolja el a teszteket úgy, hogy mindhez külön VM-et futtasson (forkmode: always)
  • A forkolt VM extra paraméterek között kapjon 2.5 GB memóriát, ebből 2 GB a permgen - na ez agyhalott, de kevesebbel nem futott le

Nos, ez idáig gondolom egy kicsit zavaró volt, de még koránt sincs vége :-D Pár munkatárs arról kezdett panaszkodni, hogy a fejlesztőkörnyezetükben nem megy le a teszt, pedig junkins-ban igen, illetve fordítva, ráadásul hol sikerül, hol nem. Totál összevisszaság :) Nos erről az derült ki, hogy a úgy hozzászokott a drága nép a forkmode=always beállításhoz, hogy egyes tesztek összemocskolták más tesztek futás környezetét, ja és persze a surefire alapbeállítása az, hogy a ahogy felszedte a filerendszerről a teszteket, abban a sorrendben fogja végrehajtani. Ez kicsit hülyébb a random sorrendnél :-)

A jelenlegi helyzet az, hogy az embereknek lerúgta az agya a láncot és visszadobják a teszt patcheket, ha powermock van benne. Szopódás, egyre nehezebb patcheket átverni a bürokrácián.

A tanulság: írj tesztelhető kódot, csínján a statikus dolgokkal.

No... itt a vége, fuss el véle. Aludjatok jól, álmodjatok EJB-ket. (vagy mi a f.szt)