Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]Doctrine, Symfony, PHPunit, baza danych i testowanie. Co mam testować?
Forum PHP.pl > Forum > PHP > Frameworki
koszykarze
co powinno się testować, jakich narzędzi używać jeśli chodzi o Doctrine + baza danych + Symfony?


będę wdzięczny za każde wskazówki.

Szymciosek
W dalszym ciągu powinieneś używać PHPUnit niezależnie czy aplikacja jest napisana z użyciem Doctrine czy Symfony, to nadal PHP

Co do testowania bazy danych - nie robisz tego - takie dane mockujesz sobie w testach (poczytaj o doubles w phpunit)

Ale do rzeczy:
Aplikacja może być testowana na wiele sposobów (testy jednostkowe, integracyjne, funkcjonalne...), ale na tą chwilę możesz skupić się na samych testach jednostkowych (ich powinno być najwięcej)



Co do połączenia z bazą danych, to tak jak napisałem wyżej - powinno być zamockowane czyli tworzysz coś co zawsze zwraca te same dane (to tyczy się testów jednostkowych)

http://symfony.com/doc/current/book/testing.html
http://symfony.com/doc/current/cookbook/te...g/doctrine.html
koszykarze
dzięki za odpowiedź, mniejsza o testy jednostkowe (je ogarniam), nie ogarniam testów integracyjnych czy funkcjonalnych, (nie odróżniam ich).

Czytam o Database Testing z 4 źródeł:
1. PHPUnit oficjalny manual
2. książka PHPUnit Essentials
3. Symfony Cookbook :
4. artykuł na blogu Symfony: Test your doctrine repository using a SQLite database

I wszędzie inaczej...



1. PHPUnit oficjalny manual:
- tworzę dataset.xml z danymi do wypełnienia testowej bazy danych (taki fixture)
- instaluję DBUnit co daje mi klasę PHPUnit_Extensions_Database_TestCase (która pozwala czyścić db i importować dataset do db) .
- klasa testująca rozszerza PHPUnit_Extensions_Database_TestCase i implementuje 2 metody getConnection(z danymi konfiguracyjnymi testową bazę danych) i metodę getDataSet (ładującą dataset.xml do bazy danych)
- tworzę testową bazę danych
- robię asserty gdzie porównuję dane ze wzorca z dataset.xml z danymi z wyniku zapytania do testowej bazy danych

2. książka PHPUnit Essentials (w podroździale o testowaniu bazy danych):
- to jest nazwane testem integracyjnym
- instaluję DBUnit
- tworzę dataset.xml
- klasa testująca rozszerza PHPUnit_Extensions_Database_TestCase
- implementuję getConnection i getDataSet
- assertem porównuję dane z zapytania (np $this->getConnection()->createQueryTable('customer', 'SELECT * FROM customer'); ) z danymi z dataset.xml (np $this->getDataSet()->getTable("customer"); )
- czyli dataset.xml jako wzór i jako wypełniacz testowej bazy danych

2. książka PHPUnit Essentials (w podroździale o testowaniu bazy danych z Doctrine):
- to jest nazwane testem integracyjnym
- instaluję berberlei/DoctrineExtension co daj mi klasę OrmTestCase
- w klasie testującej rozszerzam OrmTestCase
- w klasie testującej konfiguruję ustawienia bazy danych testowej
- w klasie testującej dropuję bazę przed testami i tworzę świeże schema
- w klasie testującej getDataSet(), dataset.xml do bazy
- assertuję wynik metody pobierającej dane z bazy z wartością podaną na sztywno (np $this->assertEquals(20, $invoice->getPriceTotal());

3. w Symfony Cookbook :
- klasa testowa rozszerza Symfony\Bundle\FrameworkBundle\Test\KernelTestCase która "boot the kernel to get a valid connection"
- to jest nazwane testem funkcjonalnym
- tu testuję czy metoda repozytorium zwraca co trzeba
moje wątpliwości:
- nie ma tu słowa o testowym środowisku, bazie danych, jak ją skonfigurować. Rozumiem że rozszerzając KernelTestCase jakoś przełączam się na środowisko testowe. Czy może jakimś cudem nie potrzebuję testowej bazy danych?

4. w artykule na blogu Symfony: Test your doctrine repository using a SQLite database (z 2013 r):
- to jest nazwane testem funkcjonalnym
- konfiguruję środowisko testowe z SQLite w config_test.yml
- tworzę bazę danych testową doctrine:schema:update
- tworzę fixture z danymi do testów
- tworzę klasę testującą która rozszerza WebTestCase z metodą ładującą fixture i metodą inicjującą repository w środowisku testowym
- assertuję wynik metody pobierającej dane z bazy z wartością podaną na sztywno (np
$this->assertEquals('EN', $countries[0]->getCountryCode());



moje wątpliwości:
- wszędzie klasa testująca rozszerza inną klasę (PHPUnit_Extensions_Database_TestCase, OrmTestCase, WebTestCase)

workflow jaki z tego wszystkiego wynoszę mając Symfony+Doctrine+PHPUnit:
- tworzę testową bazę danych (doctrine:schema:update)
- config_test.yml konfiguruję bazę testową
- klasa testująca rozszerze KernelTestCase i czarodziejsko łączy się z testową bazą danych
- tworzę jakieś przykładowe fixture i wrzucam do testowej db
- w klasie testującej assertuję jakieś repository porównując z fixture.



proszę o jakiś komentarz
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.