Laravel: Руководство по тестированию с Pest

Источник: «Testing Laravel Made Easy with Pest: A Beginner's Guide with Code Examples»
Откройте для себя Pest, удобную среду тестирования Laravel. Узнайте как тестировать маршруты и модели Laravel с помощью примеров из этого руководства.

Laravel — популярный PHP фреймворк, обеспечивающий элегантный и удобный способ создания веб-приложений. Он поставляется со встроенной средой тестирования, позволяющей разработчикам писать и запускать тесты, чтобы убедиться, что их приложения работают должным образом. Однако написание тестов может быть утомительной и трудоёмкой задачей, особенно если приходится иметь дело с многословным и повторяющимся синтаксисом.

Pest — относительно новая среда тестирования для PHP, представляющая выразительный, простой и интуитивно понятный синтаксис для написания тестов (была анонсирована и скоро выйдет вторая версия). Он построен на основе PHPUnit и поддерживает все его функции, добавляя при этом собственный набор функций и улучшений. В этой статье мы рассмотрим, как использовать Pest для тестирования приложений Laravel.

Как установить Pest

Прежде чем погрузиться в написание тестов, давайте разберёмся как установить Pest. У Pest следующие требования:

Важно: Чтобы установить Pest v1 в проект Laravel 10, вы должны понизить версию PHPUnit и Collision до совместимых версий. Для этого выполните следующую команду:

composer require phpunit/phpunit:^9.6 nunomaduro/collision:^6.1 --dev --with-all-dependencies

Pest можно установить с помощью Composer, менеджера зависимостей PHP, следующим образом:

composer require pestphp/pest --dev --with-all-dependencies

Установите плагин Laravel следующей командой:

composer require pestphp/pest-plugin-laravel --dev

Теперь установите Pest с помощью Artisan, выполнив следующую команду:

php artisan pest:install

Для других PHP проектов выполните инициализацию Pest, следующей командой:

./vendor/bin/pest --init

Выполнить предустановленные тесты можно следующей командой:

./vendor/bin/pest

Пишем тесты для Pest

Pest представляет простой и выразительный синтаксис для написания тестов. Тесты пишутся как функции, описывающие, что тест делает и что от него ожидается. Вот пример простого теста с использованием Pest:

test('it should add two numbers', function () {
$sum = 1 + 1;

expect($sum)->toEqual(2);
});

В этом тесте мы описываем, что делает тест, а имени теста, которое представляет строку, передаваемую в качестве первого аргумента функции test(). Затем выполняем тестовую логику внутри функции, которая в данном случае складывает два числа и присваивает результат переменной $sum. Наконец, мы используем функцию expect() для утверждения, что переменная $sum равна 2, используя toEqual().

Давайте посмотрим, как использовать Pest для тестирования Laravel…

Тестирование Контроллера Laravel

Предположим, у нас есть контроллер получающий список пользователей и возвращающий его в виде JSON. Вот код контроллера:

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
public function index(Request $request)
{
$users = User::all();

return response()->json($users);
}
}

Для тестирования этого контроллера с помощью Pest, создадим новый файл UserControllerTest.php в каталоге tests:

<?php

test('it should return a list of users', function () {
$response = $this->get('/users');

$response->assertOk();
$response->assertJsonCount(User::count());
});

В этом тесте мы отправляем запрос GET на конечную точку /users, используя хелпер $this->get(), предоставленную Pest. Затем мы утверждаем, что статус код ответа равен 200, используя метод assertOk(), предоставленный Laravel. Наконец, мы утверждаем, что ответ JSON содержит правильное количество пользователей, используя метод assertJsonCount() предоставленный Laravel.

Обратите внимание, что мы не используем традиционный тестовый класс Laravel расширяющий TestCase. Вместо этого мы используем собственные тестовые хелперы предоставленные Pest, которые обеспечивают более простой и выразительный синтаксис.

Чтобы тест работал, нам нужно определить маршрут /users в нашем Laravel приложении. Это можно сделать добавив следующий код в файл маршрутизации routes/web.php:

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

Теперь всё готово к запуску теста с помощью команды pest:

./vendor/bin/pest

Она запустит тесты в каталоге tests и выведет результаты.

Тестирование Модели в Laravel

Допустим у нас есть модель User, представляющая пользователя в нашем приложении. Вот код модели:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
use HasFactory;

protected $fillable = [
'name',
'email',
'password',
];

Чтобы протестировать эту модель с помощью Pest, создадим файл UserTest.php в каталоге tests:

<?php

use App\Models\User;

test('it should create a new user', function () {
$user = User::factory()->create([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => bcrypt('password'),
]);

expect($user->name)->toBe('John Doe');
expect($user->email)->toBe('john@example.com');
expect(password_verify('password', $user->password))->toBeTrue();
});

В этом тесте мы используем фабрику моделей Laravel для создания нового пользователя с указанными атрибутами. Затем мы используем функцию Pest expect, чтобы утвердить, что у пользователя корректные атрибуты.

Обратите внимание, что мы не используем традиционный тестовый класс Laravel расширяющий TestCase. Вместо этого мы используем собственные тестовые хелперы предоставленные Pest, которые обеспечивают более простой и выразительный синтаксис.

Чтобы тест выполнился, нужно определить класс UserFactory генерирующий пользовательские атрибуты. Это можно сделать создав новый файл UserFactory.php в каталоге database/factories и поместить в него следующий код:

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;

class UserFactory extends Factory
{
protected $model = User::class;

public function definition()
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'password' => Hash::make('password'),
];
}
}

Это определит класс UserFactory генерирующий случайные пользовательские атрибуты, используя библиотеку Faker и фасад Hash для хэширования пароля.

Теперь мы готовы запустить тест с помощью команды pest:

./vendor/bin/pest

Как видите, Pest — это мощная и интуитивно понятная среда тестирования, предоставляющая простой и выразительный синтаксис для написания тестов на PHP. Он без проблем работает с Laravel и обеспечивает более простой и читаемый способ написания тестов. Используя Pest, вы можете писать тесты быстрее, с меньшим количеством стандартного кода и с лучшей читабельностью.

Дополнительные материалы

Предыдущая Статья

Архитектурная концепция Laravel: Жизненный цикл запроса

Следующая Статья

Что такое CSS маски и зачем они нужны