Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Тестирование

Тест — код, который проверяет другой код. Symfony использует PHPUnit и добавляет к нему тестовый клиент: он открывает страницы приложения без настоящего браузера и проверяет ответы.

Установка

composer require --dev symfony/test-pack

Тесты лежат в папке tests и запускаются командой:

php bin/phpunit

Модульный тест

Проверяет один класс отдельно от всего приложения:

// tests/Service/PriceCalculatorTest.php
namespace App\Tests\Service;
 
use App\Service\PriceCalculator;
use PHPUnit\Framework\TestCase;
 
class PriceCalculatorTest extends TestCase
{
    public function testAddsTax(): void
    {
        $calculator = new PriceCalculator();
 
        $this->assertSame(120.0, $calculator->withTax(100));
    }
}

Имя метода начинается с test. Такие тесты выполняются мгновенно.

Тест страницы

php bin/console make:test WebTestCase BlogControllerTest
// tests/Controller/BlogControllerTest.php
namespace App\Tests\Controller;
 
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
 
class BlogControllerTest extends WebTestCase
{
    public function testIndexPageOpens(): void
    {
        $client = static::createClient();
        $client->request('GET', '/blog');
 
        $this->assertResponseIsSuccessful();
        $this->assertSelectorTextContains('h1', 'Статьи');
    }
}

Клиент выполняет запрос внутри приложения, а проверки смотрят на код ответа и разметку.

Полезные проверки

ПроверкаЧто утверждает
assertResponseIsSuccessful()Код ответа 2xx
assertResponseStatusCodeSame(404)Точный код
assertResponseRedirects('/login')Перенаправление
assertSelectorExists('.post')Элемент есть на странице
assertSelectorTextContains('h1', '…')Текст элемента

Отправка формы

public function testCreatesPost(): void
{
    $client = static::createClient();
    $client->request('GET', '/blog/new');
 
    $client->submitForm('Сохранить', [
        'post[title]' => 'Тестовая статья',
        'post[body]' => 'Текст',
    ]);
 
    $this->assertResponseRedirects();
}

Первый аргумент submitForm() — надпись на кнопке.

Вход пользователя

$client = static::createClient();
$user = static::getContainer()->get(UserRepository::class)->findOneBy(['email' => 'admin@example.com']);
 
$client->loginUser($user);
$client->request('GET', '/admin/posts');
 
$this->assertResponseIsSuccessful();

Тестовая база

Настройки для тестов задают в файле .env.test. К имени базы Symfony сам добавляет _test, поэтому рабочие данные не пострадают:

php bin/console --env=test doctrine:database:create
php bin/console --env=test doctrine:migrations:migrate

Частая ошибка

Тесты не должны зависеть друг от друга. Если один тест создаёт запись, а другой рассчитывает её найти, они сломаются при запуске в другом порядке. Каждый тест готовит данные сам. Пакет dama/doctrine-test-bundle оборачивает каждый тест в транзакцию и откатывает её — база после теста остаётся чистой.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.