Być może mogę wam posmakować naszego doświadczenia, kiedy zaczęliśmy przyglądać się testom jednostkowym naszego procesu średniego poziomu, który obejmował mnóstwo operacji SQL „logiki biznesowej”.
Najpierw stworzyliśmy warstwę abstrakcji, która pozwoliła nam „wstawić” dowolne rozsądne połączenie z bazą danych (w naszym przypadku po prostu obsługiwaliśmy pojedyncze połączenie typu ODBC).
Gdy to było na miejscu, mogliśmy zrobić coś takiego w naszym kodzie (pracujemy w C ++, ale jestem pewien, że masz pomysł):
GetDatabase (). ExecuteSQL ("INSERT INTO foo (bla, bla)")
W normalnym czasie wykonywania GetDatabase () zwróciłoby obiekt, który zasilał cały nasz plik sql (w tym zapytania), przez ODBC bezpośrednio do bazy danych.
Następnie zaczęliśmy przyglądać się bazom danych w pamięci - zdecydowanie najlepszym wydaje się być SQLite. ( http://www.sqlite.org/index.html ). Jest niezwykle prosty w konfiguracji i obsłudze, a także pozwolił nam podklasę i przesłonięcie GetDatabase () w celu przekazania sql do bazy danych w pamięci, która została utworzona i zniszczona dla każdego wykonywanego testu.
Wciąż jesteśmy na wczesnym etapie, ale jak na razie wygląda to dobrze, jednak musimy upewnić się, że tworzymy wszystkie wymagane tabele i wypełniamy je danymi testowymi - jednak nieco zmniejszyliśmy obciążenie tutaj, tworząc ogólny zestaw funkcji pomocniczych, które mogą wiele zdziałać za nas.
Ogólnie rzecz biorąc, bardzo pomogło to w naszym procesie TDD, ponieważ wprowadzenie czegoś, co wydaje się dość nieszkodliwymi zmianami w celu naprawienia niektórych błędów, może mieć dość dziwny wpływ na inne (trudne do wykrycia) obszary twojego systemu - ze względu na samą naturę sql / baz danych.
Oczywiście nasze doświadczenia skupiały się wokół środowiska programistycznego C ++, jednak jestem pewien, że być może możesz uzyskać coś podobnego działającego w PHP / Python.
Mam nadzieję że to pomoże.