Wątek przeniesiony 2020-03-08 22:38 z Java przez Shalom.

Granice testów jednostkowych

Odpowiedz Nowy wątek
2020-03-06 14:04

Rejestracja: 4 tygodnie temu

Ostatnio: 2 tygodnie temu

0

Czy pisząc test dla danej metody z jakiegoś serwisu uderzając do testowej bazy danych to nadal test jednostkowy? Czy już integracyjny? Gdzie zaczynają są granice testów jednostkowych? Czy pisząc taki test powinno się mockować odpowiedź czy używać bazy danych?

Dobre pytanie, też się chętnie dowiem gdzie są te granice. :) - Michał Sikora 2020-03-06 14:18

Pozostało 580 znaków

2020-03-06 14:25

Rejestracja: 12 lat temu

Ostatnio: 2 minuty temu

3

Test jednostkowy odnosząc się do zależności kodu produkcyjnego używa mock-ów.
Jeśli test sięga po faktyczną bazę danych to albo jest to test integracyjny, albo ułomny test jednostkowy.

Problem leży tutaj:

Czy pisząc test dla danej metody z jakiegoś serwisu

Bo powinno być na odwrót, piszesz kod do testu.

Bez mock-ów nie da się napisać testu sprawdzającego obsługę błędów, bo sensowne doprowadzenie np bazy danych do raportowania błędu jest bardzo trudne.
Bez mock-ów testy są boleśnie powolne.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22, 2020-03-06 14:29
Odpowiedź jest taka sama jak na pytanie: ile czasu zajmowało uruchomienie tych testów? - MarekR22 2020-03-06 14:45
Jakby były na mock-ach, to trwało by to od 30sekund do 3minut jak testów jest bardzo dużo. - MarekR22 2020-03-06 14:52
U mnie jest prawie bardzo dużo i trwają 3 minut i 15 sekund :'( - qbns 2020-03-06 15:16
To był bait :< - qbns 2020-03-06 15:32

Pozostało 580 znaków

2020-03-06 14:25

Rejestracja: 4 lata temu

Ostatnio: 1 dzień temu

1

Wydaje mi się że o teście integracyjnym zaczynamy mówić gdy do odpalenia testu potrzebna jest jakaś baza w pamięci, jakiś mock np. do zewnętrznego serwisu, ewentualnie plik z danymi wyjściowymi. Pytanie czy jak zamiast H2 użyje implementacji repo w hashmapie to czy to integracja czy jednostka? Wydaje mi się że wyznaczanie takiej granicy jest zbędne w życiu ale jakbym miał przyjmować kryterium to zapewne byłby to czas uruchamiania testów.

Tak czy owak: olej ten podział bo to "zależy".

Pozostało 580 znaków

2020-03-06 14:35

Rejestracja: 1 rok temu

Ostatnio: 2 godziny temu

Lokalizacja: Silesia

10

Nie wiem jak teraz jest w Google, ale w książce "Testuj oprogramowanie jak Google. Metody automatyzacji" jest napisane że w Google w ogóle odeszli od terminów "testy jednostkowe, integracyjne i systemowe". Zamiast tego używają terminów "testy małe (szybkie), średnie i duże (wolne)" I to jest ihmo bardzo dobra definicja.
Z innych opinii słyszałem że jeśli sam zarządzasz bazą to to są testy jednostkowe, a jak baza jest systemem zewnętrznym to to są testy integracyjne.

Przy okazji spostrzeżenie, H2 in memory jest zwykle używana jako mock (stub?) prawdziwej bazy (np PostgreSQLa). Dlaczego nie uznawać tego za test jednostkowy?


postawienie H2 z większym schematem bazy danych nie jest wcale takie szybkie, więc czy nadal jest to test jednostkowy? - Inject 2020-03-06 14:43
I tu wchodzą mikroserwisy całe na biało :P - KamilAdam 2020-03-06 14:58

Pozostało 580 znaków

2020-03-06 14:38

Rejestracja: 2 lata temu

Ostatnio: 55 minut temu

1
MarekR22 napisał(a):

Bez mock-ów nie da się napisać testu sprawdzającego obsługę błędów, bo sensowne doprowadzenie np bazy danych do raportowania błędu jest bardzo trudne.

Nie do końca rozumiem ten punkt. Możesz rozwinąć?

Bez mock-ów testy są boleśnie powolne.

Większość moich testów, które korzystają z bazy danych albo serwisów webowych działają po HTTP z nagranymi odpowiedziami i z prawdziwą bazą danych w pamięci. Większość testów nie trwa więcej niż 10 milisekund. Jak dochodzi trochę HTTP to faktycznie może się wydłużyć do 100 ms, bo startuje serwer itp.

edytowany 3x, ostatnio: Michał Sikora, 2020-03-06 14:41
napisz test zerwanego połączania internetowego nie używając mock-ów. - MarekR22 2020-03-06 14:50
Spoko. Wyłączam serwer w trakcie requestu. - Michał Sikora 2020-03-06 14:51

Pozostało 580 znaków

2020-03-06 14:48

Rejestracja: 9 lat temu

Ostatnio: 38 minut temu

2

