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ářů.