Kostra testované aplikace
Jaroslav HraničkaStále tápete, jak vytvořit základní kostru aplikace, kde je Composer vč. autoloaderu a máte i testy? Podíváme se na to, že to je velmi jednoduché.
Co budeme dělat?
Vytvoříme se primitivní kalkulačku (která umí pouze sčítat celá čísla). A k tomu si napíšeme test, jestli sčítá správně.
Povedu Vás krok po kroku. Článek je určen pro začátečníky na Windows. Předpokládám ale, že:
- máte nainstalované PHP 7 (třeba s XAMPP), Composer, nějaké IDE (třeba PhpStorm), Git a umíte to vše, alespoň trochu, použít.
Pokud s něčím budete mít problémy, podělte se v diskuzi dole pod článkem. Rádi poradíme.
První krůčky - založení projektu
Začnu od píky. A provedu Vás po bodech.
-
Spusťte si Git Bash a vytvořte adresář pro web:
cd C:\xampp\htdocs mkdir test-project cd test-project
-
Uvnitř nového adresáře inicializujte Git:
git init
-
Otevřete si adresář ve svém oblíbeném IDE.
-
Vytvořte si nový
.gitignore
soubor a zakažte verzovánívendor
(právě ten adresář si bude spravovat Composer)vendor
Jestliže zastáváte názor, že se i vendor verzuje, klidně si jej zaverzujte. V tom případě tenhle krok zkrátka ignorujte.
-
Přidejte si
composer.json
a vyžádejte si PHPUnit, abyste mohli psát testy a nastavte si autoloader tak, aby se načítaly používané třídy:{ "name": "example/test-project", "description": "Test Project", "minimum-stability": "stable", "license": "MIT", "authors": [ { "name": "author's name", "email": "email@example.com" } ], "require": { "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" }, "autoload": { "psr-4": { "App\\": "src" } } }
-
Nainstalujte si závislosti spuštěním
composer install
. -
Nakonec si vytvořte adresář
src
a v něm souborCalculator.php
. Jeho obsah bude zatím následující:<?php namespace App; class Calculator { public function sum(int $a, int $b): int { } }
-
Vše si commitněte:
git add -A git commit -m "Initial commit"
Tímto máte základní aplikaci. Zatím žádné testy. Jen naprosté minimum.
Přidáme tam testy
V projektu již máme připravený testovací framework (PHPUnit) a kostru třídy, kterou máme implementovat (Calculator). Nyní tomu přidáme testy a naimplementujme funkci.
-
Vytvořte si adresář
tests
a do něj předejte zaváděcí soubor, který zajistí autoloading. Pojmenujte jejbootstrap.php
a jeho obsah bude:<?php require_once __DIR__ . '/../vendor/autoload.php';
Do tohoto souboru můžete později přidat další kód který by Vaše testovaná aplikace vyžadovala (třeba vypnutí cache apod.).
-
V rootu aplikace si vytvořte soubor
phpunit.xml
. To je konfigurační soubor pro testovací framework. Zde nadefinujeme cestu k testům a našemu bootstrapu:<?xml version="1.0"?> <phpunit bootstrap="tests/bootstrap.php" verbose="true" > <!-- tests directories to run --> <testsuites> <testsuite> <directory suffix="Test.php">tests</directory> </testsuite> </testsuites> </phpunit>
-
Pak si vytvořte uvnitř složky
tests
souborCalculatorTest.php
. To bude právě test naší kalkulačky. Jednoduchý testovací případ může vypadat takto:<?php namespace Tests\App; use PHPUnit\Framework\TestCase; class CalculatorTest extends TestCase { public function testSum() { $calculator = new Calculator(); $this->assertSame(0, $calculator->sum(0, 0)); $this->assertSame(99, $calculator->sum(50, 49)); $this->assertSame(-99, $calculator->sum(-100, 1)); } }
Do této složky můžete psát další a další testy. Podmínkou je pouze to, aby názvy souborů končily na
Test.php
- jak jsme si nastavili v konfiguračním souboru. -
Spusťte si testy. Lze to udělat jednoduše v IDE nebo přes příkazový řádek:
php vendor/bin/phpunit
Není nutné nic více nastavovat, jelikož si PHPUnit sám načte konfiguraci definovanou uvnitř
phpunit.xml
v rootu aplikace.Testy skončí chybou, jelikož funkce ještě není naimplementována.
-
Naimplementujte kalkulačku. Soubor
src/Calculator.php
může vypadat takto:<?php namespace App; class Calculator { public function sum(int $a, int $b): int { return $a + $b; } }
Commit
A je to hotovo. Mám vytvořenou kostru aplikace, kde mám Composer a prostředí pro testy.
To je vše co jsem chtěl ukázat. Nyní byste již neměli mít problém založit nový projekt a rovnou u něj psát testy.