@jarekr000000 O widzisz, piękna historia. Mógłbyś ją dodawać za każdym razem, gdy narzekasz na springa albo mocki, to wtedy ludzie wiedzieliby, w jakich systemach tkwisz od lat i że nie cały świat tak wygląda.
Tylko już gadamy o inżynierii oprogramowania, to trzeba myśleć szerzej. Piszesz Testowanie CI z prawdziwym oraclem ( u tego klienta) wiązałoby się z istotnie większym kosztem, przy niewielkim wzroście jakości testów. Olewam ten punkt - raczej na zawsze (zwłaszcza że moją misją na oracle jest `DROP DATABASE`). — dla Ciebie świat kręci się wokół oracla (którego sobie wygodnie emulujesz przez H2), ale wszystko dookoła poszło trochę naprzód, są inne bazy, inne technologie, inne podejścia. Z Twojego miejsca łatwo jest narzekać, ale większość świata jest teraz zupełnie gdzie indziej. A gadanie o misji DROP DATABASE jest dość ciekawe — jak ten oracle tak Ci przeszkadza, to zmień stos (albo pracę), spora część świata nie używa i pewnie nigdy nie używała tej bazy.
Krytykujesz mocki bo Cię kopnęły, bo nie testują "prawdziwej" interakcji z bazą danych i gdy wdrożyłeś, to się wysypało. No spoko, ale to nie jest problem z mockami, tylko z tym, że Ty nie masz porządnych testów na stosie produkcyjnym. Jak opierasz testowanie swojej aplikacji tylko o mocki, to oczywistym jest, że się to wysypie. Ale jak mockujesz sensownie (a nie assertWasCalled) i potem masz osobno zestaw testów bijących po prawdziwej bazie, to da się błędy wyłapać, nie trzeba stawiać żadnych dodatkowych klocków w kontenerach na localhoscie, na produkcję można pchać w piątek o 17, a i testy działają szybko. Tylko trzeba zmienić narrację z "mocki to zuo" i "robiłem takie rzeczy 20 lat temu, nie działało" na coś w stylu "jak nie mogę testować na prawdziwych komponentach produkcyjnych, to muszę znaleźć jakiś zamiennik do przetestowania każdego elementu systemu, bo na mockach nie testuję fragmentu interakcji DAL z jakąś bazą danych".
Testowanie z bazą danych, nie taka jak trzeba, na nie takim os, itd. daje mi znaczny wzrost jakości testów przy widocznym, ale nie tragicznym, wzroście kosztów — znowu, masz H2, które na Twoje potrzeby wystarczy. Ponawiam pytanie — co mam zrobić, jak moim produkcyjnym klockiem jest coś, czego nie da się emulować? Może to być baza danych, kolejka, szyna, API, system plików, mechaniczne ramię wpięte przez USB, nie ma to większego znaczenia. Jak testować, żeby nie strzelić sobie w kolano (bo potem będzie krzyk "mocki to zuo"), ale żeby też mieć sensowne testy i nie bać się pchać w piątek na produkcję, gdy potencjalny błąd będzie wymagał natychmiastowej reakcji (a nie w poniedziałek rano).
Reszta komentarzy raczej już poza głównym nurtem tematu.
jarekr000000 napisał(a):
Cała reszta aplikacji w tej fimie ma całkiem spoko SLA, jest środowisko przedprodukcyjne testowane głównie ręcznie (choć tam też działa Simulator).
Jeśli nie zadziała wydruk sald - to ludzie nie dostaną listów 2go tylko 7go w danym miesiącu - tragedii nie ma.
Punkty żegnaj się nie naliczą dziś - naliczą się jutro. Coś dwa razy zaksięgujemy - no to wyjdzie problem w jakimś bilansie w ciągu 48 godzin - zrobimy korektę.
Ogólnie luksusy.
Jasne, nie każda aplikacja musi działać niezawodnie. Są aplikacje online, są aplikacje offline, niektóre procesy muszą iść natychmiast, inne można ponowić kilka dni później, a raportowanie to pod koniec miesiąca. Tylko co to zmienia, jeżeli Ty stosujesz narrację "mocki to zuo, wszędzie, w każdej aplikacji"? To, że Ty masz ten komfort, że system nie wrzuci krytyka w piątek o 17 nie oznacza jeszcze, że inni taki komfort mają.
Tu jeszcze dodam może, że ogólnie testy to dość absurdalna metoda weryfikacji (słaba). Czasem jak pisze test to mam taki obrazek "matematyków" przed oczami: twierdzenie działa dla 1, działa dla 2 i działa dla 100 - czyli zachodzi dla każdego n.
Nie, nie jest absurdalna. Absurdalne byłoby stosowanie metod matematycznych, to strasznie zwolniłoby rozwój oprogramowania i świata, a do większości oprogramowania wystarczy przetestowanie ścieżek krytycznych i jakiś property based testing. Można bawić się w theorem provers, dependent types, jakieś idriso-podobne języki czy coś na ML, ale od pewnego poziomu nie daje to wielkiego zysku, za to strasznie spowalnia proces rozwijania kodu.
Jednak testy są po prostu ekonomiczne. Jak widać ekonomia widoczna jest również w samych testach - trzeba rozważyć koszty i dopasować do aplikacji/ SLA / potencjalnych szkód.
Ekonomia jest ważna wszędzie, jeżeli chcesz w ten sposób uzasadniać brak testowania na produkcyjnym stosie, to oczywiście nie ma problemu, ale to znacząco zmienia narrację (co skrzętnie pomijasz). A postawienie stosu produkcyjnego na boku może być bardzo drogie, gdy pracujesz z oraclem na jakimś mainframie, ale jak pracujesz z serwerem webowym na flocie 400 maszyn, to postawienie jeszcze jednej na testy nie jest problemem.
Przeważnie jest tak, że dośc tanio da się całkiem dużo przetestować, ale w miarę zwiększania jakości testów ich koszt zaczyna nagle rosnąć nieliniowo.
Znowu jakieś "liczby z powietrza". Ile to jest "przeważnie" i "dość tanio"? A ten koszt rośnie nieliniowo względem czego?
