Manual:PHP unit testing/Writing unit tests/cs



Obecná rada
Příručka PHPUnit poskytuje pokyny pro pochopení a vývoj testování jednotek. Zvláštní pozornost věnujte sekcím o testech psaní a organizování.



Vývoj osvědčených postupů
Vývojáři noví v testování jednotek v MediaWiki by měli jako výchozí bod použít – obsahuje užitečné komentáře, které usnadní proces učení se jak psát testy jednotek.

Dalším zdrojem jsou slidy z přednášky PHPUnit Best Practices (Doporučené postupy PHPUnit), kterou Sebastian Bergmann přednesl na OSCON 2010.

Vývojáři by se měli vyvarovat vymýšlení nových konvencí nebo vypůjčování konvencí z jiných rámců. Použití již dobře zavedených konvencí PHPUnit poslouží k tomu, aby byly testy MediaWiki užitečné a použitelné.

Jednotkové testy by se měly řídit A Set of Unit Testing Rules (Sada pravidel testování jednotek) od Michaela Featherse.



Napište testovací kód
MediaWiki nebyla napsána s cílem být testovatelná. Všude používá globální proměnné a na mnoha místech statické metody. Toto je dědictví, které musíme přijmout, ale snažte se tyto věci nezavádět do nového kódu a zkuste to v budoucnu změnit.

Dobrým zdrojem může být Guide to Testability Miška Heveryho. (Miško Hevery je [jeden z?] agilních trenérů Google.)



Testovací konvence
Název souboru musí končit. Jako výchozí bod použijte.



setUp a tearDown

 * Musí být  funkcí.
 * tearDown by měl být v opačném pořadí než setUp.
 * setUp začíná voláním svého rodiče.
 * tearDown končí voláním svého rodiče.



Rozhodovací funkce

 * Musí být  funkcí.
 * Název funkce by měl být v lowerCamelCase a začínat slovem . Např..
 * Kdykoli je to možné, odkazujte na nejdůležitější testovací metodu. Např. je testován v.



Poskytovatelé dat

 * Musí být  funkcí.
 * Název poskytovatele dat by měl být uveden v nižšímCamelCase a začínat slovem . Např..
 * Neměli byste vytvářet instanci služeb MediaWiki, protože poskytovatelé dat jsou voláni přes . Například místo  použijte , abyste se vyhnuli vytvoření.



Sdělení
Výstup testu by měl sdělit závěr. Výstupní formát  je dobrý způsob, jak si toto sdělení prohlédnout: Provedení testovací sady se zobrazí jako sada prohlášení o testovacích třídách spolu s tím, zda prošly nebo ne. Příkazy (pokud nejsou přizpůsobeny) jsou názvy testovacích metod s opravenými velkými písmeny a mezerami.

Anotace  lze použít k přizpůsobení zobrazené zprávy. V současné době se v kódové základně MediaWiki nepoužívá.

Další informace viz "Další použití pro testy".



Počet tvrzení
Pouze jedno tvrzení na test, pokud k tomu není dobrý důvod (možná bude nutné seskupit cenné testy).

Selhání
Obvykle by testovací kód neměl dělat, ale použijte metodu selhání phpunit:

To by se projevilo jako selhání v souhrnu testování, než aby se celá sada testů zhroutila.



Specifické pro MediaWiki


Testy seskupení
PHPUnit umožňuje zařadit testy do libovolných skupin. Skupiny testů lze vybrat pro provedení nebo je vyloučit z provádění při spuštění testovací sady (viz dokumentace @group annotation, The Command-Line Test Runner a XML Configuration File v dokumentaci PHPUnit příručce pro další podrobnosti.)

Chcete-li přidat test (nebo třídu) do skupiny, použijte anotaci  v docblock před kódem. Například:

V testech jednotek MediaWiki se v současnosti používá několik funkčních skupin:


 * API - testy, které provádějí MediaWiki API.
 * Broken - rozbité testy zařaďte do skupiny Broken (rozbité). testy z této skupiny nebudou spuštěny (jak je nakonfigurováno v ).
 * Database - testy, které vyžadují připojení k databázi, by měly být umístěny do skupiny Database.


 * Destructive - testy, které mění nebo ničí data, by měly být zařazeny do skupiny Destructive (destruktivní).
 * Search - testy, které používají vestavěné vyhledávání MediaWiki, se vkládají do skupiny Search (vyhledávání).
 * SeleniumFramework - testy, které vyžadují instalaci SeleniumFramework, by měly být zařazeny do skupiny SeleniumFramework.
 * Stub - testovací útržky vložte do skupiny Stub (útržky). Testy z této skupiny nebudou spuštěny (jak je nakonfigurováno v ).
 * Sqlite - testy, které používají SQLite, by měly být vloženy do skupiny Sqlite.
 * Standalone - velmi pomalé testy, které by neměly být spouštěny v gate, aby pomohly udržet rychlé testy pro jiná gated rozšíření.
 * Upload - testy, které nahrávají soubory, by měly být umístěny do skupiny Upload.
 * Utility - momentálně nevyužito žádným testem. Testy v této skupině nebudou spuštěny (jak je nakonfigurováno v ).

