Jak zajistit co nejrychlejší provedené databázových testů využivajících doctrine?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
fary
Člen | 155
+
0
-

Ahoj, zrovna vytvářím unit testy (za pomocí nette/tester) a pro databázi využívám kdyby/doctrine. Bohužel se potýkám s tím, jak jsou testy týkající se databáze zdlouhavé a pomalé. Někdy jeden zabere kolem 30 – 60 sekund. Je to fakt strašně dlouho. Neexistuje nějaký obecný způsob a postupy, jak testy s doctrine zrychlit?

Azathoth
Člen | 495
+
0
-

kolik testů na db tam máš?
alternativa je místo testování databáze testovat jen vygenerované SQL, protože víš, že SQL samotné už je plně funkční. a to se hned zrychlí. ale nevím, jestli to je pro tebe přijatelná varianta.

Editoval Azathoth (17. 10. 2015 14:07)

fary
Člen | 155
+
0
-

Test mam zatim jen jeden, ale myslim, ze je to tim, jak doctrine generuje ruzne veci, jako proxy tridy atd. Neda se tomu nejak pomoci? Urcite nejsem sam, kdo se s timto potykal.

David Kudera
Člen | 455
+
0
-

@fary možná bych řekl, že tam bude spíš něco špatně.. Mě jeden test, kde skutečně pracuji s db, trvá kolem 4 vteřin. V tom čase se generuje komplet nový DI kontejner a ještě ke všemu se mi u toho vytváří kopie databáze, speciálně pro každý test zvlášť. Ze zajímavosti, na čem ty testy spouštíš?

Editoval David Kudera (17. 10. 2015 16:52)

fary
Člen | 155
+
0
-

@DavidKudera taky si myslim, ze jsem nejspise na neco zapomnel, ale nevim, co by to mohlo byt. Popravde ani nevim, co bych mel ukazzat, jestli konfoguraci, entity nebo neco jineho. Kdyz smazu cache a pustim orm:schema-tool:create, tak to trva kolem minuty. Asi uz se z toho zblaznim. U jinych projektu jsem tohle nemel a popravde tohle je prvni projekt, kde jsem se rozhodl poradne vzykouset testy. Jedna vec v pripade tohohle projekty byla ovsem jinak a to, ze jsem si nejprve v MySQL Workbenchi vytvoril schema databaze a pak jsem z nej vygeneroval entity, ktere jsem si pak doupravil (z hlediska doplnujicich asociaci atd.). Ale to by byla silenost, aby to bylo timto. Vysledkem jsou preci stejne entity, akorat jsem je vytvoril trochu jinym zpusobem. V aplikaci samotne pouzivam MySQL, v testech SQLite s nastavenim memory: true. V obou pripadech to trva strasne dlouho. Nevim, jestli to treba nemuze byt nejakym chybejicim php modulem.

Jinak tedy pouzivam Linix Mint, Apache2, Mysql, PHP 5.5.9, Nette 2.3, Kdyby/Doctrine 2.3, nevim, co jeste by se hodilo zminit.

Editoval fary (17. 10. 2015 17:06)

David Kudera
Člen | 455
+
0
-

@fary Hm.. to je divný.. Když jsem používal ještě sqlite na testy, tak to bylo ještě rychlejší, než ty 4s, který mám teď. Schválně jsem zkusil i create schema a u 80 tabulek je to za chvilku (taky tak 4s).

Nemáš třeba možnost zkusit to jinde? Třeba u kolegy? Já se s podobným setkal jen u winů, u mě např. hl. strana trvá 80ms, u kolegyně na win pár vteřin.

Jinak jak dlouho ti trvá klasický načtení stránky po smazání cache? Víš na 100%, že to, co trvá, je práce s db?

Azathoth
Člen | 495
+
0
-

zkus tam zapnout profiler a pak koukni na to, co tak dlouho trvá

fary
Člen | 155
+
0
-

Použil jsem tedy BlackfirePHP a vsiml jsem si, ze prakticky 99% vsecho casu zabira nacteni sql souboru s instrukcemi pro vytvoreni tabulek a jejich naplneni. Cely tenhle soubor ma 166 radku. Moc tam toho neni. Zkusil jsem pro to v testech vyuzit Doctrine DBAL, takto:

$em = $container->getByType('Kdyby\Doctrine\EntityManager');

$schemaTool = new SchemaTool($em);
$schemaTool->dropDatabase();

$conn = $em->getConnection();

$stmt = $conn->prepare(file_get_contents(__DIR__ . '/../fixtures/fixtures.sql'));
$stmt->execute();

Porad to trva strasne dlouho.

Azathoth
Člen | 495
+
+1
-

jestli to není v trnsakci, obal ten celý sql soubor do transakce