Многие считают тесты в Laravel «ненужной головной болью». Но правда в том, что без них ты будешь копать баги в проде руками и материться на чужие изменения.

Laravel делает всё максимально просто: PHPUnit встроен, есть фабрики, есть методы для работы с базой и HTTP-запросами. Тест писать реально легко, если понимать, зачем он нужен.

Шаг 1: Создаём тест

Команда artisan make:test — твой друг.

php artisan make:test UserTest

Laravel создаст файл в tests/Feature или tests/Unit в зависимости от типа теста. Unit — для логики моделей и сервисов, Feature — для тестирования потоков приложения.

Шаг 2: Пишем простой Unit-тест

Пример теста модели User:

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;
use App\Models\User;

class UserTest extends TestCase
{
    public function testUserCreation()
    {
        $user = User::factory()->create();

        $this->assertDatabaseHas('users', [
            'email' => $user->email,
        ]);
    }
}

Что тут происходит:

  • Создаём пользователя через фабрику (не надо городить массивы вручную).
  • Проверяем, что база реально содержит запись.

Просто, понятно, работает.

Шаг 3: Запуск тестов

В командной строке запускаем:

php artisan test 

Laravel найдёт все тесты в tests/ и выполнит их. Результат: зелёные галочки — код работает, красные — пора копать баги.

Шаг 4: Feature-тесты

Если хочешь тестировать целые процессы — регистрация, авторизация, формы — это Feature-тесты.

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class UserRegistrationTest extends TestCase
{
    use RefreshDatabase;

    public function testUserCanRegister()
    {
        $response = $this->post('/register', [
            'name' => 'Test User',
            'email' => 'test@example.com',
            'password' => 'password',
            'password_confirmation' => 'password',
        ]);

        $response->assertStatus(302); // редирект на /home
        $this->assertAuthenticated(); // проверяем, что пользователь залогинен
    }
}

Что тут важно:

  • Используем RefreshDatabase — каждая проверка стартует с чистой базы.
  • Проверяем статус ответа и факт аутентификации.

Feature-тесты позволяют реально имитировать поведение пользователя, а не только крутить фабрики.

Лайфхаки по тестам в Laravel

  • Фабрики — твой друг. Не надо вручную писать массивы данных для моделей.
  • RefreshDatabase для чистоты. Без этого каждый тест будет влиять на другой — полный хаос.
  • Тесты — не для красоты. Пиши их там, где ломается логика, где важна база или поток данных.
  • HTTP-тесты круче Unit. Можно проверять формы, авторизацию, редиректы, куки и сессии.
  • Комбинируй Unit и Feature. Unit — мелкая логика, Feature — поток приложения.

Итог

Тесты в Laravel — это не какой-то навязанный стандарт. Это реально инструмент, который помогает не сдохнуть на проде.

Unit-тесты проверяют модели и сервисы. Feature-тесты — весь поток от формы до базы. Комбинируя их, ты получаешь уверенность, что код работает, а баги не вылезут случайно. 

Но давай по-честному: тестами покрыть всё практически невозможно. Особенно в крупных проектах, где менеджер хочет «быстро и вчера» — тебе не дадут недели на тестирование каждого мелкого метода. Там приходится выбирать, что реально критично: регистрация, платежи, авторизация, ключевые бизнес-процессы. Остальное — риск, костыли и надежда на внимательных разработчиков.

Так что тесты — это страховка, а не волшебная кнопка «всё работает». Пиши их там, где реально больно сломать, а остальное делай здраво и аккуратно.