Automatyczne randomowe inicjalizowanie pól objektu JAVA w junit test

Automatyczne randomowe inicjalizowanie pól objektu JAVA w junit test
dwroblew
  • Rejestracja:około 7 lat
  • Ostatnio:około rok
  • Lokalizacja:Frankfurt am Main (Germany)
  • Postów:50
0

Hej wszystkim,

zna może ktoś z was bibliotekę, która automatycznie zainicjalizuje randomowymi wartościami pola obiektów uwzględniajac przy tym adnotacje takie jak (notNull , size, pattern itp. itd.) . Problem polega na tym, że mamy w projekcie napisane convertery, które DTO conwertuja do DOMAIN i na odwrót. Jak sie można domyśleć jest ich sporo, a zamierzamy je przetestować testami jednostkowymi. Inicjalizacja ręczna była by czasochłonna i nie efektywna, ponieważ gdyby ktoś zmienił konwerter bądź objekt musiałby dopasować również testy. Poszukuję biblioteki która w poprawny sposób zainicjalizuje wszystkie wymagane pola mojego DTO przy uruchomieniu testu.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Ale jaki to by miało sens? Przecież potem w teście trzeba jeszcze sprawdzić asercją czy dobrze się przemapowało. Jak niby chcesz to zrobić auto-magicznie? Moja rada: zróbcie w tych DTO jakieś Buildery które ustawiają defaultowe wartości, albo zróbcie sobie odpowiednie Factory. Kombinowanie z jakimiś magicznymi toolami skończy się źle.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
jarekr000000
Jak w kontrakcie firma ma wpisane 95% pokrycia testami to asercje tylko przeszkadzają :-) ( k...a, byłem dwa razy w takim kodzie).
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
1

Nie jest to odpowiedź na twój problem. Ale jak masz takie DTO i mappery, takie że je się da z automatu (potencjalnie) testować to znaczy, że możesz te DTO wywalić. Jeszcze bardziej niż w testach to wam to przeszkadza w kodzie. I do tego macie dużo głupich błędów -> typu nie zapisują się dane w bazie.

Dto

I jest fajna biblioteka, nazywa się fabricator, ale nic nie wypełnia z automatu, zwłaszcza ma gdzieś adnotacje. Po prostu losuje dane.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 2 godziny
  • Postów:1875
0

Jeszcze jest jFairy, ale osobiście nie lubię testów z randomowymi wartościami. Chcesz przetestować corner case, to napisz na to jawnie test.


”Engineering is easy. People are hard.” Bill Coughran
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

Pytanie czy warto to testowac jednostkowo, czy to jednak nie powinno byc pokryte integracyjnie? No i Jarek ma racje, nie ma sensu stosowac DTOsów jak się mapuja 1:1 do domenowego.
A poza tym sądze że settery powinny być zniszczone


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Zobacz pozostałe 8 komentarzy
danek
settery i gettery sprawiają, że oszukujesz na enkapsulacji trochę ;)
Charles_Ray
@danek: jak mam strukturę danych albo DTO to co tam bys chciał enkapsulowac?
TD
Jeżeli chodzi o struktury danych to akurat jest co tam enkapsulować. Na tej zasadzie działają przecież ADT.
TD
A jeżeli chodzi o DTO to nie wiem co chciałbyś tam modyfikować. :)
danek
dlatego zamiast tego masz konstruktor i publiczne finalne pola ;)
dwroblew
  • Rejestracja:około 7 lat
  • Ostatnio:około rok
  • Lokalizacja:Frankfurt am Main (Germany)
  • Postów:50
0

Bardzo mało mamy converterów które mapują 1:1 może 10 %, i wszystkie dotychczas były przetestowane testami integracyjnymi. Problem polega na tym, że przy deployowaniu testy wykonywały się ponad 15 minut dlatego też zdecydowaliśmy testy integracyjne pomału zastępować junit testami. Robiąc to doszedłem do package "converter" i zastanawiam się co z tym robić :). Na dziś już wystarczy , ale w poniedziałek myślę że, część pól ustawię za pomocą któregoś z powyższych bibliotek, a resztę ustawię ręcznie.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
1
Charles_Ray napisał(a):

