statamic / cms

The core Laravel CMS Composer package
https://statamic.com
Other
3.7k stars 508 forks source link

Non-Statamic tests run slow after Statamic installation #10753

Open Fadarrizz opened 1 week ago

Fadarrizz commented 1 week ago

Bug description

After installing Statamic in an existing Laravel project, all non-Statamic tests take more than a second per test longer.

I've been playing with some config settings, such as stache, but nothing seems to improve it.

How to reproduce

Logs

No response

Environment

❯ a statamic:support:details

Environment
Application Name: Laravel
Laravel Version: 11.21.0
PHP Version: 8.3.11
Composer Version: 2.7.8
Environment: local
Debug Mode: ENABLED
URL: localhost
Maintenance Mode: OFF
Timezone: Europe/Amsterdam
Locale: nl

Cache
Config: NOT CACHED
Events: NOT CACHED
Routes: NOT CACHED
Views: NOT CACHED

Drivers
Broadcasting: null
Cache: file
Database: mysql
Logs: stack / daily
Mail: smtp
Queue: sync
Session: database

Filament
Packages: filament, forms, notifications, support, tables
Version: v3.2.110
Views: PUBLISHED: notifications

Livewire
Livewire: v3.5.6

Sentry
Enabled: MISSING DSN
Environment: local
Laravel SDK Version: 4.8.0
PHP SDK Version: 4.9.0
Release: NOT SET
Sample Rate Errors: 100%
Sample Rate Performance Monitoring: 0%
Sample Rate Profiling: NOT SET
Send Default PII: DISABLED

Statamic
Addons: 1
Sites: 1
Stache Watcher: Disabled
Static Caching: Disabled
Version: 5.23.0 Solo

Statamic Addons
statamic/eloquent-driver: 4.14.0

Statamic Eloquent Driver
Asset Containers: file
Assets: file
Blueprints: file
Collection Trees: file
Collections: file
Entries: eloquent
Forms: file
Global Sets: file
Global Variables: file
Navigation Trees: file
Navigations: file
Revisions: file
Sites: file
Taxonomies: file
Terms: file
Tokens: file

Installation

Existing Laravel app

Additional details

No response

duncanmcclean commented 1 week ago

Are you able to share an example of a test that's running slow? What does your TestCase look like?

Fadarrizz commented 1 week ago

Hi @duncanmcclean,

This is what my TestCase looks like:

<?php
declare(strict_types = 1);

namespace Tests;

use Nuwave\Lighthouse\Testing\MakesGraphQLRequests;
use Nuwave\Lighthouse\Testing\RefreshesSchemaCache;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use MakesGraphQLRequests;
    use RefreshesSchemaCache;

    /**
     * Setup the test environment.
     *
     * @return void
     */
    protected function setUp(): void
    {
        parent::setUp();

        $this->withoutVite();
    }
}

I use Pest btw:

<?php
declare(strict_types = 1);

use Illuminate\Foundation\Testing\RefreshDatabase;

uses(Tests\TestCase::class, RefreshDatabase::class)->in('Feature');

A test that runs slow for example is the following:

<?php
declare(strict_types = 1);

test('that the dd and dump functions are not used in the codebase')
    ->expect(['dd', 'dump'])
    ->not
    ->toBeUsed();

This test takes ~6.5 seconds to complete with Statamic installed. Without Statamic (by not letting Composer discover Statamic), the test takes ~5 seconds to complete.

duncanmcclean commented 1 week ago

Thanks!

jasonvarga commented 1 week ago

What about tests that aren't 5 seconds long to begin with? That's already slow.

Fadarrizz commented 1 week ago

So, I trimmed some stuff down to have the bare minimum in feature tests:

// tests/TestCase.php

<?php
declare(strict_types = 1);

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    /**
     * Setup the test environment.
     *
     * @return void
     */
    protected function setUp(): void
    {
        parent::setUp();

        $this->withoutVite();
    }
}
// tests/Pest.php

<?php
declare(strict_types = 1);

uses(Tests\TestCase::class)->in('Feature');

I wrote the most basic test I could think of and ran it both with and without Statamic:

// tests/Feature/Test.php

<?php
declare(strict_types = 1);

test('true', function () {
    expect(true)->toBe(true);
});

This test takes 0.42 sec on my machine without Statamic installed (this time I removed both Statamic packages from Composer).

With Statamic, this test takes 1.91 sec.

Do you have any idea what makes it run slower?