Тестирование и отладка роутов Laravel при помощи DebugBar
09.10.2021
30

Тестирование и отладка роутов Laravel при помощи DebugBar

Для тестирования роутов на наличие дубликата sql запросов, потребления памяти или времени загрузки можно использовать удобный интерфейс laravel-debugbar. При помощи отладочной информации debugbar появляется возможность быстро в одном тесте собрать информацию о затраченных ресурсах при запросе к странице.


Пример теста:


namespace Tests\Feature;

use Tests\TestCase;

class RoutesTest extends TestCase
{
    const PHP_VERSION = '7.4.22';
    const MAX_TIME_DURATION_SECONDS = 1;
    const MAX_MEMORY_MB = 50;
    const MAX_VIEWS = 50;
    const MAX_DB_QUERIES = 10;
    const MAX_DB_DUBLICATES = 1;
    const MAX_MODELS = 2000;

    protected function setUp(): void
    {
        parent::setUp();

        debugbar()->enable();
    }

    /**
     * Routes - get method
     *
     * @return array
     */
    private function routes(): array
    {
        return [
            route('posts'),
        ];
    }


    public function test_posts()
    {
        foreach ($this->routes() as $route) {
            $this->get($route);

            $this->debugBarPhp();
            $this->debugBarMessages();
            $this->debugBarTime();
            $this->debugBarMemory();
            $this->debugBarExceptions();
            $this->debugBarViews();
            $this->debugBarRoutes();
            $this->debugBarDbQueries();
            $this->debugBarModels();
            $this->debugBarMail();
            $this->debugBarGate();
            $this->debugBarSession();
            $this->debugBarRequest();
        }
    }

    /**
     * Check php version
     */
    private function debugBarPhp()
    {
        $collector = debugbar()->getCollector('php');
        $collect = $collector->collect();
        $this->assertEquals($collect['version'], self::PHP_VERSION, 'Wrong php version');
    }

    /**
     * Check messages
     */
    private function debugBarMessages()
    {
        // $collector = debugbar()->getCollector('messages');
        // $collect = $collector->collect();
        // ...
    }

    /**
     * Check time
     */
    private function debugBarTime()
    {
        $collector = debugbar()->getCollector('time');
        $collect = $collector->collect();
        $this->assertGreaterThanOrEqual($collect['duration'], self::MAX_TIME_DURATION_SECONDS, 'To long');
    }

    /**
     * Check memory
     */
    private function debugBarMemory()
    {
        $collector = debugbar()->getCollector('memory');
        $collect = $collector->collect();
        $memory = $collect['peak_usage'] / 1024 / 1024;
        $this->assertGreaterThanOrEqual($memory, self::MAX_MEMORY_MB, 'Used a lot of memory');
    }

    /**
     * Check exceptions
     */
    private function debugBarExceptions()
    {
        $collector = debugbar()->getCollector('exceptions');
        $collect = $collector->collect();
        $this->assertEquals($collect['count'], 0, 'Has exceptions');
    }

    /**
     * Check views
     */
    private function debugBarViews()
    {
        $collector = debugbar()->getCollector('views');
        $collect = $collector->collect();
        $this->assertGreaterThanOrEqual($collect['nb_templates'], self::MAX_VIEWS, 'Many views');
    }

    /**
     * Check routes
     */
    private function debugBarRoutes()
    {
        // $collector = debugbar()->getCollector('route');
        // $collect = $collector->collect();
        // ...
    }

    /**
     * Check queries
     */
    private function debugBarDbQueries()
    {
        $collector = debugbar()->getCollector('queries');
        $collect = $collector->collect();
        $queries = [];
        foreach ($collect['statements'] as $statements) {
            if (!array_key_exists($statements['sql'], $queries)) {
                $queries[$statements['sql']] = 0;
            }
            $queries[$statements['sql']]++;
        }
        $max = max($queries);
        $count = count($queries);

        $this->assertGreaterThanOrEqual($count, self::MAX_DB_QUERIES, 'Many queries');
        $this->assertGreaterThanOrEqual($max, self::MAX_DB_DUBLICATES, 'Dublicate queries');
    }

    /**
     * Check models
     */
    private function debugBarModels()
    {
        // Models
        $collector = debugbar()->getCollector('models');
        $collect = $collector->collect();
        $this->assertGreaterThanOrEqual($collect['count'], self::MAX_MODELS, 'Many models');
    }

    /**
     * Check mail
     */
    private function debugBarMail()
    {
        // $collector = debugbar()->getCollector('swiftmailer_mails');
        // $collect = $collector->collect();
        // ...
    }

    /**
     * Check mail
     */
    private function debugBarGate()
    {
        // $collector = debugbar()->getCollector('gate');
        // $collect = $collector->collect();
        // ...
    }

    /**
     * Check session
     */
    private function debugBarSession()
    {
        // $collector = debugbar()->getCollector('session');
        // $collect = $collector->collect();
        // ...
    }

    /**
     * Check request
     */
    private function debugBarRequest()
    {
        // $collector = debugbar()->getCollector('request');
        // $collect = $collector->collect();
        // ...
    }
}
Источник: ZetRider
Laravel Nova - Как вывести в трендах сумму за период
24.02.2021
579
Laravel Nova - Как вывести в трендах сумму за период

В Laravel Nova удобно отображать метрики через тренды. Создавая периоды можно получить информацию например о новых пользователях в системе. В одном пр...

Читать →
Bash деплой - аналог Envoyer
24.02.2021
652
Bash деплой - аналог Envoyer

Для быстрого деплоя личных или простых проектов можно использовать сервисы подобные Envoyer.io о котором писал ранее или написать свой велосипед на ba...

Читать →
reCaptcha v2 для Laravel
21.02.2021
571
reCaptcha v2 для Laravel

Для защиты форм от спама полезно добавлять всем надоевшую reCaptcha от Google, которая существенно позволяет сократить количество сообщений от ботов н...

Читать →