Nette\Tester, chybějící PDO, php skrz CLI

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

Zdravím,

Nette\Tester jsem zprovoznil a používám ho obdobně jako je tomu u testů ve frameworku.

Snažil jsem se připravit i základní integrační testy. Nicméně dostávám hlášku:
Class 'PDO' not found in <b>/var/www/sandbox/tests/UserManager/connect.inc.php

Testy spouštím:
php libs/nette/tester/Tester/tester.php tests/

Když zadám (phpinfo pro cli):

php -i | grep "PDO"

Dostanu:

PDO
PDO support ⇒ enabled
PDO drivers ⇒ mysql, pgsql
PDO Driver for MySQL ⇒ enabled
PDO Driver for PostgreSQL ⇒ enabled

Když najdu konfigurák:
php -i | grep "Loaded Configuration File"
Tak dostanu cestu:
/etc/php5/cli/php.ini

Když tam přidám řádky:

extension=pdo.so
extension=php_pdo_mysql.so

tak php hlásí, že se pdo snažím načítat podruhé.

Skutečně už nevím, jak bych měl víc ověřit, že php z konzole PDO má.


Udělal jsem experiment. Připravil jsem si soubor tests/db.phpt:

<?php

if(! extension_loaded("PDO") ) {
  throw new \Exception("Chybí PDO");
} else {
  throw new \Exception("OK");
}

Pokud ho spustím:
`php tests/db.phpt `, tak vyhodí výjimku OK.

Pokud ho spustím (tedy přes tester.php):
php libs/nette/tester/Tester/tester.php tests/db.phpt, tak dostanu, že chybí PDO.


Vše zkouším na:

  • nette/sandbox skrz composer
  • nette/tester skrz composer (@dev)
  • tester.php má v hlavičce version 0.9-dev
  • PHP 5.4.6–1ubuntu1.2
  • Ubuntu 12.10
Majkl578
Moderator | 1364
+
0
-

Už na chatu jsem ti psal, že některé distribuce rozlišují konfigurační soubory pro CLI, CGI a Apache 2 Handler. Nette spouští testy jako CGI, ale ty nejspíš prohlížíš konfiguraci (a edituješ konfigurák) pro CLI. Zkus editovat ten pro CGI (/etc/php5/cgi/php.ini?). Pak by to mělo fungovat správně.

kedrigern
Člen | 102
+
0
-

Já jsem to i zkusil. Zjistil jsem, že PDO je loadnuté.

Nicméně teď jsem zjistil, že není loadnutý driver pro mysql. Dík. Jdu to zkusit.

kedrigern
Člen | 102
+
0
-

No jenže

cat /etc/php5/cgi/conf.d/20-pdo_mysql.ini
; configuration for php MySQL module
; priority=20
extension=pdo_mysql.so

Čili dle configu se má v cgi načíst.

Milo
Nette Core | 1283
+
0
-

Pro Tester je nejlepší vytvořit si vlastní php.ini a předávat ho přes parametr -c.

php libs/nette/tester/Tester/tester.php -c php.ini tests/db.phpt

Edit: A pro hledání takovéto chyby se hodí do testu dát:

ob_start();
phpinfo();
file_put_contents('/temp/phpinfo.html', ob_get_clean());

Editoval Milo (26. 4. 2013 9:30)

kedrigern
Člen | 102
+
0
-

Děkuji.

Ten parametr -c jsem předtím také zkoušel, ale hloupě u toho prvního php, kde neměl vliv. Teď jsem ho dal správně a už vše jde:

php libs/nette/tester/Tester/tester.php -s -c /etc/php5/apache2/php.ini tests/

Teď už se to chová dle mých představ. Moc všem děkuji za trpělivost.

Editoval kedrigern (26. 4. 2013 10:06)

Milo
Nette Core | 1283
+
0
-

Ono je dobré ten -c parametr předat dvakrát. Jednou pro php binárku, která spustí tester samotný. A podruhé pro tester a ten ho předá binárce, která spouští testy. Pomůže to odhalit php startup errory, které jinak mohou zůstat skryty.

kedrigern
Člen | 102
+
0
-

Děkuji, to je také užitečná rada.

Ještě se zeptám, testy mi vypisují chyby např. takto:

-- FAILED: /var/www/sandbox/tests/UserManager/NanTest.phpt | tests/UserManager/NanTest.phpt
Fatal error (code 255)

-- FAILED: skip | sandbox/tests/FailTest.phpt
Fatal error (code 255)

Viděl jsem nějaké rozšíření pro zobrazení čísla řádku, kde chyba nastala. Ale mě by docela zajímala i konkrétní chyba (např. zda něco selhalo, či je špatný typ proměnné) a tak. To lze nějak nastavit?

Resp. pokud nezadám ten config z Apache, ale nechám ten default php-cgi, tak to vyplivne např.:

-- FAILED: /var/www/sandbox/tests/UserManager/NanTest.phpt | tests/UserManager/NanTest.phpt
<br />
<b>Fatal error</b>: Uncaught exception ‚Exception‘ with message ‚ahoj‘ in /var/www/sandbox/tests/UserManager/NanTest.phpt:11
Stack trace:
#0 {main}
thrown in <b>/var/www/sandbox/tests/UserManager/NanTest.phpt</b> on line <b>11</b><br />

Lze vydolovat nějako střední cestu? Ten code 255 je fakt málo.

Milo
Nette Core | 1283
+
0
-

To bude nastavením PHP direktiv pro zobrazení chyb. Přidej si do tests/bootstrap.php:

Tester\Helpers::setup(); # toto přidat

function id($val) {
	return $val;
}

a dej vědět, jestli pomohlo.

kedrigern
Člen | 102
+
0
-

Skvěle! Nejen, že to hlásí přesněji, ale dokonce to teď začalo hlásit i interní chyby (např. jsem špatně definoval u integračních testů tmp adresář, předtím to prošlo, teď mě to upozornilo :-)).

Jen pro info, teď to vypadá takto:

Nette Tester (v0.9)

PHP 5.4.6–1ubuntu1.2 | ‚php-cgi‘ -c ‚/etc/php5/apache2/php.ini‘

..F.......

-- FAILED: skip | sandbox/tests/FailTest.phpt
Failed asserting that FALSE is TRUE
in Tester/Framework/Assert.php(211)
in Tester/Framework/Assert.php(88)
in sandbox/tests/FailTest.phpt(32)
in Tester/Framework/TestCase.php(69)
in Tester/Framework/TestCase.php(54)
in sandbox/tests/FailTest.phpt(38)

FAILURES! (10 tests, 1 failures, 0 skipped)

kedrigern
Člen | 102
+
0
-

Kdyby to někomu k něčemu bylo (třeba lidem, kteří tápají jako já minulý týden), tak jsem sepsal základní testy pro nette/sandbox (trochu jsem ho rozšířil, aby bylo co testovat).

https://github.com/…ern/sandbox/

(Samozřejmě připomínky rád uvítám.)