Jaki jest właściwy sposób testowania kodu, który wewnętrznie używa zapytań MySQL

Zbieram dane i przechowuję te dane w bazie danych MySQL za pomocą Java. Dodatkowo używam Maven do budowania projektu, TestNG jako struktury testowej i Spring-Jdbc do uzyskiwania dostępu do bazy danych. Zaimplementowałem warstwę DAO, która hermetyzuje dostęp do bazy danych. Oprócz dodawania danych za pomocą klas DAO, chcę wykonać niektóre zapytania, które agregują dane i przechowują wyniki w innych tabelach (takich jak widoki zmaterializowane).

Chciałbym teraz napisać kilka przypadków testowych, które sprawdzają, czy klasy DAO działają tak, jak powinny. Dlatego pomyślałem o użyciu bazy danych w pamięci, która zostanie wypełniona pewnymi danymi testowymi. Ponieważ używam również zapytań SQL specyficznych dla MySQL do agregowania danych, wpadłem w pewne problemy:

Po pierwsze, pomyślałem o użyciu funkcji wbudowanej bazy danych dostarczonej przez Spring-Jdbc, aby utworzyć instancję wbudowanej bazy danych. Zdecydowałem się na implementację H2. Wpadłem tam w kłopoty z powodu zapytań o agregację, które wykorzystują treści specyficzne dla MySQL (np. Funkcje manipulacji czasem, takie jak DATE ()). Inną wadą tego podejścia jest to, że muszę utrzymywać dwa pliki ddl - rzeczywisty plik ddl definiujący tabele w MySQL (tutaj definiuję kodowanie i dodaje komentarze do tabel i kolumn, obie funkcje są specyficzne dla MySQL); oraz plik testowy ddl, który definiuje te same tabele, ale bez komentarzy itp. od H2 nie obsługuje komentarzy.Znalazłem opis używania MySQL jako wbudowanej bazy danych, której mogę używać w przypadkach testowych (http://literatitech.blogspot.de/2011/04/embedded-mysql-server-for-junit-testing.html) . To brzmiało naprawdę obiecująco. Niestety nie zadziałało: wystąpił błąd MissingResourceExcpetion „Resource” 5-0-21 / Linux-amd64 / mysqld „not found”. Wygląda na to, że sterownik nie może znaleźć demona bazy danych na moim komputerze lokalnym. Ale nie wiem, czego muszę szukać, aby znaleźć rozwiązanie tego problemu.

Teraz jestem trochę utknięty i zastanawiam się, czy powinienem był stworzyć architekturę inaczej. Czy ktoś ma jakieś wskazówki, jak powinienem ustawić odpowiedni system? Mam na myśli dwie inne opcje:

Zamiast korzystać z wbudowanej bazy danych, skorzystam z natywnej instancji MySQL i skonfiguruję bazę danych, która będzie używana tylko dla przypadków testowych. Ta opcja brzmi wolno. Właściwie może chciałbym skonfigurować serwer CI później i pomyślałem, że użycie osadzonej bazy danych byłoby bardziej odpowiednie, ponieważ test działa szybciej.Usuwam wszystkie zapytania specyficzne dla MySQL z zapytań SQL i używam H2 jako wbudowanej bazy danych do testowania. Jeśli ta opcja jest właściwym wyborem, musiałbym znaleźć inny sposób testowania zapytań SQL, które agregują dane w zmaterializowane widoki.Czy istnieje trzecia opcja, której nie mam na myśli?

Byłbym wdzięczny za wszelkie wskazówki.

Dzięki, XComp

questionAnswers(2)

yourAnswerToTheQuestion