Każdy testy pisze - a przynajmniej powinien :) Przestawiam paczkę do umilenia sobie tego procesu w frameworku Laravel.

 

Samo pisanie testów jest dosyć mozolnym i zdecydowanie mniej lubianym zajęciem.. Zwłaszcza jak się je tworzy masowo pod sam koniec tworzenia aplikacji. Niestety nie zawsze jest na to czas, a metodyka TDD nie jest powszechnym podejściem w większości firm na naszym rodzimym rynku. Niestety - pomijając także fakt, że często można usłyszeć, że 'klient nie płaci za testy'...

 

Ale kiedy już możemy, to powinniśmy. Znajdzie się parę solidnych 'ZA' aby to robić - jak chociażby:

  • Im większe pokrycie kodu w testy, tym solidniejsza aplikacja - alegorycznie: czy byłby ktoś skłonny kupić samochód bez papierów? Odnosząc się do dokumentacji (wiem, wiem, zdarza się) - a tym bardziej bez testów ? To także wartość dla biznesu - podnosi wartość samej aplikacji, jej jakość.
  • Testy - zwłaszcza, jak są dobrze napisane - są także formą dokumentacji kodu. Dają także programiście - nie tylko nowemu w projekcie - pewnie poczucie bezpieczeństwa i komfortu, jak wprowadza zmiany.
  • Pisząc testy zdarza się wprowadzać drobne, a co najważniejsze: dobre zmiany - oczywiście w podejściu TDD jest to ostatni etap. Jednak same są też wartością i pomocą przy większych refraktorach samej aplikacji.

 

Ale wracając do stricte tematu tego artykułu - kod paczki jest dostępny u mnie na gitlab'ie oraz na packagist. Proces samej instalacji jest dość banalny i widoczny w ReadME ;) Ściągamy composerem, publikujemy service provider, zmieniamy wedle potrzeb config oraz template i gotowe!

 

Przedstawię za to przykład użycia - na bazie projektu KosmCODE Core oraz klasy service'u TagService.

 

Po poprawnej instalacji wystarczy wywołać komendę z namespace danego servicu, dla którego chcemy utworzyć szablon testu jednostkowego

$ php artisan make:unit-test-template App\\Services\\TagService

 

Która to generuje nam taki plik testu:

<?php

namespace Tests\Unit\app\Services;

use App\Repositories\TagRepositoryInterface;
use App\Services\TagService;
use Illuminate\Cache\Repository;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\TestCase;

class TagServiceTest extends TestCase
{
    private MockObject $laravelCacheMock;
    private MockObject $tagRepositoryMock;

    protected function setUp(): void
    {
        $this->laravelCacheMock = $this->createMock(Repository::class);
        $this->tagRepositoryMock = $this->createMock(TagRepositoryInterface::class);

        parent::setUp();
    }

    public function testGetForFilters(): void
    {
        $this->markTestIncomplete('ToDo');

        // $tagServiceMock = $this->getTagServiceMock();
        // $result = $tagServiceMock->getForFilters();
    }

    public function testForgetByKeyEnum(): void
    {
        $this->markTestIncomplete('ToDo');

        // $tagServiceMock = $this->getTagServiceMock();
        // $result = $tagServiceMock->forgetByKeyEnum();
    }

    public function testForgetByKey(): void
    {
        $this->markTestIncomplete('ToDo');

        // $tagServiceMock = $this->getTagServiceMock();
        // $result = $tagServiceMock->forgetByKey();
    }

    private function getTagServiceMock(): TagService
    {
        return new TagService(
            $this->laravelCacheMock,
            $this->tagRepositoryMock,
        );
    }
}

 

Dostajemy w mig szablon z mockerami z DI samej klasy oraz metodami publicznymi w tejże - teraz wystarczy, tak wygenerowany test jedynie odpowiednio 'pokolorować' :) Odpada nam mozolna praca związana z tworzeniem samej struktury testu - a to, jak się robi kolejny za kolejnym potrafi mocno zmęczyć ;)

 

Dziękuje za uwagę i mam nadzieje, że rychłego przeczytania (?) :)