Paczka dla Laravela - Unit Test Maker
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 (?) :)