Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Testy a baza danych

Jak najwydajniej opracować testy (zarówno jednostkowe jak i funkcjonalne) w aplikacji wykorzystującej bazę danych, ale nie tylko do odczytu? Czyli np. mam test funkcjonalny, który zawsze chcę wykonać od pewnego stanu bazy, testowana procedura wykonuje kilka modyfikacji na bazie, potem pobiera kilka rekordów z bazy i znów dokonuje modyfikacji.

Planuję korzystać z symfony+PostgreSQL. W symfony jest sfBrowser, który potrafi symulować zachowanie przeglądarki.

Mnie najbardziej interesuje sposób zapewnienia identycznego stanu bazy do każdych testów. Baza oczywiście posiada klucze obce, triggery, funkcje i procedury.
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Testy a baza danych

hmm ja bym probowal z truncate na tabelach i ladowaniem statycznych plikow SQL lub fixturek YAML
aktualnie w swoim projekcie mam testy bazy na postgresql/mysql + zend + doctrine, bol z postgresem jest taki ze usuwanie/tworzenie bazy jest strasznie wolne wiec szukam innego szybszego rozwiazania
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Testy a baza danych

Tak jak przedmówca polecam Fixtures, poza tym może dobrze by było się zainteresować jakąś inną bazą do samych testów (jeżeli test nie obejmuje triggera) np. sqlite która jest często wykorzystywana do takich celów...
Tomasz Zadora

Tomasz Zadora programuję

Temat: Testy a baza danych

Do testów można wykorzystać także Selenium - taką platformę która dosłownie robi test przez przeglądarkę.

To znaczy piszesz skrypt np. w javie lub innym języku który wykorzystując API Selenium, w wybranej przeglądarce otwiera stronę i dosłownie "klika" w różne elementy, wypełnia formularze i wiele więcej.

Można też prościej - ściągnąć Selenium jako wtyczkę do Firefoxa i definiować test bezpośrednio w tej wtyczce.

http://seleniumhq.org/
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Testy a baza danych

O Selenium wiem. Ale tym nie sprawdzę poprawności rekordów w bazie.

Testowanie również obejmuje triggery i procedury składowane i widoki, więc zmiana bazy na inną nie jest dobrym rozwiązaniem.

A co sądzicie, gdyby przed rozpoczęciem testowania rozpocząć transakcję a po zakończeniu testowania zrobić jej rollback?
Łukasz Ważny

Łukasz Ważny winning doesn't
really matter as
long as you win

Temat: Testy a baza danych

Paweł Koralewski:
Testowanie również obejmuje triggery i procedury składowane i widoki, więc zmiana bazy na inną nie jest dobrym rozwiązaniem.

Może zastanów się nad instancją bazy dedykowanej pod testy. Podczas setupowania środowiska przygotowujesz dane testowe, odpalasz testy, a potem zamiatasz, aby nic nie przeszkadzało w przeprowadzaniu następnych testów.

konto usunięte

Temat: Testy a baza danych

Paweł Koralewski:
A co sądzicie, gdyby przed rozpoczęciem testowania rozpocząć transakcję a po zakończeniu testowania zrobić jej rollback?

MySQL i MyISAM jakby to powiedzieć nie da rady w ten sposób

zrób sobie kopię bazy z backupu i na tym pracuj
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Testy a baza danych

@Przemek

Jak napisałem, pracuję na PostgreSQL.

@Łukasz, Przemek

Wiem, że mogę robić kopię całej bazy przed rozpoczęciem testów i przywracać ją po zakończeniu. Ale to rozwiązanie traktuję jako ostateczność.

konto usunięte

Temat: Testy a baza danych

Paweł Koralewski:
@Przemek

Jak napisałem, pracuję na PostgreSQL.

ops, fopa ;)
@Łukasz, Przemek

Wiem, że mogę robić kopię całej bazy przed rozpoczęciem testów i przywracać ją po zakończeniu. Ale to rozwiązanie traktuję jako ostateczność.

robisz backup na maszynie produkcyjnej, i przywracanie na maszynie testowej np. twoim laptopie - dalej łączysz się zamiast z maszyną produkcyjną z bazą na twojej maszynie
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Testy a baza danych

Przemysław R.:
robisz backup na maszynie produkcyjnej, i przywracanie na maszynie testowej np. twoim laptopie - dalej łączysz się zamiast z maszyną produkcyjną z bazą na twojej maszynie

e? Ty chcesz testowac app z kopia aktualnej bazy z produkcji? czasem baza nie powinna byc "testowa" co oznacza takze testowe dane wrzucone do bazy tak aby mozna bylo prawidlowo testowac konkretne wyniki zapytan a nie same testy akceptacyjne czy cos dziala czy wykrzaczylo :S?

ja u siebie mam tak:

- osobny serwer na ktorym jest cruise control, php, phing, mysql, postgresql i wirtualki z przegladarkami
- komituje kod (svn)
- cruisecontrol uaktualnia dwie kopie robocze, jedna dla mysql druga dla postgresa
- leci phing z phpunitem
- setup danego testu, czysci baze i wrzuca dane
- leci test (unittest)
- nastepny test czysci baze i tak do konca
- phing uruchamia inny zestaw testow z selenium
- wrzuca wiekszy set danych do bazy tak aby cala aplikacja mogla dzialac
- uruchamia przegladarke, leci test i tak w kolkoŁukasz Cepowski edytował(a) ten post dnia 03.08.10 o godzinie 22:33
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Testy a baza danych

