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 databaseI 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