Jak na akceptační testovaní pomocí Codeception
Matěj RačinskýJak automaticky testovat celé stránky a simulovat chování uživatele na webu pomocí Codeception
Co je to Codeception a proč jej používat?
Codeception je PHP knihovna umožňující testovat webové aplikace přímo v prohlížeči. Testuje tak z pohledu uživatele, jestli funguje celý web, jak backend, tak frontend, neomezuje se jen na testování jednotlivých tříd. Díky Codeception můžete snadno a rychle proklikat velkou část webu a otestovat celé uživatelské scénáře (například registraci, přihlášení, objednávku v eshopu apod.).
Dokumentace Codeception je k přečtení zde.
Codeception má v sobě několik knihoven, které jde pro testy používat.
-
Buď můžete na testování stránek používat PhpBrowser, který umožňuje proklikávat stránky a vyplňovat formuláře, ale neumožní spouštění javascriptu.
-
Pokud chcete plnohodnotný prohlížeč, Codeception nám umožňuje testovat v reálném prohlížeči pomocí Selenium Webdriveru. Na jeho zprovoznění budeme potřebovat Selenium Server, jehož instalaci popisuji v dalším kroku. Jeho výhoda je mimo jiné v tom, že při selhání testu udělá printscreen a uloží html kód stránky, na které test selhal.
Jak začít, co potřebuji?
Nejdříve si k projektu nainstalujeme přes composer Codeception:
composer require codeception/codeception --dev
Instalujeme Selenium
A nyní si stáhneme a zprovozníme Selenium Server.
- Nejdříve musíme mít nainstalovanou Javu.
- Stáhnout Selenium Server lze na této stránce v sekci "Selenium Standalone Server". Přímý link na stažení je zde.
- Stažený
.jar
soubor umístíme kamkoli, kde na něj nezapomeneme. - Selenium WebDriver umožňuje používat různé prohlížece, my nyní budeme používat google chrome.
- Stahneme si chromedriver zde.
- Stahneme si archiv pro náš konkrétní počítač.
- Archiv extrahujeme na stejné místo, kde máme Selenium Server.
- Vytvoříme si soubor
selenium.sh
s obsahem
java -jar -Dwebdriver.chrome.driver=chromedriver selenium-server-standalone-3.0.1.jar
- přidáme jej do PATH, abychom jej měli odkudkoli snadno dostupný.
Pokud používáme Windows, vytvoříme místo toho analogicky selenium.bat
s obsahem
java -jar -Dwebdriver.chrome.driver=chromedriver.exe selenium-server-standalone-3.0.1.jar
Tento soubor spustíme. Nyní by měl nastartovat Selenium Server.
Všechno v Codeceptionu se řídí přes CLI. Od inicializace, přes vytváření testů (generování kódu pro skelet testů), až po spouštění.
Nejdříve Codeception inicializujeme:
codecept bootstrap
Pokud systém nenašel příkaz codecept, pak použijeme variantu s cestou (předpokládám, že jsme v rootu našeho projektu)
-
pro Linux:
vendor/bin/codecept bootstrap
-
pro Windows:
vendor\bin\codecept bootstrap
Tohle ve složce tests
vytvoří složky pro různé druhy testů a konfigurační soubory se základním nastavením.
První test
Pro ukázku budeme testovat různé stránky na serveru seznam.cz. Díky tomu vidíme, že narozdíl od unit testů není na akceptační testování zapotřebí mít přístup ke zdrojákům, stačí běžící aplikace.
Nyní si nakonfigurujeme Codeception, aby používal URL adresu aplikace, kterou chceme testovat, a aby používal Selenium
jako prohlížeč. To uděláme tak, že upravíme soubor acceptance.suite.yml
a jeho obsah upravíme na
# acceptance.suite.yml
class_name: AcceptanceTester
modules:
enabled:
- WebDriver:
url: https://www.seznam.cz
browser: chrome
- \Helper\Acceptance
Pokud chceme testovat naši vlastní aplikaci, použijeme stejnou adresu, jako používáme při ručném proklikávání.
Řádek, kde je - WebDriver:
říká, jaký prohlížeč chceme použít. Základní je PhpBrowser, ten sice neumožní testovat
javascript, ale zato je o poznání rychlejší.
Nyní máme všechno připravené a můžeme se pustit do prvního testu.
Takže první test si vytvoříme:
codecept generate:cept acceptance Homepage
a jako u inicializace, pokud nemáme soubor codecept v cestě, použijeme variantu
vendor/bin/codecept generate:cept acceptance Homepage
(a jako výše, pro Windows se zpětnými lomítky)
Tento příkaz nám vytvořil soubor tests\acceptance\HomepageCept.php
Otevřeme si ho a rovnou můžeme psát jednotlivé testy. Otestujeme načtení hlavní stránky a
zda obsahuje všechny důležité prvky.
Testujeme tedy homepage seznam.cz.
Testovat přítomnost prvků můžeme jak testováním, zda je na stránce nějaký text, tak CSS selectory nebo XPath selectory.
// tests/acceptance/HomepageCept.php
$I = new AcceptanceTester($scenario);
$I->wantTo('Test homepage'); //nic nevykonává, ale slouží pro nás. Když test neprojde, vypíše se mimo jiné tento string
$I->amOnPage('/'); //kontrola, že jsem na homepage
$I->seeElement("form input[id=\"fulltext-field\"]"); //testuji, zda vidím vyhledávací okno
$I->seeElement("span.gadget__calendar"); //kontrola, že se vypisuje den
$I->seeElement("div.gadget--novinky"); //je zobrazený rámeček s novinkami
$I->see("Novinky", "div.gadget--novinky"); //a v rámečku je napsán text "Novinky"
Test spustíme následovně:
codecept run
Také můžeme pouštět pouze konkrétní testovací soubory:
codecept run acceptance HomepageCept
Formuláře a přechod na jiné stránky
Nyní si zkusíme otestovat vyhledávání a pár prokliků z něj.
// tests/acceptance/HomepageCept.php
$I = new AcceptanceTester($scenario);
$I->amOnPage('/');
$I->fillField("form input[id=\"fulltext-field\"]", "php"); //do vyhledávacího políčka se zadá php
$I->click("form button.button--submit");
$I->waitForElement("div.searchpage", 3); //počkáme, než se stránka s výsledky načte, ale max. 3 sekundy
$I->seeNumberOfElements("div.results > div", 13); //13 výsledků yhledávání
$I->see("1 filipínské peso", "div.results > div"); //ve výsledcích je kurz filipínského pesa
$I->click("#navGoods"); //překliknu na záložku zboží
$I->waitForElement("main header", 3); //počkám na načtení
$I->see("Informatika a výpočetní technika", "main header > h1"); //zjistím, že php spadá pod výpočetní techniku
$I->click("Zobrazit podrobnosti", "main article"); //prokliknu se na detail prvního zboží
$I->seeInCurrentUrl("vyrobek/php-nejen-pro-zacatecniky-cd"); //zkontroluji slug v url
Přehled všech použitelných metod je dostupný v dokumentaci Codeceptionu
Cest třídy a OOP psaní testů
Pokud nechceme jen procedurální testy, ale chceme je lépe členit, je možné psát testy i objektově, pomocí Cest tříd. Ty vygenerujeme takto
codecept generate:cest acceptance Homepage
a vidíme, že máme vytvořenou třídu HomepageCest
v souboru tests/acceptance/HomepageCest.php
.
Testy můžeme psát do jakýchkoli public metod, kromě metod začínajících podrtžítkem. Ty mají specifický význam:
- metoda
_before
je zavolána před každým testem - metoda
_after
je zavolána po každém testu - v cest testech je navíc metoda
_failed
, která se zavolá těsně poté, co nějaký test neprojde