SyMfonAK - vyvíjame databázy pomocou frameworku Symfony
Testovanie
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.
Obsah
[skryť]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'] );