Як використовувати профілювальник у функціональному тесті

Дата оновлення перекладу 2022-11-24

Як використовувати профілювальник у функціональному тесті

Дуже рекомендовано, щоб функціональний тест тестував тільки відповідь. Але якщо ви пишете функціональні тести, які моніторять ваші сервери виробництва, вам може захотітися написати тести за даними профілювання, так як це надає вам чудову можливість перевіряти різні речі і використовувати деякі метрики.

Включення профілювальника у тестах

Збір даних за допомогою Профілювальника Symfony може значно уповільнити ваші тести. Тому Symfony відключає його за замовчуванням:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/packages/test/web_profiler.yaml

# ...
framework:
    profiler: { enabled: true, collect: false }

Встановлення collect як true включає профілювальник для всіх тестів. Однак, якщо вам потрібен профілювальник лише у декількох тестах, ви можете тримати його відключеним глоабльно і включати профілювальник індивідувально у кожному тесті, викликаючи $client->enableProfiler().

Тестування інформації профілювальника

Дані, зібрані Профілювальником Symfony можуть бути використані, щоб перевірити кількість викликів до бази даних, час, проведений у фреймворку та ін. Вся ця інформація надається колекторами, отриманими через виклик $client->getProfile():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// tests/Controller/LuckyControllerTest.php
namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class LuckyControllerTest extends WebTestCase
{
    public function testRandomNumber()
    {
        $client = static::createClient();

        // включити профілювальник тільки для наступного запиту (якщо ви робите нові
        // запити, ви маєте викликати цей метод знову)
        // (it does nothing if the profiler is not available)
        $client->enableProfiler();

        $crawler = $client->request('GET', '/lucky/number');

        // ... написати якісь ствердження про Відповідь

        // перевірити, щоб був включений профілювальник
        if ($profile = $client->getProfile()) {
            // перевірити кількість запитів
            $this->assertLessThan(
                10,
                $profile->getCollector('db')->getQueryCount()
            );

            // перевірити час, проведений у фреймворку
            $this->assertLessThan(
                500,
                $profile->getCollector('time')->getDuration()
            );
        }
    }
}

Якщо тест зазнає невдачі через дані профілювання (забагато запитів до БД, наприклад), ви можете захотіти використати Веб-профілювальник, щоб проаналізувати запит після завершення тестів. Цього можна досягти, вбудувавшиш токен у повідомлення про помилку:

1
2
3
4
5
6
7
8
$this->assertLessThan(
    30,
    $profile->getCollector('db')->getQueryCount(),
    sprintf(
        'Перервіряє, щоб кількість запитів була менше ніж 30 (токен %s)',
        $profile->getToken()
    )
);

Note

Інформація профілювальника доступна навіть якщо ви ізолюєте клієнта або якщо ви викоистовуєте шар HTTP для ваших тестів.

Tip

Прочитайте API для вбудованих колекторів даних, щоб дізнатися більше про їх інтерфейси.