Přeskočit obsah
V
Pro vývojáře
Architektura, konvence, jádro systému a bezpečnost
Pro vývojáře / Testy a nástroje

Testy a nástroje#

Čím se v tomhle projektu ověřuje, že něco funguje — a čím se to ověřit nedá.

Testy#

tests/314 souborů (find tests -name "*.php" | wc -l):

Sada Souborů Co obsahuje
Unit/ 75 jednotkové — Security/, Hydrators/, Filters/, Routers/, Cache/, Core/, UI/, Utils/
Integration/ 15 průchod víc vrstvami
Manual/ 200 ruční scénáře a harnessy pro CLI
Fixtures/, Support/ 23 data a pomocné třídy
composer test        # jen Unit
composer test-all    # vše

Strukturální testy#

Zvláštní kategorie: testy, které čtou zdrojáky a hlídají, že se na něco nezapomnělo. Zapomenutý guard v jedné nové metodě totiž nic neshodí — díra tam prostě zůstane.

Test Co hlídá
ApiPermissionCoverageTest že guard oprávnění je v každé get*Data()
PermissionResolverTest že v SQL resolveru nejsou skupiny oprávnění
FieldAccessCoverageTest že pole s podezřelým jménem je anotované, nebo má výjimku s důvodem
ConditionallyUpdatableContractTest že pojmenovaná kontrolní metoda existuje
ExternalReadonlyCoverageTest že server-počítaná pole nejdou zapsat zvenčí

Tautologický guard nedokazuje nic

Kontrola porovnávající hodnotu samu se sebou projde vždycky. Každý guard ověř protipříkladem — tedy tím, že ukážeš, kdy neprojde.

Seed ve fixture bývá známka chybějícího kódu

Musí-li test data doplnit ručně, aby prošel, obvykle to znamená, že je nedoplňuje aplikace. Než seed přidáš, ověř, jestli nemají vzniknout v kódu.

Co testy nezachytí#

Tohle je nejdůležitější oddíl celé kapitoly.

Chyba Proč projde Čím se chytí
formulář nejde odeslat (mixed v onSuccess) build formuláře i Api endpoint pod ním projdou POST nebo živý proklik
setValidationScope([]) vyprázdní hodnoty testy jdou přes Api s ručním payloadem živý proklik
CLI harness bez tokenu vrací prázdno vrátí prázdno bez chyby zkontrolovat, že data opravdu přišla
nepřekreslený snippet s chybovou hláškou selhání je němé proklik prohlížečem

Živý proklik odhalí to, co harness nemůže

CLI běh obchází vrstvy, které se v prohlížeči uplatní — formuláře, snippety, signály, JavaScript. Než něco prohlásíš za hotové, proklikej to.

Harness v CLI potřebuje interní token

Bez něj běží jako guest, dostane Permission denied uvnitř mostu a vrátí prázdno bez chyby. Test nad tím projde zeleně a netestuje nic. Řešení: ApiBridge::setInternalAuthToken($jwtManager->generateToken(…)) — podrobně Volání API.

Shodné skóre z Elasticsearch není důkaz pořadí

Když mají dokumenty stejné skóre, pořadí určuje interní pořadí indexu — a to se může změnit bez zásahu do kódu. Test nad takovým seznamem dokazuje jen to, že hledání něco vrátilo.

PHPStan#

phpstan.neon, úroveň 9, k tomu 23 baseline souborů (ls phpstan-baseline*.neon).

Mrtvá cesta v baseline zabrání spuštění ÚPLNĚ

PHPStan skončí chybou a analýza vůbec neproběhne — a protože výstup nevypadá jako nález, snadno se to splete s „prošlo to“. Po přejmenování nebo smazání souboru projdi baseline.

Holé číslo chyb kolísá i bez změny kódu

Naměřeno 5795–5857 mezi běhy. Rozdíly přijímej podle seznamu nálezů, ne podle čísla — jinak budeš honit šum.

Pre-commit hook#

.githooks/pre-commit (aktivace: git config core.hooksPath .githooks) blokuje tři věci:

  1. ladicí volání v PHPbdump(, dumpe(, dd( v přidaných řádcích,
  2. :root v komponentním SCSS — tokeny patří na selektor komponenty, ne do globálu (allowlist má výjimky pro token vrstvy),
  3. porušení ráčny vrstev Manager → Service → Mapper → Repository.

--no-verify obchází všechny tři

Je to určené pro výjimky, ne pro spěch. Co projde přes --no-verify, přijde na řadu při code review — nebo za měsíc v produkci.

Sestavení assetů#

npm run build:admin        # JS i CSS administrace
npm run build:admin:css
npm run build:admin:js
npm run watch:admin:css

Front téma se sestavuje ze své složky — viz Témata frontendu.

npx sass je jiná verze překladače než sass

Vyrobí jiný výstup. Používej příkazy z package.json.

Skills#

skills/19 postupů. Nejsou to doporučení, je to závazný popis, jak se v tomhle projektu dělá konkrétní věc.

Skupina Pro co
code-standard/ konvence po vrstvách (PHP, model, presenter, komponenta, formuláře, signály, Latte, Core)
cs-admin-* administrace — grid, formulář, picker, audit formuláře
cs-template-* šablony a témata
cs-translations překlady
cs-scss-structure SCSS
cs-module-refactoring, cs-payment-gateway, cs-ui-audit ucelené postupy

Před úkolem otevři příslušný skill — ne všechny

Každý cs-conv-* si o své závislosti řekne sám. Přehled je v Konvence kódu.

🔴 Produkce a vývoj sdílejí databázi#

Každý zápis je ostrý

Neexistuje „nejdřív to zkusím na vývojovém“. Experimenty dělej v transakci s návratem zpět, a než něco hromadně přepíšeš, spočítej si, kolika řádků se to týká.

Soubory jsou naopak po strojích rozdělené

Databáze je sdílená, ale vygenerované soubory (PDF, obrázky, feedy) ne. Chybějící PDF na vývojovém stroji proto nemusí znamenat chybu generátoru — může jen ležet jinde.

Redis a soubory se mezi lokálem a dev serverem nesdílejí

Vyprázdnění cache lokálně neznamená vyprázdněnou cache na dev serveru. Ověřovat se musí tam, kde to má fungovat.

Kam sáhnout#

Chci Kde
jednotkové testy tests/Unit/
ruční harnessy tests/Manual/
konfiguraci statické analýzy phpstan.neon + phpstan-baseline*.neon
pre-commit kontroly .githooks/pre-commit
příkazy sestavení package.json, composer.json
závazné postupy skills/

Navazující kapitoly: Konvence kódu · Checklist nasazení · Volání API · RBAC v API