Mam pytanie dopiero zaczynam robić testy w laravelu, a w laravelu programuje już od 8 lat, jakoś nifgdy nie przymierzałem się do robierania testów, ale musze w SPACJA końcu zacząć je robić.
Słyaszałewm, że laravel domyslnie dla testów używa bazy danych SQLLite zupełnie nie wiem dlaczego czy można wymusić na laravelu używanie np. mysql/mariadb ?
Jak pogodzić testowanie na bazie danych SQLLite jak w laravelu używa się mysql przecież nie każdą bazę danych da się skonwertować z mysql na SQLLite
Testy laravel, a system DBMS SQL
- Rejestracja: dni
- Ostatnio: dni
- Postów: 207
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Silesia/Marki
- Postów: 5613
nigdy nie napisałem linii kodu w php ale mogę koncepcyjnie powiedzieć czemu sqlite warto używać do testów bo w javie mamy h2 jako odpowiedni. Otóż nie trzeba startować serwera bazy danych przed testami a wyczyszczenie takiej bazy to chwila. h2 np jest tylko bazą pamięciową, dla sqlite to uzycie innego pliku, chociaż coś mi się w głowie kołacze że chyba też ma tryb in memory bez pliku? dawno się nim bawiłem
- Rejestracja: dni
- Ostatnio: dni
- Postów: 3604
Wynika to z konfiguracji phpunit.
Możesz oczywiście stworzyć sobie jakiś .env_test lub phpunit.xml i uruchamiać testy z własną konfiguracją.
Jeśli nie używasz niczego specyficznego dla bazy to korzystaj z tego sqllite. Jeśli masz jakieś specjalne zapytania, zależne od dialektu SQL to niestety musisz zrezygnować z bazy in memory.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Nowa Sól
- Postów: 12
W pliku phpunit.xml zamiast tego:
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="DB_URL" value=""/>
dodaj to:
<env name="DB_CONNECTION" value="mysql"/>
<env name="DB_HOST" value="127.0.0.1"/>
<env name="DB_PORT" value="3306"/>
<env name="DB_DATABASE" value="test_base"/>
<env name="DB_USERNAME" value="root"/>
<env name="DB_PASSWORD" value="1234"/>
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1082
tomixtomi0001 napisał(a):
Słyaszałewm, że laravel domyslnie dla testów używa bazy danych SQLLite zupełnie nie wiem dlaczego czy można wymusić na laravelu używanie np. mysql/mariadb ?
Jak pogodzić testowanie na bazie danych SQLLite jak w laravelu używa się mysql przecież nie każdą bazę danych da się skonwertować z mysql na SQLLite
Można tak testować, ale jest szansa, że trafisz na inne zachowanie tego co masz na produkcji (MySQL) vs baza w testach (SQLite) albo w najgorszym wypadku query nie będą w ogóle działać, bo każda baza ma jakieś swoje dziwactwa. Oczywiście można tak robić, bo wszystko jest kompromisem (SQLite będzie lżejszy do postawienia i szybszy w testach). Ja sam wole testować na bazie takiej samej jak na produkcji, bo testy mają mi dawać jakąś pewność, że wszystko działa jak należy a złe użycie bazy przez aplikację lub błednie skonfigurowana baza to częste źródło problemów
Co do testowanie na rzeczywistej bazie danych to temat rzeka, bo każda opcja ssie w inny sposób. Generalnie są dwa główne podejścia:
- stawiasz bazę samemu np. za pomocą jakiegoś skryptu uruchamiającego bazę w dockerze. W testach łączysz się do tej bazy.
- używasz jakiejś biblioteki, która robi to samo tylko w teście. Popularne są
testcontainersdostępne w wielu językach. PHP ma coś takiego https://github.com/testcontainers/testcontainers-php
W obu wypadkach docker jest zalecany, bo ułatwia uruchamianie zarówno lokalnie jak i w CI
Oczywiście jest dużo problemów z tym związanych:
- działa ok dla testów sekwencyjnych, ale takie są wolne. Trzeba ogarnąć jakąś dobrą strategię np. osobny proces bazy dla każdego testu, jakieś uruchamianie w transakcji czy mądre użycie jednej bazy (np. poprzez klonowanie bazy dla każdego testu, bo klonowanie jest generalnie szybsze niż odpalanie procesu za każdym razem)
- działa wolno. Niektóre bazy potrafią wstawać kilka sekund i ciężko to przeskoczyć. Tutaj trzeba dużo wiedzy, żeby wszystko dobrze zoptymalizować
- rzeczywisty proces to zawsze jakieś problemy
Generalnie polecam ci pobawić się jakimś agentem AI. Niech wygeneruje ci testy dla każdego wariantu po czym możesz sobie porównać jak działa każdy wariant i który ci najbardziej pasuje. Zawsze nauczysz się czegoś nowego