Pytania o nazewnictwo w programowaniu są z reguły bezcelowe. Jeśli pytasz o samą nazwę - znajdą się tacy którzy powiedzą że to unit, są tacy którzy powiedzą że nie.

Jeśli masz jakieś dalsze pytania, takie które nie zależą od nazewnictwa ale innych rzecz to rozwiń je.


Pozostało 580 znaków

2020-03-06 14:49
Moderator

Rejestracja: 16 lat temu

Ostatnio: 27 minut temu

test dla danej metody z jakiegoś serwisu

To jest błąd a nie test ;) Testuje się funkcje systemu a nie metody czy klasy. Testy jednostkowe na takim poziomie w 95% nie są w ogóle ani potrzebne ani sensowne. Pisze się je najwyżej jak masz jakiś skomplikowany kawałek (nie wiem, jakieś parsowanie na przykład) i chcesz je przemaglować we wszystkie strony. W pozostałych przypadkach dużo więcej sensu ma test integracyjny który idzie od entry pointu aplikacji i robi test całej funkcji systemu.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Pokaż pozostałe 30 komentarzy
@Shalom: "więc wysokopoziomowy interfejs który ukrywa zupełnie sposób persystencji danych" - To jak i gdzie robisz transakcje? Nie używasz Transactional chociaż? - szopn 2020-03-07 02:15
@szopn używam ale czemu kogoś w biznesowym interfejsie ma interesować techniczny szczegół? o_O Na wysokim poziomie interesuje cie tylko wykonanie biznesowej operacji. Więc robisz jakieś createNewUser(details) a nie zastanawiasz się że ta operacja wymaga transakcji i wrzucenia danych w 17 różnych tabel. To jest zupełnie nieistotne z poziomu kodu który takiego repozytorium używa! - Shalom 2020-03-07 09:23
@Shalom: np w laravelu typowi laravelowcy (czyli np ja) uznają takie podejście https://adamwathan.me/2015/02[...]epository-is-an-anti-pattern/ - mr_jaro 2020-03-07 12:15
Nie widzę żadnego związku. Przecież tam ziomek robi wrzut na active record, czyli na fakt, że masz jakąś magie która automatycznie ładuje rzeczy do bazy jak tylko ich dotykasz w kodzie (trochę jak działa czasem JPA). Nie ma absolutnie nic wspólnego z posiadaniem biznesowego repozytorium które zasłania szczegóły implementacji utrwalania danych. - Shalom 2020-03-07 12:24
@Shalom: to się chyba minęliśmy bo ja pisałem o repo, które jest tylko jedną warstwę wyżej nad operacjami na orm. - mr_jaro 2020-03-07 12:26

Pozostało 580 znaków

2020-03-06 14:54

Rejestracja: 5 lat temu

Ostatnio: 3 minuty temu

0

Pytanie poboczne:
Jeżeli podnoszę cały kontekst springa, z bazą dockerową podnoszoną na czas testu, i uderzam pod konkretny endpoint wykonując przy tym jakieś asercje - można nazywać to testem integracyjnym? ;)

Pozostało 580 znaków

2020-03-06 14:56

Rejestracja: 5 lat temu

Ostatnio: 3 minuty temu

0
Shalom napisał(a):

test dla danej metody z jakiegoś serwisu

To jest błąd a nie test ;) Testuje się funkcje systemu a nie metody czy klasy. Testy jednostkowe na takim poziomie w 95% nie są w ogóle ani potrzebne ani sensowne. Pisze się je najwyżej jak masz jakiś skomplikowany kawałek (nie wiem, jakieś parsowanie na przykład) i chcesz je przemaglować we wszystkie strony. W pozostałych przypadkach dużo więcej sensu ma test integracyjny który idzie od entry pointu aplikacji i robi test całej funkcji systemu.

Tylko, że jak masz metodę, z kilkoma argumentami to żeby przetestować ją np. przy okazji testowania widoków to musiałbyś pisać X więcej testów dla tego widoku. Natomiast jak przetestujesz dodatkowo osobno to możesz skupić się na testowaniu tej metody porządniej i nie umkną Ci np. wartości skrajne itd.

Pozostało 580 znaków

2020-03-06 14:57

Rejestracja: 2 lata temu

Ostatnio: 56 sekund temu

Lokalizacja: PL

0

Moim zdaniem, jeżeli test łączy jakąs funkcjonalność (zalozmy backendową) z frontendem, jakimis reponsami JSONowymi, albo bazą danych, która nie jest zamockowana (typu jakieś prepared h2) to jest to test integracyjny.

Oczywiście przy zalozeniu ze dzielimy testy na jednostkowe, integracyjne etc.

Pozostało 580 znaków

2020-03-06 14:59
Moderator

Rejestracja: 16 lat temu

Ostatnio: 27 minut temu

1

@anonimowy

masz metodę

Nie masz bo testujesz funkcje systemu a nie metody albo ich argumenty. Poza tym twój argument jest inwalidą bo takie testy I TAK musisz mieć, bo inaczej nie masz żadnej pewności że coś faktycznie działa. To sie nazywa testy akceptacyjne.
Tak jak pisałem czasami są bardziej złożone kawałki kodu które trzeba przetestować jednostkowo, ale to jest kilka %


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2020-03-06 15:02

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0