如何在功能测试中使用Profiler

3.4 版本
维护中的版本

强烈推荐在功能测试中只测试Response(对象)。但如果你写了用于监控生产环境服务器的功能测试,你也许要针对分析数据(profiling data)来编写测试,因为它给你提供了一个极佳方式来检查各种事项并强制(使用)了某些制式标准。

Symfony Profiler 对每一次请求收集大量数据。使用这个数据可以检查数据库查询次数,框架执行时间等等。但在编写断言(assertions)之前,需开启分析器并确保其可用 (它在 test environment 下是默认开启的):

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
class LuckyControllerTest extends WebTestCase
{
    public function testNumberAction()
    {
        $client = static::createClient();
 
        // Enable the profiler for the next request
        // (it does nothing if the profiler is not available)
        // 在下一次请求中开启分析器(如果分析器不可用则什么也不做)
        $client->enableProfiler();
 
        $crawler = $client->request('GET', '/lucky/number');
 
        // ... write some assertions about the Response
        // ... 编写一些关于Response的断言
 
        // Check that the profiler is enabled
        // 检查分析器的开启
        if ($profile = $client->getProfile()) {
            // check the number of requests
            // 检查请求的次数
            $this->assertLessThan(
                10,
                $profile->getCollector('db')->getQueryCount()
            );
 
            // check the time spent in the framework
            // 检查花在框架上的时间
            $this->assertLessThan(
                500,
                $profile->getCollector('time')->getDuration()
            );
        }
    }
}

如果因为分析数据而测试失败(如,太多的DB查询数据),你想要在测试完成后,使用Web Profiler来分析请求。当你把token内嵌到错误信息中时,这很容易实现:

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()
    )
);

profiler store将根据环境(特别是当你使用SQLite store时,也就是默认的配置)而有所不同。

即便你隔离了客户端(client)或是对测试使用HTTP层(layer),分析信息仍然可用。

参考内置的 data collectors API以了解关于其接口的更多内容。

通过不收集分析数据而提高测试速度 

要避免在每次测试中收集信息,你可以设置 collect 参数为 false:

1
2
3
4
5
6
7
# app/config/config_test.yml
 
# ...
framework:
    profiler:
        enabled: true
        collect: false
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>
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() 的测试才会收集数据。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)