Как использовать профилировщик в функциональном тесте

Как использовать профилировщик в функциональном тесте

Крайне рекомендовано, чтобы функциональный тест тестировал только ответ. Но если вы пишете функциональные тесты, которые мониторят ваши сервера производства, вам может захотеться написать тесты по данным профилирования, так как это даёт вам отличную возможность проверять разные вещи и использовать некоторые метрики.

Профилировшик Symfony собирает много данных по каждому запросу. Используйте эту дату, чтобы проверить количество вызовов базы данных, время, проведенное в каждом фреймворке и т.д. Но перед тем, как писать утверждения, подключите профилировщик, и убедитесь, что он действительно доступен (он подключается по умолчанию в окружении test):

 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
class LuckyControllerTest extends WebTestCase
{
    public function testNumberAction()
    {
        $client = static::createClient();

        // Подключите профилировщик для следующего запроса
        // (ничего не делает, если профилировщик недоступен)
        $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()
            );
        }
    }
}

Если тест даст сбой из-за данных профилирования (слишком много запрос БД, например), вы можете захотеть использовать Веб-Профилировщик (Web Profiler) для анализа запроса после завершения тестов. Этого легко достичь, если вы внедрите метку в сообщение об ошибке:

1
2
3
4
5
6
7
8
$this->assertLessThan(
    30,
    $profile->getCollector('db')->getQueryCount(),
    sprintf(
        'Checks that query count is less than 30 (token %s)',
        $profile->getToken()
    )
);

Caution

Хранилище профилировщика может быть разным в зависимости от окружения (особенно если вы используете хранилище SQLite, которое конфигурируется по умолчанию).

Note

Информация профилировщика доступно даже если вы изолируете клиента или если вы используете уровень HTTP для вашеих тестов.

Tip

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

Ускорение тестов за счет отказа от сбора данных профилировщика

Чтобы избежать сбора данных в каждом тесте, вы можете установить параметр collect как "false":

  • YAML
    1
    2
    3
    4
    5
    6
    7
    # app/config/config_test.yml
    
    # ...
    framework:
        profiler:
            enabled: true
            collect: false
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:framework="http://symfony.com/schema/dic/symfony"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
                    http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
    
        <!-- ... -->
    
        <framework:config>
            <framework:profiler enabled="true" collect="false" />
        </framework:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // app/config/config.php
    
    // ...
    $container->loadFromExtension('framework', array(
        'profiler' => array(
            'enabled' => true,
            'collect' => false,
        ),
    ));
    

Таким образом, только тесты, вызывающие $client->enableProfiler(), будут собирать данные.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.