Kromě toho mohou být testy seskupeny na základě rozhodnutí vývojového týmu:


 * Fundraising (získávání finančních prostředků)
 * EditorEngagement (zapojení editora)
 * Internationalization (internacionalizace)
 * atd.

Chcete-li otestovat pouze určitou skupinu, použijte příznak  v příkazového řádku:

composer phpunit:entrypoint -- --group Search

nebo pokud používáte Makefile v core/tests/phpunit:

make FLAGS="--group Search" target

kde cíl může být phpunit, safe atd.

Pokrytí
PHPUnit dokumentace obsahuje kapitolu o pokrytí. Dvakrát denně se generuje [přehled pokrytí https://doc.wikimedia.org/cover/mediawiki-core/ pro jádro MediaWiki]. Protože by měla platit možnost forceCoversAnnotation, test by měl být označen @covers annotations, aby se vyjádřilo, které části kódu test skutečně kontroluje (na rozdíl od kódu, který je právě spuštěn, ale jehož výsledky nejsou nikdy testováno pomocí tvrzení).

Všimněte si, že  vyžaduje plně kvalifikované názvy tříd (na rozdíl od anotací, jako je  ).

Třídy
Budete chtít rozšířit jednu z testovacích tříd MediaWiki.

Níže jsou uvedeny některé běžné testovací třídy MediaWiki, které lze rozšířit. Odrážkový seznam na nižší úrovni prodlužuje jeho rodiče.


 * - testovací třída PHPUnit
 * - pro unit testy skutečných funkcí, které nemají žádné závislosti. Ty se obvykle vkládají do vlastní podsložky s názvem
 * - pomáhá s testováním tříd, které přistupují ke globálním proměnným, metodám, službám nebo backendu úložiště. Zabraňuje odesílání skutečných e-mailů. Někdy v podsložce s názvem . Můžete bezpečně otestovat databázi SQL, pokud k testům přidáte.
 * - provede nějaké nastavení jazyka, například  a , a provede  3
 * - má některé další metody, jako je,  ,   atd.
 * - pro testování tříd údržby MediaWiki.

Databáze
Při testování kódu závislého na databázi byste měli svůj testovací případ umístit do skupiny Database (viz nahoře). To říká MediaWikiTestCase, aby nastavilo připojení k databázi, které můžete použít v. Normálně používá samostatnou dočasnou databázi s určitými omezenými údaji předem vyplněnými, včetně uživatele 'UTSysop' a názvu 'UTPage'. (Dočasná databáze je vytvořena s  a tabulky mají předponu  .) Testovací případ může do databáze přidat další data přepsáním  (což ve výchozím nastavení nic nedělá).

Pokud chcete použít jinou DB tabulku (řekněme pro vaše rozšíření), není ve výchozím nastavení k testování. Chcete-li přidat tabulku do dočasné databáze vytvořené během testování, musíte ji přidat do, například:

Upozorňujeme však, že z vaší skutečné databáze se zkopíruje pouze schéma tabulky, nikoli existující data v této tabulce.

Aktuální obsah databáze můžete přímo otestovat pomocí.

Zde je několik příkladů z rozšíření, na která se můžete podívat pro referenci:


 * - od
 * - od

Testy, které nejsou ve skupině Database, stále běží proti dočasné klonované databázi (i když ignorují a místo toho přímo používají např. ). Tato databáze je však nastavena pouze jednou pro celý testovací běh a mezi testovacími běhy se neresetuje. Testy by se pokud možno neměly spoléhat na tento bezpečnostní prvek.



Údržbářské skripty
Testovací případy pro by měly dědit z, aby zvládly různé výstupní kanály používané údržbovými skripty.

Metoda základního testovacího případu za vás vytvoří instanci vašeho objektu , pokud zadáte třídu, kterou chcete sestavit, poskytnutím povinných  ve vaší podtřídě:

V nepravděpodobném případě, že chcete udělat něco speciálního pro vytvoření instance testované třídy, můžete přepsat metodu, ale doufejme, že to není potřeba.

Ve výchozím nastavení bude výstup skriptu údržby potlačen a ignorován. Pokud chcete otestovat výstup (to je dobrý nápad), použijte kód jako: