SyMfonAK - vyvíjame databázy pomocou frameworku Symfony

Testovanie

Z SyMfonAK
Prejsť na: navigácia, hľadanie

Symfony dokumentácia → Testovanie


originál návod


Každý nový riadok kódu môže obsahovať chyby. Pre tvorbu lepších aplikácií využívajte funkčné aj unit testy.

PHPUnit testovací framework

Symfony integroval nezávislú knižnicu PHPUnit a vytvoril bohatý framework pre testovanie. Tento článok nepokrýva PHPUnit, on má vlastnú vynikajúcu dokumentáciu.

Inštalujte PHPUnitBridge.

 composer require --dev symfony/phpunit-bridge

Všetky testy sa musia nachádzať v adresári tests/, aj testy funkčnosti aj unit testy. Potom môžete spúšťať testy príkazom

 ./bin/phpunit

Unit testy

Testy pre jednotlivé triedy PHP. Komplexné testovanie aplikácie - viď Testy funkčnosti.

Testy funkčnosti

Testy funkčnosti overujú komplexne linky a stránky. Podobajú sa unit-testom no je pre nich charakteristické nasledovné:

  • request
  • kliknutie na linku alebo odoslanie formulára
  • testovanie odpovede
  • obnovenie, opakovanie


Pre testy funkčnosti je dobré mať nainštalované aj:

composer require --dev symfony/browser-kit symfony/css-selector


Prvý funkčný test

Od verzie Sf4.3 je k dispozícii trieda WebTestCase a CSS selector vieme používať ako

$this->assertSelectorTextContains('html h1.title', 'Hello World');

namiesto

$crawler->filter('html h1.title')


Prihlásenie je od verzie Symfony 5.1 možné cez loginUser(), musí byť v zozname užívateľov, najdený napríklad podľa emailu.



// tests/Controller/ZoologyController
namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ZoologyControllerTest extends WebTestCase
{
  public function testIndex()
  {
    /* toto je spôsob prihlásenie ešte pred verziou symfony 5.1
    $client = self::createClient([],[
    'PHP_AUTH_USER' => 'uzivatel1',
    'PHP_AUTH_PW'   => 'hesloUzivatela1',
    ]);
    */
    $client = static::createClient();
    $userRepository = static::$container->get(UserRepository::class);

    // retrieve the test user
    $testUser = $userRepository->findOneByEmail('test@test.sk');
 
    // simulate $testUser being logged in
     $client->loginUser($testUser);


    $client->request('GET', '/');
    
    $this->assertEquals(200, $client->getResponse()->getStatusCode());

    $crawler = $client->request('GET', '/sk/');
    
    $this->assertEquals(200, $client->getResponse()->getStatusCode());

    $this->assertSelectorTextContains('html h2', 'Pridávanie pozorovaní ');
    
    $this->assertSelectorTextContains('html a[href*=imp]', 'Hromadne z excelu');

    $this->assertSelectorTextContains('html p', 'Prihlásený:  uzivatel1');
  } 
}

Ak som nevedel napísať presne podmienku pre assertSelectorTextContains použil som pôvodnú formu takto:

   $this->assertGreaterThan(
        0,
        $crawler->filter('html a[href*="zoology"]:contains("Cez mal")')->count()
    );

Testovanie s odlišnou sadou dát

Testovací klient napodobňuje klienta HTTP akým je www prezerač a posiela rôzne požiadavky (request) do vašej aplikácie Symfony.

$crawler = $client->request('GET', '/post/hello-world');

f Je správne v testoch mať URL natvrdo.

Viac o metóde request()

request(
    $method,
    $uri,
    array $parameters = [],
    array $files = [],
    array $server = [],
    $content = null,
    $changeHistory = true
)

Piaty argument je pole $server, tu definujeme napríklaD CONTENT-TYPE, HTTP-REFERER)

$client->request(
    'GET',
    '/post/hello-world',
    [],
    [],
    [
        'CONTENT_TYPE' => 'application/json',
        'HTTP_REFERER' => '/foo/bar',
    ]
);

Crawler-a používame, aby vyhľadal v odpovedi ($response) prvky DOM. Tiež aby vykonal klikanie na linky a vykonal submit vo formulári.

$crawler = $client->clickLink('Go elsewhere...');

$crawler = $client->submitForm('validate', ['name' => 'Fabien']);

Metódu request používame aj na napodobnenie priameho posielania alebo na vykonanie komplexnej požiadavky. Niekoľko užitočných príkladov:

// submits a form directly (but using the Crawler is easier!)
$client->request('POST', '/submit', ['name' => 'Fabien']);

// submits a raw JSON string in the request body
$client->request(
    'POST',
    '/submit',
    [],
    [],
    ['CONTENT_TYPE' => 'application/json'],
    '{"name":"Fabien"}'
);

// Form submission with a file upload
use Symfony\Component\HttpFoundation\File\UploadedFile;

$photo = new UploadedFile(
    '/path/to/photo.jpg',
    'photo.jpg',
    'image/jpeg',
    null
);
$client->request(
    'POST',
    '/submit',
    ['name' => 'Fabien'],
    ['photo' => $photo]
);

// Perform a DELETE request and pass HTTP headers
$client->request(
    'DELETE',
    '/post/12',
    [],
    [],
    ['PHP_AUTH_USER' => 'username', 'PHP_AUTH_PW' => 'pa$$word']
);


Práca s testovacím klientom $client

AJAX request

Prehliadanie stránky (Browsing)

Naučte sa viac

Užitočné zdroje