Laravel został zbudowany z myślą o testowaniu. W rzeczywistości, wsparcie dla testowania z Pest i PHPUnit jest dołączone od razu, a plik phpunit.xml jest już skonfigurowany dla Twojej aplikacji. Framework zawiera również wygodne metody pomocnicze, które pozwalają na ekspresyjne testowanie Twoich aplikacji.
Domyślnie katalog tests Twojej aplikacji zawiera dwa katalogi: Feature i Unit. Testy jednostkowe to testy, które skupiają się na bardzo małej, izolowanej części Twojego kodu. W rzeczywistości, większość testów jednostkowych prawdopodobnie skupia się na pojedynczej metodzie. Testy w katalogu "Unit" nie uruchamiają Twojej aplikacji Laravel i dlatego nie mają dostępu do bazy danych aplikacji ani innych usług frameworka.
Testy funkcjonalne mogą testować większą część Twojego kodu, w tym jak kilka obiektów współdziała ze sobą lub nawet pełne żądanie HTTP do endpointu JSON. Generalnie, większość Twoich testów powinna być testami funkcjonalnymi. Te typy testów zapewniają największą pewność, że Twój system jako całość działa zgodnie z zamierzeniami.
Plik ExampleTest.php jest dostarczony zarówno w katalogach testowych Feature, jak i Unit. Po zainstalowaniu nowej aplikacji Laravel, wykonaj polecenia vendor/bin/pest, vendor/bin/phpunit lub php artisan test, aby uruchomić swoje testy.
Podczas uruchamiania testów, Laravel automatycznie ustawi środowisko konfiguracji na testing ze względu na zmienne środowiskowe zdefiniowane w pliku phpunit.xml. Laravel również automatycznie konfiguruje sesję i cache na sterownik array, dzięki czemu żadne dane sesji ani cache nie będą zachowywane podczas testowania.
Możesz swobodnie definiować inne wartości konfiguracji środowiska testowego, jeśli to konieczne. Zmienne środowiskowe testing mogą być skonfigurowane w pliku phpunit.xml Twojej aplikacji, ale upewnij się, że wyczyścisz cache konfiguracji używając polecenia Artisan config:clear przed uruchomieniem testów!
Dodatkowo możesz utworzyć plik .env.testing w katalogu głównym Twojego projektu. Ten plik będzie używany zamiast pliku .env podczas uruchamiania testów Pest i PHPUnit lub wykonywania poleceń Artisan z opcją --env=testing.
Aby utworzyć nowy przypadek testowy, użyj polecenia Artisan make:test. Domyślnie testy zostaną umieszczone w katalogu tests/Feature:
php artisan make:test UserTestJeśli chcesz utworzyć test w katalogu tests/Unit, możesz użyć opcji --unit podczas wykonywania polecenia make:test:
php artisan make:test UserTest --unitNote
Szablony testów mogą być dostosowane za pomocą publikowania szablonów.
Po wygenerowaniu testu możesz zdefiniować test tak, jak normalnie robisz to za pomocą Pest lub PHPUnit. Aby uruchomić testy, wykonaj polecenie vendor/bin/pest, vendor/bin/phpunit lub php artisan test z terminala:
<?php
test('basic', function () {
expect(true)->toBeTrue();
});<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*/
public function test_basic_test(): void
{
$this->assertTrue(true);
}
}Warning
Jeśli definiujesz własne metody setUp / tearDown w klasie testowej, upewnij się, że wywołujesz odpowiednie metody parent::setUp() / parent::tearDown() w klasie nadrzędnej. Zazwyczaj powinieneś wywołać parent::setUp() na początku własnej metody setUp, a parent::tearDown() na końcu swojej metody tearDown.
Jak wspomniano wcześniej, po napisaniu testów możesz je uruchomić za pomocą pest lub phpunit:
./vendor/bin/pest./vendor/bin/phpunitOprócz poleceń pest lub phpunit, możesz użyć polecenia Artisan test do uruchamiania testów. Runner testów Artisan zapewnia szczegółowe raporty testów, aby ułatwić rozwój i debugowanie:
php artisan testWszystkie argumenty, które mogą być przekazane do poleceń pest lub phpunit, mogą być również przekazane do polecenia Artisan test:
php artisan test --testsuite=Feature --stop-on-failureDomyślnie Laravel i Pest / PHPUnit wykonują testy sekwencyjnie w pojedynczym procesie. Możesz jednak znacznie skrócić czas potrzebny na uruchomienie testów, uruchamiając testy jednocześnie w wielu procesach. Aby rozpocząć, zainstaluj pakiet Composer brianium/paratest jako zależność "dev". Następnie dołącz opcję --parallel podczas wykonywania polecenia Artisan test:
composer require brianium/paratest --dev
php artisan test --parallelDomyślnie Laravel utworzy tyle procesów, ile jest dostępnych rdzeni CPU na Twoim komputerze. Możesz jednak dostosować liczbę procesów używając opcji --processes:
php artisan test --parallel --processes=4Warning
Podczas uruchamiania testów równolegle, niektóre opcje Pest / PHPUnit (takie jak --do-not-cache-result) mogą być niedostępne.
O ile masz skonfigurowane główne połączenie z bazą danych, Laravel automatycznie obsługuje tworzenie i migrację bazy danych testowej dla każdego równoległego procesu, który uruchamia Twoje testy. Bazy danych testowe będą miały sufiks z tokenem procesu, który jest unikalny dla każdego procesu. Na przykład, jeśli masz dwa równoległe procesy testowe, Laravel utworzy i użyje baz danych testowych your_db_test_1 i your_db_test_2.
Domyślnie bazy danych testowe utrzymują się między wywołaniami polecenia Artisan test, aby mogły być ponownie użyte przez kolejne wywołania test. Możesz jednak je odtworzyć używając opcji --recreate-databases:
php artisan test --parallel --recreate-databasesCzasami możesz potrzebować przygotować pewne zasoby używane przez testy Twojej aplikacji, aby mogły być bezpiecznie używane przez wiele procesów testowych.
Używając fasady ParallelTesting, możesz określić kod, który ma być wykonany podczas setUp i tearDown procesu lub przypadku testowego. Podane domknięcia otrzymują zmienne $token i $testCase, które zawierają odpowiednio token procesu i bieżący przypadek testowy:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting;
use Illuminate\Support\ServiceProvider;
use PHPUnit\Framework\TestCase;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
ParallelTesting::setUpProcess(function (int $token) {
// ...
});
ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
// ...
});
// Wykonywane podczas tworzenia bazy danych testowej...
ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
Artisan::call('db:seed');
});
ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
// ...
});
ParallelTesting::tearDownProcess(function (int $token) {
// ...
});
}
}Jeśli chcesz uzyskać dostęp do "tokenu" bieżącego procesu równoległego z dowolnego innego miejsca w kodzie testowym Twojej aplikacji, możesz użyć metody token. Ten token jest unikalnym identyfikatorem ciągu dla pojedynczego procesu testowego i może być użyty do segmentacji zasobów w procesach testowych równoległych. Na przykład, Laravel automatycznie dodaje ten token na końcu baz danych testowych tworzonych przez każdy proces testowania równoległego:
$token = ParallelTesting::token();
Podczas uruchamiania testów aplikacji możesz chcieć określić, czy Twoje przypadki testowe rzeczywiście pokrywają kod aplikacji i ile kodu aplikacji jest używane podczas uruchamiania testów. Aby to osiągnąć, możesz podać opcję --coverage podczas wywoływania polecenia test:
php artisan test --coverageMożesz użyć opcji --min, aby zdefiniować minimalny próg pokrycia testami dla Twojej aplikacji. Zestaw testów zakończy się niepowodzeniem, jeśli ten próg nie zostanie osiągnięty:
php artisan test --coverage --min=80.3Runner testów Artisan zawiera również wygodny mechanizm do wyświetlania najwolniejszych testów Twojej aplikacji. Wywołaj polecenie test z opcją --profile, aby otrzymać listę dziesięciu najwolniejszych testów, co pozwala łatwo zbadać, które testy można ulepszyć, aby przyspieszyć Twój zestaw testów:
php artisan test --profilePodczas uruchamiania testów Laravel uruchamia aplikację dla każdej indywidualnej metody testowej. Bez cachowanego pliku konfiguracji, każdy plik konfiguracyjny w Twojej aplikacji musi być załadowany na początku testu. Aby zbudować konfigurację raz i użyć jej ponownie dla wszystkich testów w jednym uruchomieniu, możesz użyć traitu Illuminate\Foundation\Testing\WithCachedConfig:
<?php
use Illuminate\Foundation\Testing\WithCachedConfig;
pest()->use(WithCachedConfig::class);
// ...<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\WithCachedConfig;
use Tests\TestCase;
class ConfigTest extends TestCase
{
use WithCachedConfig;
// ...
}