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-dependenciesPest можно установить с помощью 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, вы можете писать тесты быстрее, с меньшим количеством стандартного кода и с лучшей читабельностью.