Egoblog.cz - Petr Kobelka

Nette Tester na windows

Po nějaké době jsem rozcházel Nette pro vývoj na windows OS a potřeboval jsem do něj dostat Tester pro testy aplikace. Tady je návod pro začátečníky jak na to.


PHP | Komentáře (0) | Shlédnuto 1516 × | Vloženo: 8. února 2015

Co je cílem s Nette a Tester?

Cílem tohoto postu je ukázat vám, jak rychle rozchodit Tester na platformě Windows. Nikde jsem ucelený návod nenašel a tak celý proces znamenal hledání po netu a zkoušení slepých cest. Ve výsledku je ale celý proces jednoduchý a zvládne jej každý.

Co je třeba pro funkční Nette/Tester udělat?

Za prvé je třeba si připravit místo, kde bude běžet aplikace. Já jsem si stáhnout poslední sandbox. Můžete tak učinit pomocí Composeru, nebo jej stáhnout a nakopírovat ručně. Osobně jsem se vydal cestou to celé provést ručně (obdobně nepoužívám WAMP a jinou podobnou havěť ale vše si instaluji ručně. DB, Apache, PHP). Sice to trvá déle, ale máte za to absolutní kontrolu nad konfigurací a navíc se to hodí i do budoucna.

Tester stáhněte z gitu. Ze staženého zipu budete potřebovat jen adresář Tester, který obsahuje zdrojové kódy pro testování. Tento adresář si nakopírujte do sandboxu do adresáře /vendor/nette. Tedy tam budete mít /vendor/nette/Tester.

Základní nastavení Testeru.

Mě to na vývoji dělalo nějaké problémy. Místo názvu a obsahu exception mi Tester do ComandLine vracel neustále HTML kód s ERR_500. To jsem vyřešil tím, že jsem v adresáři /app vytvořil druhý bootstrap, který obsahuje nastavení pro tester. Pokud kdokoliv zná řešení mého problému, rád jej uvítám. Moc se mi nelíbí mít 2 bootstrapy - jsou do dvě místa, která musím navíc hlídat.

Tento bootstrap.php jsem si pojmenoval bootstrap4test.php a vypadá takto:

/**
 * bootstrap pro automaticke testy
 */
require __DIR__ . '/../vendor/autoload.php';

$configurator = new Nette\Configurator;

$configurator->setDebugMode(true);

$configurator->setTempDirectory(__DIR__ . '/../temp');

$configurator->createRobotLoader()
    ->addDirectory(__DIR__)
    ->register();

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

$container = $configurator->createContainer();

$container->getService('application')->errorPresenter = 'Public:Error';

return $container;

V sandboxu máte v root adresáře /tests. Do něj budete vkládat třídy s testy. Osobně jsem zvolil doporučované strukturování testů podle namespace. Např. když mám třídu User, kterou chci testovat a ta má namespace \App\Core pak v adresáři tests mám tuto strukturu /tests/app/core/user.phpt. Je to jednoduché a intuitivně pak vše potřebné dokážete rychle najít.

Dále jsem ještě v adresáři /tests vytvočil soubor setupTest.php

/**
 * base setup for tests
 */
require __DIR__ . '/../vendor/nette/Tester/bootstrap.php';  # při ruční instalaci
$container = require __DIR__ . '/../app/bootstrap4test.php';

Tento soubor obsahuje potřebné nastavení pro všechny testy.

Ukázková třída pro testování v Testeru

Zde jen v rychlosti ukážu třídu, která pak provádí testování modelu User:

/**
 * unit test class User
 *
 * @author Petr Kobelka <info@petrkobelka.cz>
 */
namespace Test;

 use Tester\Assert;
//volam nastaveni testu
require __DIR__.'/../../setupTest.php';

 class UserTest extends \Tester\TestCase
{
  /** @var $container */
  private $container = NULL;
  /**
   *
   * @param \Nette\DI\Container $container
   */
  public function __construct(\Nette\DI\Container $container)
  {
    $this->container = $container;
  }
  /**
   * testujeme nalezeni uzivatele podle id
   */
  public function testOne()
  {
    $u = new \Krecek\Core\User();
    Assert::equal($u->getId(), NULL);

    $u->setId(1);
    Assert::equal($u->getId(), 1);
  }
  /**
   * testujeme nenalezeni uzivatele a vraceni vyjimky
   */
  public function test2()
  {
    //$userMapper = $this->container->getService('userMapper');

    //Assert::exception(function() use($userMapper) {$userMapper->find(false);}, '\Krecek\Core\Exception\ItemNotExistException');
    //Assert::exception(function() use($userMapper) {$userMapper->find("sdlkfjskldj");}, '\Krecek\Core\Exception\ItemNotExistException');
  }
}

// Spusteni testovacich metod
$testCase = new UserTest($container);
$testCase->run();

Tester spouštím z příkazové řádky ve windows, takže volám např. toto:

D:\www\app\vendor\nette\Tester>C:\php5.4\php.exe tester.php -l "D:\www\app\log\logTest.log" -c "C:\php5.4\php.ini" ../../../tests/

Pozor. tester se defaultně spouští bez php.ini, takže si nějaký vytvořte, nebo zavolejte ten, který máte v PHP. Ostatní přepínače najdete v helpu testeru, voláte C:\php5.4\php-cgi.exe tester.php -h. POZOR musíte byt přepnuti v adresáři testeru, např: D:\www\app\vendor\nette\Tester.

Update 25.2.2015 - prostředí serveru Apache

POZOR!!! Pokud spouštíte testy z konzole, je třeba mít direktivu register_argc_argv=on aby tester dostal potřebné argumenty k provedené testů.

To je vše, teď už by to mělo být v pořádku. jen malá poznámka, Tester ještě potřebuje xdebug ale ten už zvládnete nainstalovat sami. Případně mi napiště, pomohu vám.

Petr Kobelka | Egoblog.cz | Tvorba www stránek - www.petrkobelka.cz

Petr Kobelka
Autor je zkušeným web developerem a programátorem s více než 10 letými zkušenostmi. Pracuje jako programátor pro známou Olomouckou společnost zabývající se tvorbou internetových a intranetových řešení. Spolu se zaměstnáním pracuje na volné noze a zabývá se tvorbou internetových stránek. Ve volném čase rád fotí, jezdí na kole, plave a cestuje.

Komentáře

E-mail je potřeba pouze pro vygenerování Gravataru!

Oups, žádné komentáře? Buďtě první !!!

Blog píše Petr Kobelka

Petr Kobelka - egoblog.cz

Žádám všechny, kteří mají zájem vkládat komentáře, aby se řídili pravidly NETikety. Komentáře, porušující tato pravidla můžou být bez varování smazány.