Jeszcze jest jFairy, ale osobiście nie lubię testów z randomowymi wartościami. Chcesz przetestować corner case, to napisz na to jawnie test.

Testy z randomowymi wartościami to jedna z podstaw property based testing. Technika ma na celu wykrywanie przypadków, o których programista nie pomyśli nawet.
W javie używam tego głównie przy poważniejszych biznesowych ficzurach, gdzie obrabiam jakieś serie danych. Nieraz już uratowało sytuację.( Głównie przy change requestach.)


jeden i pół terabajta powinno wystarczyć każdemu
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

przy deployowaniu testy wykonywały się ponad 15 minut dlatego też zdecydowaliśmy testy integracyjne pomału zastępować junit testami

Brak mi słów :D Przecież od tego jest CI żeby mielić te testy. Czekam na kolejny krok testy za długo idą, więc ich nie puszczamy.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
dwroblew
Zmierzam do tego że większość można przetestować junit testami gdzie integracyjne testy nie mają sensu jak na przykład zmiana statusy albo wartości. Niestety w takich przypadkach czasami zdarzyło się że, ktoś ładuje cały kontekst Springa
dwroblew
  • Rejestracja:około 7 lat
  • Ostatnio:około rok
  • Lokalizacja:Frankfurt am Main (Germany)
  • Postów:50
0
Shalom napisał(a):

przy deployowaniu testy wykonywały się ponad 15 minut dlatego też zdecydowaliśmy testy integracyjne pomału zastępować junit testami

Brak mi słów :D Przecież od tego jest CI żeby mielić te testy. Czekam na kolejny krok testy za długo idą, więc ich nie puszczamy.

Był pomysł żeby ustawić tak żeby, wykonywały się tylko testy jednostkowe :)

edytowany 1x, ostatnio: dwroblew
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

@dwroblew: brawo, czyli klasyczna mockosturbacja, zamiast testowac czy cos działa, testujesz Mockito...


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
edytowany 1x, ostatnio: scibi92
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Zmierzam do tego że większość można przetestować junit testami gdzie integracyjne testy nie mają sensu jak na przykład zmiana statusy albo wartości. Niestety w takich przypadkach czasami zdarzyło się że, ktoś ładuje cały kontekst Springa

I dzięki temu masz faktyczny test całej funkcji systemu i masz pewność że ona działa (przynajmniej o ile powiązane serwisy działają).
Taki unit test to co najwyżej sanity check -> jak sie wywali to znaczy ze coś jest nie tak. Ale jak działa, to w sumie nie wiadomo czy ta funkcja działa czy nie, bo sprawdziłeś tylko malutki jej kawałek.
Mógłbyś skasować endpoint który do tej funkcji kieruje, popsuć access-control/auth, wyrzucić połowę kodu a test nadal będzie zielony. Więc jaka wartość na taki test?

Zalecam zresztą zrobić takie ćwiczenie, skoro twierdzisz że możesz wymienić testy integracyjne na unity -> zobacz ile kodu dotyczącego danej funkcji systemu możesz usunąć / popsuć zanim unit test zrobi się czerwony. Obawiam sie że odpowiedź będzie brzmiała "prawie wszystko". Pytanie więc jaka jest wartość tego testu?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
dwroblew
  • Rejestracja:około 7 lat
  • Ostatnio:około rok
  • Lokalizacja:Frankfurt am Main (Germany)
  • Postów:50
0

Ma sens to co piszecie i zgadzam się w stu procentach, ale przy teście 2+2=4 ładować kontekst springa też jest bezsensowne prawda? a takich kwiatków w kodzie trochę jest. Kolejną temat to proporcja 450 testów integracyjnych do 70 junit, według wielu źródeł powinno być na odwrót. Inna sprawą jest to że, ja jestem tylko zwykłym juniorem który wykonuje polecenia moich niemieckich "doświadczonych" kolegów :)

