Тестирование
Тест — код, который проверяет другой код. 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 оборачивает каждый тест в транзакцию и откатывает её — база после теста остаётся чистой.