Wątek przeniesiony 2023-10-08 23:03 z Java przez Riddle.

Czy użycie PostgreSQL w teście integracyjnym to zła praktyka?

0

Hej, mam aplikację napisaną w Java 17 i Spring Boot, Flyway oraz Hiberante

Do trzymania danych używam bazy danych PostgreSQL 16.
Dla testów integracyjnych próbowałem użyć H2 w trybie kompatybilnym z Postgresem, ale ciągle są jakieś problemy: albo z konfiguracją i nazewnictwem tabel/funkcji (zapytania zwracały błąd gdy użyta była duża litera w nazwie tabeli) albo z jakąś funkcją, której nie ma w H2.

Stąd moje pytanie - czy użycie oddzielnej instancji Postgresa tylko dla testów (czyszczone po każdym teście) to jakaś zła praktyka? Wtedy nie ma żadnych problemów z niczym, ta sama DB, tylko ciut wolniej wykonują się testy. No i na początku musiałem ręcznie stworzyć bazę i użytkownika.

6

Do testów najlepiej używać takiego samego typu bazy danych jak tego, z którego korzysta aplikacja, wtedy unikniesz właśnie takich problemów.

0

Kopia schemy produkcyjnej + fabryki testowe i problem solved

6
  1. Polecam: użyj testcontainers, proste i przyjemne.
  2. Pomysł na instancje bazy na testy - nie polecam. Od problemów z kilkoma testami na raz, klkoma programistami ma raz, co sie stanie jak test sie wywali i nie posprząta, dodatkowa baza do konfigurowania, nadzoru itd.

Swoją drogą nie kojarze specjalnie problemów z H2 (raz na ruski rok coś ćwierkało), ale możliwe, że w moich zespołach bylismy dośc ostrożni w kwestii nazewnictwa tabel i wykorzystywanych funkcji.

0

Tak przy okazji. Używam sobie testkontenera postgres (rzeczywiście jest milutko), ale flyway w wersji core, czyli migracja programatycznie. Jakie są za i przeciw użycia flyway nie jako plugina?

0

Na Twoje pytanie odpowiem dwojako.

Z jednej strony, niby używanie bazy w testach nie jest niczym złym. Więc to jest okej.

Ale powód czemu chcesz to zrobić, czyli

próbowałem użyć H2 [...], ale ciągle są jakieś problemy: albo z konfiguracją i nazewnictwem tabel/funkcji (zapytania zwracały błąd gdy użyta była duża litera w nazwie tabeli) albo z jakąś funkcją, której nie ma w H2.`

Też jest średni. To że coś jest trudno zrobić, to nie znaczy że to jest dobre wyjście. Sam wiele razy używałem h2 w testach, i jakoś idzie to normalnie ograć tak żeby było rzetelne.

0
Riddle napisał(a):

próbowałem użyć H2 [...], ale ciągle są jakieś problemy: albo z konfiguracją i nazewnictwem tabel/funkcji (zapytania zwracały błąd gdy użyta była duża litera w nazwie tabeli) albo z jakąś funkcją, której nie ma w H2.`

Też jest średni. To że coś jest trudno zrobić, to nie znaczy że to jest dobre wyjście. Sam wiele razy używałem h2 w testach, i jakoś idzie to normalnie ograć tak żeby było rzetelne.

Jak masz w kodzie insert returning to nie da się bo H2 nie wspiera zwracania całego wiersza a tylko klucz, więc insert returning trzeba przerabiać na insert i select. To tyle z niezgodności jakie znam, wie wiem jak jest na poziomie funkcji wbudowanych bo nie używam

Oczywiście można nie pisać fynkcji w stylu zapisz i zwróć, ale niestety pracuję z kodem zas'anym i wygląda aplikacja jak wygląda

0

Jako, że początkowo post był w dziale Java, to masz 3-cią drogę, możesz chcieć zerknąć na https://github.com/zonkyio/embedded-postgres
Bez dedykowanej bazy testowej i bez kontenerów.

1

Dzięki panowie za rady
Riddle i jarekkaczor, macie rację, że to dziwne i że H2 powinno działać - popróbowałem różnych opcji i ustawień w pliku YAML i się okazało, że H2 było źle skonfigurowane - dlatego tych tabel nie szukało
Dzięki jarek za sugestię testcontainers - popatrzę potem, chyba warto znać
Dzięki omnemon i kamil
Dzięki yarel za tego linka

Został tylko błąd z zapytaniem używającym RANK, ale to ogarnę jakoś przerabiając zapytanie

0

tylko testcontainers. Używam od dawna i to po prostu działa.

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