Imo testy powinno się też przeprowadzać na kopii danych produkcyjnych, bo klienci mają większą fantazję niż jesteśmy to w stanie przewidzieć :) Oczywiście niespecjalnie...

A podsumowując, to przed każdym testem czyścisz bazę. Zapewne robisz drop database, bo usuwać zawartość tabel może być bardziej kłopotliwe ze względu na FK. Taki scenariusz wymyśliłem również, ale szukam szybszych rozwiązań.
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Testy a baza danych

Paweł Koralewski:
Imo testy powinno się też przeprowadzać na kopii danych produkcyjnych, bo klienci mają większą fantazję niż jesteśmy to w stanie przewidzieć :) Oczywiście niespecjalnie...
nie zgodze sie, rowniedobrze moglbym randoma robic na bazie i wynik pewnie bylby podobny, testuje na znanych mi danych i otrzymuje oczekiwane wyniki, jak sie cos zj3bie w kodzie to odrazu wiem co jak i gdzie, a gdy klient znajdzie luke to tworze nowy test ktory pokrywa dany przypadek
A podsumowując, to przed każdym testem czyścisz bazę. Zapewne robisz drop database, bo usuwać zawartość tabel może być bardziej kłopotliwe ze względu na FK. Taki scenariusz wymyśliłem również, ale szukam szybszych rozwiązań.
no u siebie tak, i teraz zaluje bo wprawdzie testy tego projektu na MySQL zajmuja okolo minuty, tak na PostgreSQL to prawie 10 minut :/
w pracy uzywamy mysql, przeszlismy z create/drop na truncate, nie mam dokladnego benchmarku ale testy znacznie przyspieszylyŁukasz Cepowski edytował(a) ten post dnia 03.08.10 o godzinie 23:25

konto usunięte

Temat: Testy a baza danych

Łukasz Cepowski:
Przemysław R.:
robisz backup na maszynie produkcyjnej, i przywracanie na maszynie testowej np. twoim laptopie - dalej łączysz się zamiast z maszyną produkcyjną z bazą na twojej maszynie

e? Ty chcesz testowac app z kopia aktualnej bazy z produkcji? czasem baza nie powinna byc "testowa" co oznacza takze testowe dane wrzucone do bazy tak aby mozna bylo prawidlowo testowac konkretne wyniki zapytan a nie same testy akceptacyjne czy cos dziala czy wykrzaczylo :S?

optymalizacja aplikacji to nie tylko klikanie w PHP
czasem trzeba zajść poziom niżej do indeksów a raczej ich braku. Jeżeli mamy jakąś aplikację która coś tam robi na dużych zbiorach danych ma się to nijak do testowania za pomocą jakiś skryptów bo jak za symulujesz poprawność wyszukania w ~1mln rekordów w akceptowalnym czasie mając do dyspozycji powiedzmy 50? w tym przypadku zapytanie działa równie szybko z indeksem jak i bez
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Testy a baza danych

Nooo, tu się kłania dbMonster

http://dbmonster.kernelpanic.pl/
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Testy a baza danych

Przemysław R.:
optymalizacja aplikacji to nie tylko klikanie w PHP
czasem trzeba zajść poziom niżej do indeksów a raczej ich braku. Jeżeli mamy jakąś aplikację która coś tam robi na dużych zbiorach danych ma się to nijak do testowania za pomocą jakiś skryptów bo jak za symulujesz poprawność wyszukania w ~1mln rekordów w akceptowalnym czasie mając do dyspozycji powiedzmy 50? w tym przypadku zapytanie działa równie szybko z indeksem jak i bez

no ok, ale to i tak ma sie nijak do bazy produkcyjnej :P

konto usunięte

Temat: Testy a baza danych

Łukasz Cepowski:
Przemysław R.:
optymalizacja aplikacji to nie tylko klikanie w PHP
czasem trzeba zajść poziom niżej do indeksów a raczej ich braku. Jeżeli mamy jakąś aplikację która coś tam robi na dużych zbiorach danych ma się to nijak do testowania za pomocą jakiś skryptów bo jak za symulujesz poprawność wyszukania w ~1mln rekordów w akceptowalnym czasie mając do dyspozycji powiedzmy 50? w tym przypadku zapytanie działa równie szybko z indeksem jak i bez

no ok, ale to i tak ma sie nijak do bazy produkcyjnej :P

Z produkcyjnej potrzebujemy głównie struktury, słowników i reprezentatywnej próbki danych. Dane moim zdaniem powinny być produkcyjne a nie z jakiegoś generator-a, bo czasem więcej czasu zajmie przygotowanie takich danych -> złożona baza danych z setką tabelek niże odtworzenie z backupu.

no i można w tych danych mieszać do woli, bez obawy że będzie jakiś zonkPrzemysław R. edytował(a) ten post dnia 04.08.10 o godzinie 08:39

Następna dyskusja:

zend Framewodk, baza danych




Wyślij zaproszenie do