Pest и Laravel

Pest — фреймворк для написания тестов с упором на простоту. В этой статье я расскажу вам как использовать его в Laravel.

Давайте для начала его установим:

composer require pestphp/pest --dev

Напомню, какие в Laravel дефолтные тесты:

Дефолтные тесты в Laravel

PEST — это прогрессивнsq фреймворк для тестирования, поэтому стандартный набор тестов в Laravel, написанный на PHPUnit, также будет работать, даже если вы запустите его pest-командой:

Pest команды

Напоминание: Pest это надстройка над PHPUnit. Просто другой API для создания тестов.

Давайте посмотрим на содержимое tests/Unit/ExampleTest.php:

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }
}

Теперь, давайте перепишем базовый модульный тест на Pest:

test('basic', function () {
    $this->assertTrue(true);
});

Благодаря Pest, ассерты (asserts — утверждения) доступны глобально, поэтому мы можем удалить переменную $this:

test('basic', function () {
    assertTrue(true);
});

И, поскольку, Pest поддерживает сообщения высшего порядка (higher-order messages), то мы можем сделать все в одну строку:

test('basic')->assertTrue(true);

Великолепно! Теперь давайте посмотрим на tests/Feature/ExampleTest.php:

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

В Pest мы можем переписать этот тест следующим образом:

uses(Tests\TestCase::class);

it('has welcome page', function () {
    $response = $this->get('/');

    $response->assertStatus(200);
});

Обратите внимание, что функция it является псевдонимом для test, и она добавляет префикс «it» к описанию теста:

Префикс для описания тестов

И опять таки, благодаря поддержке сообщений высшего порядка, мы можем упросить запись этого теста:

uses(Tests\TestCase::class);

it('has welcome page')->get('/')->assertStatus(200);

Кроме того, возможно мы захотим использовать этот Tests\TestCase::class для всех тестов в папке Feature. Давайте создадим файл Pest.php в корне папки tests со следующим содержимым:

uses(Tests\TestCase::class)->in('Feature');

Теперь мы можем удалить uses из нашего теста:

it('has welcome page')->get('/')->assertStatus(200);

И, наконец, как, впрочем, и ожидалось, конечный результат практически как и исходный:

Финальный тест

Автор: Nuno Maduro
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.