Testujte snadněji
Testovat bychom měli všichni. To je všeobecná rada, kterou se ale drží málokdo a také často k tomu není prostor, nebo to firma nechce řešit vůbec. Nicméně v tomto článku představím čtyři možnosti, jak si testování ulehčit.
Vytvoření testů v podadresáři
Na oficiální stránkách najdete pro vytvoření testů tyto artisan příkazy:
// Create a test in the Feature directory...
php artisan make:test UserTest
// Create a test in the Unit directory...
php artisan make:test UserTest --unit
Nicméně nikde není zmíněno, jak vytvořit test v podadresáři. Jasně, jednou z možností je vytvořit ji v rootu testů a přemístit ho do podadresáře a změnit namespace. Není to ale ideální způsob - a přitom stačí toto:
php artisan make:test Admin/UserTest
Příprava dat pro všechny testy
Často potřebujeme pro všechny testy ve třídě provést nějakou akci před samotným testováním. Jde to udělat přímo v metodě, ale vzniká tak zbytečný duplikovaný kód, který v případě potřeby nechceme měnit ve všech testech. Abstraktní třída Illuminate\Foundation\Testing\TestCase
, ze které defaultně dědí všechny testovací třídy, mimo jiné obsahuje metodu setUp()
, která přesně slouží k těmto účelům.
Například mějme třídu testující něco v adminu. Jako první potřebujeme zajistit, aby byl vytvořen nový testovací uživatel a byly mu přiděleny práva. To potřebujeme provést jako první ve všech testech třídy (samotná kontrola uživatele v adminu už proběhla v jiné třídě). Abychom to nemuseli dělat ve všech metodách, využijeme právě metodu setUp()
:
class SomeAdminTest extends TestCase
{
use RefreshDatabase;
use WithFaker;
protected function setUp(): void
{
parent::setUp();
// vytvor uzivatele
// a dej mu prava do adminu
}
// another test methods
Důležité je zavolat rodičovskou metodu, která zajistí další průběh Laravel frameworku.
Faker česky
Pro naseedování dat využíváme především Faker. Abychom se co nejvíce přiblížili k realitě, tak by tomu měly odpovídat i naše neseedované data. Faker obsahuje mnoho mutací, které lze využít, včetně té české. Pokud chceme českou lokalizaci Fakeru využít jen v jedné metodě, můžeme toho dosáhnout takto:
$this->faker('cs_CZ')->postcode // ceske smerovaci cislo
V případě, že to potřebujeme pro všechny testy ve třídě:
protected function setUpFaker()
{
$this->faker = $this->makeFaker('cs_CZ');
}
Naplnění konstantních dat
Často se stává, že máme konstantní data, které slouží například jako ciferníky a nemění se. Existuje samozřejmě mnoho možností jak toho dosáhnout, ale já si oblíbil využít traity. To hlavně z toho důvodu, že můžu konstanty využít pouze tam, kde to opravdu potřebuji. Stačí si tedy vytvořit nový trait a naplnit ho daty:
trait DataTrait
{
protected function createSomeData(): void
{
SomeModel::insert([
[
'name' => 'John',
'surname' => 'Doe'
],
[
'name' => 'Luigina',
'surname' => 'Lollobrigida'
]
]);
}
}
A jednoduše ho použít v testovací třídě a pokud bychom to potřebuji pro všechny metody, tak jen v metodě setUp()
zavolat metodu traitu createSomeData()
.
Mám někde chybu, není něco jasné nebo máte další způsoby, které vám testování ulehčuje? Pak stačí napsat do komentářů.