-
-
Notifications
You must be signed in to change notification settings - Fork 281
Tester: added new section about running Tester with Travis CI #173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,250 @@ | ||
Průběžné testování s Nette Tester | ||
******************************** | ||
|
||
/--div .[perex] | ||
Znáte to. Napsali jste testy, které teď procházejí, poplácali se po zádech a váš spánek začal být mnohem klidnější. Máte jistotu, že váš kód spolehlivě funguje. A pak se to stane. Hodiny ukazují 3:15 a do nočního ticha se zakousne nepříjemný zvuk drnčení mobilu na nočním stolku. Volá šéf. Zase to nefunguje. Zalije vás studený pot. Vždyť na to máme testy! V tu chvíli se vynoří vzpomínka na páteční odpoledne - spěcháte domů a zapomínáte spustit testy po poslední úpravě. | ||
|
||
Abyste předešli podobným zážitkům, ukážeme si, jak průběžně testovat pomocí populárního nástroje [Travis CI](https://travis-ci.org/): | ||
|
||
- nastavení testovacího prostředí | ||
- instalace závislostí pomocí Composeru | ||
- spouštění testů pomocí Nette/Tester | ||
- nastavení dalších služeb | ||
- [TL;DR |#Výsledný soubor] | ||
- integrace s GitHubem | ||
\-- | ||
|
||
Jak funguje Travis CI | ||
===================== | ||
|
||
Travis CI((Continuous Integration)) (dále jen Travis) je velmi populární služba pro automatizaci [průběžné integrace](http://cs.wikipedia.org/wiki/Průběžná_integrace). Je poskytována zdarma((Pro soukromé repozitáře je zpoplatněna.)) a nabízí automatizované spouštění testů po zápisu změny do repozitáře. Je plně integrována do prostředí GitHubu. | ||
|
||
Travis se konfiguruje souborem `.travis.yml` umístěným v kořenovém adresáři projektu. Obsahuje několik bloků, které si podrobněji popíšeme. Ani jeden z bloků není povinný. Pokud bychom ovšem vynechali `script`, Travis by se snažil spouštět testy pomocí `phpunit`. | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ještě mě nepadá, že bych tam dodal, že většina z těch bloků je nepovinná, ať to nevypadá tak složitě. |
||
Bloky jsou spouštěny v pořadí | ||
- `before_install` | ||
- `install` | ||
- `before_script` | ||
- `script` | ||
- `after_success` nebo `after_failure` | ||
- `after_script` | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Jen bych to hodil pod sebe na odrážky:
|
||
.[caution] | ||
Soubor `.travis.yml` dovoluje odsazovat pouze mezerami. Syntaktickou správnost si můžete ověřit [pomocí validátoru |http://lint.travis-ci.org/]. | ||
|
||
Pro podrobnější informace si přečtěte [oficiální dokumentaci |http://docs.travis-ci.com]. | ||
|
||
Vytvoření .travis.yml | ||
===================== | ||
|
||
Nastavení jazyka | ||
---------------- | ||
|
||
Nejprve je potřeba pomocí `language` Travis informovat, pro jaký jazyk má prostředí nastavit. Na dalších řádcích uvádíme, pro jaké verze PHP budeme chtít náš projekt otestovat. Neuvedení setinkového čísla znamená použití nejnovější dostupné verze. Testy pak budou spuštěny pro každou verzi zvlášť. Nette Tester podporuje i [HHVM](http://hhvm.com), můžeme ho tedy přidat také. | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Spuštěny
|
||
/-- | ||
language: php | ||
|
||
php: | ||
- 5.3.3 | ||
- 5.4 | ||
- 5.5 | ||
- 5.6 | ||
- hhvm | ||
\-- | ||
|
||
Proměnné prostředí | ||
------------------ | ||
|
||
V sekci `env` nastavujeme další varianty prostředí pro běh testů. Pro každou odrážku se skripty provedou samostatně a v jedné odrážce lze definovat více proměnných. Dále v textu budeme používat proměnnou `TESTER_PHP_BIN`, abychom pro HHVM mohli testy pouštět s parametrem `-p hhvm`. | ||
|
||
/-- | ||
env: | ||
- TESTER_PHP_BIN="php-cgi" | ||
- TESTER_PHP_BIN="hhvm" | ||
\-- | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Drtivá většina projektů různé verze SAPI vůbec nepotřebuje, nevím, jestli má význam to tu uvádět. Pokud ano, vynechal bych to alespoň níže v kompletní verzi konfigurace. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Dlouho jsem přemýšlel, jestli tam SAPI zmiňovat. Nenapadly mě lepší příklady, na kterých demostrovat blok EDIT: teďka koukám, že by to šlo řešit o něco lépe. Díky za připomínku :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Až teď mi došlo (opravte mě, cc @Majkl578, pokud se mýlím), že tohle rozdělení nedává vůbec smysl, protože když Travis testuje HHVM, tak hhvm binárky je simlinknutá i jako php. Aby tam byl nějaké rozdíl, tak by tam muselo být místo There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Funguje to i pokud použiješ pouze There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Tak ještě se dá env taky využít na to, že jednou nainstaluješ závislosti normálně a podruhé s There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Proč je There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Díky za osvětu :) |
||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Uvedené sekce |
||
Uvedené sekce php a env nám zajistí spuštění testů celkem 10x. Pro pět verzí PHP a dvě varianty proměnných prostředí. | ||
|
||
Instalace závislostí | ||
-------------------- | ||
|
||
.[note] | ||
Návod předpokládá, že závislosti testovaného projektu jsou spravovány pomocí nástroje Composer, a nette/tester je uveden jako závislost pro vývoj. Jak nastavit Composer najdete v kapitole [Composer |composer]. | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
...Composer a nette/tester je uveden jako závislost pro vývoj. |
||
V bloku `install` nainstalujeme pomocí Composeru závislosti našeho projektu. Každá odrážka znamená samostatný příkaz. Composer ve výchozím nastavení nainstaluje i dev závislosti. Dobrým zvykem je použít `--no-interaction`, protože Travis si s Composerem neumí povídat. Použijeme i `--prefer-source` kvůli omezenému počtu požadavků na GitHub API. | ||
|
||
Composer je již v Travisu nainstalován, ale my chceme použít nejnovější verzi, proto v bloku `before_install` provedeme jeho update. | ||
|
||
/-- | ||
before_install: | ||
- composer self-update | ||
|
||
install: | ||
- composer install --no-interaction --prefer-source | ||
\-- | ||
|
||
Matice testů | ||
------------ | ||
|
||
Na základě předchozích údajů je vytvořena testovací matice, tedy varianty prostředí, ve kterých budou testy spuštěny (v našem příkladě 10 variant). Nastavení matice je umožněno v bloku `matrix`. | ||
|
||
Chceme-li některou z variant vyřadit, využijeme blok `exclude`. Nebudeme chtít spouštět testy běžných verzí PHP s parametrem `-p hhvm` a naopak pro prostředí s HHVM nebudeme testy pouštět s binárkou `php-cgi`. | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
/-- | ||
matrix: | ||
exclude: | ||
- php: 5.3.3 | ||
env: TESTER_PHP_BIN="hhvm" | ||
|
||
- php: 5.4 | ||
env: TESTER_PHP_BIN="hhvm" | ||
|
||
- php: 5.5 | ||
env: TESTER_PHP_BIN="hhvm" | ||
|
||
- php: 5.6 | ||
env: TESTER_PHP_BIN="hhvm" | ||
|
||
- php: hhvm | ||
env: TESTER_PHP_BIN="php-cgi" | ||
\-- | ||
|
||
Aby testování bylo označeno Travisem jako úspěšné, musí testy projít ve všech prostředích. Pokud nechceme, aby výsledek některé z nich ovlivňovalo, můžeme to deklarovat v bloku `allow_failures`. V našem případě nám nebude vadit, pokud neprojdou testy na HHVM. | ||
|
||
/-- | ||
matrix: | ||
allow_failures: | ||
- php: hhvm | ||
\-- | ||
|
||
.[note] | ||
Všimněte si, že jsme uvedli pouze verzi php. Travis se zachová tak, že do celkového výsledku nezahrne všechny kombinace s verzí `hhvm`. | ||
|
||
Pokud nyní testy na HHVM selžou, ale v jiných prostředích projdou, bude i celý build označen jako procházející. | ||
|
||
Spouštění testů | ||
--------------- | ||
|
||
Testy se spouštějí v sekci `script`, kde stačí zavolat tester. Předpokládejme, že testy jsou umístěny ve složce `tests/` a používáte vlastní `php.ini` umístěné ve složce s testy. Pomocí `-s` si necháme vypsat informace o přeskočených testech. | ||
Jako binárku nastavíme v parametru `-p` hodnotu proměnné `TESTER_PHP_BIN`, kterou jsme si nastavili v bloku `env`. | ||
|
||
/-- | ||
script: | ||
- ./vendor/bin/tester -p $TESTER_PHP_BIN -s -c ./tests/php.ini ./tests | ||
\-- | ||
|
||
Když se něco pokazí | ||
------------------- | ||
|
||
Blok `after_failure` se provede, pokud testy selžou. Tester při chybné aserci ukládá aktuální obsah proměnných do souborů `*.actual`. V tomto bloku si je můžeme vypsat. | ||
|
||
/-- | ||
after_failure: | ||
# Vytiskne obsah souborů *.actual | ||
- for i in $(find ./tests -name \*.actual); do echo "--- $i"; cat $i; echo; echo; done | ||
\-- | ||
|
||
Nastavení dalších služeb | ||
------------------------ | ||
|
||
Travis nám umožňuje zapnout další služby. Například Redis server na který ukládáte cache. | ||
|
||
/-- | ||
services: | ||
- redis-server | ||
\-- | ||
|
||
Inicializace databáze: | ||
---------------------- | ||
|
||
Databáze MySQL je již předinstalována. Běží na adrese `127.0.0.1` a přihlásit se můžete na účet `travis` nebo `root` bez hesla. Pokud byste chtěli spouštět integrační testy, můžete si do ni naimportovat testovací databázi, kterou máte například v souboru `tests/testbase.sql`: | ||
|
||
/-- | ||
before_script: | ||
- mysql -u root -e 'CREATE DATABASE testbase;' | ||
- mysql -u root testbase < tests/testbase.sql | ||
\-- | ||
|
||
|
||
Výsledný soubor | ||
--------------- | ||
|
||
Celý `.travis.yml` pak vypadá takto: | ||
|
||
/-- | ||
language: php | ||
|
||
php: | ||
- 5.3.3 | ||
- 5.4 | ||
- 5.5 | ||
- 5.6 | ||
- hhvm | ||
|
||
env: | ||
- TESTER_PHP_BIN="php-cgi" | ||
- TESTER_PHP_BIN="hhvm" | ||
|
||
matrix: | ||
allow_failures: | ||
- php: hhvm | ||
|
||
exclude: | ||
- php: 5.3.3 | ||
env: TESTER_PHP_BIN="hhvm" | ||
|
||
- php: 5.4 | ||
env: TESTER_PHP_BIN="hhvm" | ||
|
||
- php: 5.5 | ||
env: TESTER_PHP_BIN="hhvm" | ||
|
||
- php: 5.6 | ||
env: TESTER_PHP_BIN="hhvm" | ||
|
||
- php: hhvm | ||
env: TESTER_PHP_BIN="php-cgi" | ||
|
||
services: | ||
- redis-server | ||
|
||
before_install: | ||
- composer self-update | ||
|
||
install: | ||
- composer install --no-interaction --prefer-source | ||
|
||
before_script: | ||
- mysql -u root -e 'CREATE DATABASE testbase;' | ||
- mysql -u root testbase < tests/testbase.sql | ||
|
||
script: | ||
- ./vendor/bin/tester -p $TESTER_PHP_BIN -c ./tests/php.ini -s ./tests/ | ||
|
||
after_failure: | ||
# Vytiskne obsah souborů *.actual | ||
- for i in $(find ./tests -name \*.actual); do echo "--- $i"; cat $i; echo; echo; done | ||
\-- | ||
|
||
Integrace s GitHubem | ||
==================== | ||
|
||
Jak již bylo zmíněno dříve, Travis je integrován do prostředí GitHubu. Aby mohly být testy spouštěny ve správný okamžik, je potřeba nastavit tzv. Webhook, který informuje Travis o změně ve vašem repozitáři. | ||
|
||
Nastavení Webhooku | ||
------------------ | ||
|
||
Nejprve je potřeba se přihlásit pomocí vašeho GitHub účtu. To provedete na [hlavní stránce |http://travis-ci.org/] pomocí odkazu `Sign in`. Po synchronizaci uvidíte repozitáře, ke kterým máte přístup, a u nich jednoduchý přepínač. Přepnutím do polohy `ON` zapnete hook. | ||
|
||
Travis nyní po každém pushnutém commitu nebo po vytvoření pull-requestu zařadí váš repozitář do testovací fronty a po chvilce čekání budou spuštěny testy. | ||
|
||
Status obrázek | ||
-------------- | ||
|
||
Můžete si dokonce nechat [vygenerovat obrázek |http://docs.travis-ci.com/user/status-images/], který informuje o stavu vašeho repozitáře. Ten pak můžete vložit například do svého readme.md. | ||
|
||
Vynechání testů u commitu | ||
------------------------- | ||
|
||
Některé commity není nutné testovat. Uveďte kdekoliv v commit message parametr `[ci skip]` a Travis bude tento commit ignorovat. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pohádka hezká, ale do dokumentace IMHO nepatří (je moc dlouhá).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Naopak!