Pracuję z wieloma aplikacjami internetowymi, które są obsługiwane przez bazy danych o różnym stopniu złożoności w backend. Zazwyczaj istnieje warstwa ORM oddzielna od logiki biznesowej i prezentacji. To sprawia, że testowanie jednostkowe logiki biznesowej jest dość proste; rzeczy mogą być zaimplementowane w modułach dyskretnych, a wszelkie dane potrzebne do testu mogą zostać sfałszowane poprzez wyśmiewanie obiektów.
Jednak testowanie ORM i samej bazy danych zawsze było obarczone problemami i kompromisami.
Przez lata wypróbowałem kilka strategii, z których żadna nie była dla mnie satysfakcjonująca.
Załaduj testową bazę danych ze znanymi danymi. Przeprowadź testy w stosunku do ORM i potwierdź, że odpowiednie dane powracają. Wadą jest to, że testowa baza danych musi nadążać za wszelkimi zmianami schematu w bazie danych aplikacji i może nie być zsynchronizowana. Opiera się również na sztucznych danych i może nie ujawniać błędów, które pojawiają się z powodu głupiego wkładu użytkownika. Wreszcie, jeśli testowa baza danych jest mała, nie ujawni ona nieefektywności takich jak brakujący indeks. (OK, ten ostatni nie jest tak naprawdę, do czego należy stosować testy jednostkowe, ale to nie boli).
Załaduj kopię produkcyjnej bazy danych i przetestuj ją. Problem polega na tym, że w danym momencie możesz nie mieć pojęcia, co znajduje się w produkcyjnej bazie danych; Twoje testy mogą wymagać przepisania, jeśli dane zmienią się z czasem.
Niektóre osoby zauważyły, że obie te strategie opierają się na konkretnych danych, a test jednostkowy powinien przetestować tylko funkcjonalność. W tym celu widziałem sugerowane:
- Użyj fałszywego serwera bazy danych i sprawdź tylko, czy ORM wysyła poprawne zapytania w odpowiedzi na dane wywołanie metody.
Jakie strategie zastosowałeś do testowania aplikacji opartych na bazie danych, jeśli takie istnieją? Co działało najlepiej dla Ciebie?