Laravel: Руководство по тестированию с Pest
Laravel — популярный PHP фреймворк, обеспечивающий элегантный и удобный способ создания веб-приложений. Он поставляется со встроенной средой тестирования, позволяющей разработчикам писать и запускать тесты, чтобы убедиться, что их приложения работают должным образом. Однако написание тестов может быть утомительной и трудоёмкой задачей, особенно если приходится иметь дело с многословным и повторяющимся синтаксисом.
Pest — относительно новая среда тестирования для PHP, представляющая выразительный, простой и интуитивно понятный синтаксис для написания тестов (была анонсирована и скоро выйдет вторая версия). Он построен на основе PHPUnit и поддерживает все его функции, добавляя при этом собственный набор функций и улучшений. В этой статье мы рассмотрим, как использовать Pest для тестирования приложений Laravel.
Как установить Pest
Прежде чем погрузиться в написание тестов, давайте разберёмся как установить Pest. У Pest следующие требования:
- PHP 7.3+
- Composer
- PHPUnit 9.6.x
- Collision 6.3.x
Важно: Чтобы установить 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, вы можете писать тесты быстрее, с меньшим количеством стандартного кода и с лучшей читабельностью.