Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cs/@docmenu.texy
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
- [Zpracování obrázků |images]
- [Cache |caching]
- [Lokalizace |localization]
- [Testování |testing]
- [Testování |testing], [Průběžná integrace |testing-with-travis]
- [Stránkování |pagination]
- [Auto-loading tříd |auto-loading]
- [Vyhledávání souborů a adresářů |finder]
Expand Down
250 changes: 250 additions & 0 deletions cs/testing-with-travis.texy
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ě.
Copy link
Contributor

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á).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Naopak!


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`.

Copy link
Member

Choose a reason for hiding this comment

The 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`

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jen bych to hodil pod sebe na odrážky:

  • before_install
  • ...
  • script (jediný povinný blok)
  • ...
  • after_success a after_failure
  • ...

.[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é.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spuštěny

Protože

/--
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"
\--
Copy link
Contributor

Choose a reason for hiding this comment

The 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.

Copy link
Contributor Author

Choose a reason for hiding this comment

The 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 env a hhvm nefunguje, pokud SAPI nenastavíme na php.

EDIT: teďka koukám, že by to šlo řešit o něco lépe. Díky za připomínku :)

Copy link
Contributor

Choose a reason for hiding this comment

The 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 php php-cgi, které není při běhu HHVM dostupné.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Funguje to i pokud použiješ pouze php, ale jak jsem psal výše, nenapadla mě lepší možnost na čem demonstrovat env. Nicméně bych mohl zmínit, že to jde i jinak.

Copy link
Contributor

Choose a reason for hiding this comment

The 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 --prefer-lowest. Nicméně pokud tam dáš místo TESTER_PHP_BIN="php" radši TESTER_PHP_BIN="php-cgi", tak by to mělo stačit.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Proč je php-cgi lepší možnost než php?
Mimochodem php-cgi na Travisu nefunguje ani pro PHP 5.3.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Protože tam pak bude rozdíl v tom, jestli používáš env nebo ne.
  2. Protože normálně ti webové aplikace taky neběží pod CLI. Není dobré, abys testoval přes jiné SAPI, než přes které aplikaci normálně provozuješ. Nebo tak něco, @dg bude vědět.
  3. Ano, je potřeba použít PHP 5.3.3.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Díky za osvětu :)
Zbytek opraven


Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uvedené sekce php a env nám zajistí spuštění testů celkem 10x. Pro pět verzí PHP a dvě varianty proměnné TESTER_PHP_BIN.

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].

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a v kořenovém adresáři obsahuje composer.json - asi smazat. To je princip Composeru a my ten soubor nikde v návodu nezmiňujeme.

...Composer a nette/tester je uveden jako závislost pro vývoj.
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.

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`.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pro každý projekt je Na základě předchozích údajů je vytvořena matice, tedy varianty prostředí, ve kterých budou testy spuštěny (v našem příkladě 10 variant). Chceme-li některou variantu vyřadit, využijeme blok ...

/--
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.
2 changes: 1 addition & 1 deletion en/@docmenu.texy
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
- [Image Manipulation |images]
- [Caching]
- [Localization]
- [Testing]
- [Testing], [Continuous integration |testing-with-travis]
- [Pagination]
- [Auto-loading]
- [Browsing files on disk |finder]
Expand Down
Loading