By Alessandro Lai / @AlessandroLai
Symfony Day 2015 - 9 ottobre, Reggio Emilia
Non facevo e volevo provare:
Prima di iniziare mi consigliarono un libro:
PHP Best Practices
“ Una build che impiega un'ora ad essere eseguita non è particolarmente utile [...] ”
Nella pratica il limite è molto più stretto:
10 minuti
La nostra build era molto lenta
(fino a 25 minuti!!) per tre motivi combinati:
Vagrant + NFS + Symfony2
Docker! (<15 minuti)
Ma
servirebbe
un altro
talk...
Inoltre, la dimensione (e la durata) di una suite di test
può solo aumentare...
TEST_TOKEN
)
TEST_TOKEN
Principali cause dei problemi
Per test funzionali di Symfony2 + Doctrine
Il trucco?
Accesso transazionale al database
Unico limite: funziona solo con l'EntityManager
public function setUp()
{
parent::setUp();
$this
->getEM()
->getConnection()
->setTransactionIsolation(Connection::TRANSACTION_READ_COMMITTED);
$this->getEM()->beginTransaction();
}
public function tearDown()
{
parent::tearDown();
if ($this->getEm()) {
$this->getEm()->rollback();
$conn = $this->getEm()->getConnection();
$conn->close();
}
}
Si verificavano ancora fallimenti casuali...
Le cause erano due:
Il parser di Paraunit sa individuare i fallimenti per deadlock
SQLSTATE[HY000]:
General error: 1205 Lock wait timeout exceeded;
try restarting transaction
Quando li individua,
riporta il test tra quelli
ancora non eseguiti,
e stampa una A
(attempt)
Per risolvere il problema dei controller,
abbiamo fatto 2 modifiche al TestCase:
EntityManager
manualmente:
protected function doRequest($request)
{
$em = $this->getContainer()->get('doctrine.orm.entity_manager');
$newEm = $em->create(
$em->getConnection(),
$em->getConfiguration(),
$em->getEventManager()
);
$this->getContainer()->set('doctrine.orm.entity_manager', $newEm);
return $this->kernel->handle($request);
}
Suite funzionale SharkDev: 261 classi, 1568 metodi
--coverage-php
di PHPUnitGrazie per l'attenzione!