Zobacz pozostały 1 komentarz
dwroblew
nie pracowałem nigdy w Polsce , ale zdążyłem zauważyć różnicę poziomów :)
S9
na plus czy minus?
dwroblew
na plus. Moja firma zatrudnia paru programistów zdalnie z polski jako ekspertów/ konsultantów i się ich bardzo chwali , ale tu nie ma takiego "cyrku" też w IT jak jest w pl
S9
xD A jaki to cyrk jest w polskim IT którego nie ma w germańskim?
dwroblew
Tak mi się napisało :) ale zauważyłem że wszyscy chcą do IT , każdy blog ,youtube , ekspert na linkedln . W niemczech to nikt nie chce pracować jako programista bo dużo trzeba się uczyć, informatyka ciężki kierunek a kasa względna.
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Kolejną temat to proporcja 450 testów integracyjnych do 70 junit, według wielu źródeł powinno być na odwrót

Te źródła to jakiś 50-letni cargo-cult ;) Unity mają sens tylko do testowania jakiejś skomplikowanej logiki domenowej, kiedy koniecznie chcesz to testować w separacji. Moim zdaniem proporcja którą macie jest bardzo dobra.

ja jestem tylko zwykłym juniorem który wykonuje polecenia moich niemieckich "doświadczonych" kolegów

W takim razie zalecam rozglądać się za nową pracą, z 2 powodów:

  • uczą cię tam głupot
  • niedługo trzeba będzie to utrzymywać a wtedy ten brak testów będzie mocno boleć :)

przy teście 2+2=4

A macie taką funkcje w systemie? Czy może jednak funkcja to:

  • user musi być zalogowany
  • user musi mieć odpowiednią rolę
  • user musi wprowadzić 2 wartości które są liczbami w odpowiednim zakresie
  • system musi być w stanie XYZ
  • ...
  • system powinien zwrócić 4

Z tych wszystkich punktów chcesz sprawdzić tylko ten ostatni. Można, fakt, tylko taki test nie wykryje kiedy coś z wcześniejszych punktów przestanie działać...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
Zobacz pozostały 1 komentarz
dwroblew
moje podejście było, sprawdzić każdy ten podpunkt kilkoma testami jednostkowymi mockując zależności, a na koniec dwa trzy testy integracyjne sprawdzające całe flow
Shalom
No dobra tylko co ci te unity dadzą w takim wypadku? Znów: zobacz ile kodu możesz usunąć zanim taki unit zrobi się czerwony i zadaj sobie pytanie jaka jest wartość tego testu ;)
dwroblew
na chłopski rozum będzie system lepiej pokryty, ale nie przyszedłem tu się mądrzyć tylko uczyć wiec myślę że masz rację. Podsumowując jak powinno się testować aplikację sprinogową ?
S9
1)Uruchamiasz aplikacje 2)Wysyłasz request 3)Sprawdzasz response, base danych itp
Shalom
Powinno testować się funkcje systemu :)
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

Ma sens to co piszecie i zgadzam się w stu procentach, ale przy teście 2+2=4 ładować kontekst springa też jest bezsensowne prawda

Masz częściowo rację. Częściowo, bo skoro wywołanie 2+2 jest w ramach testu integracyjnego to po co pisac osobny test?
Z drugiej strony, może być jakas bardziej złozona logika. Załóżmy że mamy kalkulator kosztów na podstawie liczby godzin plus np. typu abonamentu. Wtedy jest sens testów jednostkowych, bo można łatwo wprowadzic duzo danych testowych, a sama implementacja jest bardzo niezalezna od baz danych itp

Kolejną temat to proporcja 450 testów integracyjnych do 70 junit, według wielu źródeł powinno być na odwrót.

Kiedys powszechne były goto i pewnie wiele ksiązek je pochwalało :)


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
3

niemieckich "doświadczonych" kolegów

Trzeba było tak od razu.

W każdym razie:
nie tacy doswiadczeni, skoro nie wpadli jeszcze, że trzeba napisać generator takich testów.
Najlepiej jako plugin do eclipse - to przecież oczywiste. Może rzuć pomysł.

wallenrode budowlaniec


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
S9
Nie zawiodłem się ;]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.