📜  缓慢的 laravel 测试 - PHP (1)

📅  最后修改于: 2023-12-03 15:11:41.991000             🧑  作者: Mango

缓慢的 Laravel 测试 - PHP

如果你接触过 Laravel 的测试,你一定知道它们是多么的快速和强大。但是,当我们的测试越来越多,测试套件的运行时间可能会变得很长。在本文中,我们将探讨一些在 Laravel 中调优测试运行时间的技巧。

1. 使用更快的数据库

默认情况下,Laravel 使用 SQLite 内存数据库来运行测试。尽管这对于小型测试非常有用,但它不一定是最快的选项。如果您的测试在连接到实际数据库后变得缓慢,那么您可以考虑切换到更快的数据库。

比如,在 Mysql 中运行测试,可以在 phpunit.xml 文件中加上以下配置:

<php>
    <env name="DB_CONNECTION" value="mysql"/>
    <env name="DB_HOST" value="127.0.0.1"/>
    <env name="DB_PORT" value="3306"/>
    <env name="DB_DATABASE" value="test"/>
    <env name="DB_USERNAME" value="root"/>
    <env name="DB_PASSWORD" value=""/>
</php>
2. 只运行需要的测试

通过使用 PHPUnit 的 group 功能可以只运行需要的测试,从而提高测试运行速度。

例如,如果你的测试有多个功能,你可以设置每个功能为一个组:

/**
 * @group feature1
 */
public function testFeature1()
{
    // test code here
}

/**
 * @group feature2
 */
public function testFeature2()
{
    // test code here
}

然后可以通过以下方式只运行 feature1 测试:

vendor/bin/phpunit --group feature1
3. 避免重复的数据库迁移

默认情况下,Laravel 在每个测试运行之前都会迁移数据库。如果您有大量的测试,这将需要大量的时间。为了避免这种情况,您可以避免重复的数据库迁移。

您可以在 phpunit.xml 文件中配置以下内容来实现这一点:

<php>
    <server name="DB_CONNECTION" value="sqlite"/>
    <server name="DB_DATABASE" value=":memory:"/>
    <server name="APP_ENV" value="testing"/>
    <server name="CACHE_DRIVER" value="array"/>
    <server name="SESSION_DRIVER" value="array"/>
    <server name="QUEUE_DRIVER" value="sync"/>
    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE" value=":memory:"/>
</php>

<testsuites>
    <testsuite name="unit">
        <directory suffix="Test.php">./tests/Unit</directory>
    </testsuite>
    <testsuite name="integration">
        <directory suffix="Test.php">./tests/Integration</directory>
    </testsuite>
    <testsuite name="acceptance">
        <directory suffix="Test.php">./tests/Acceptance</directory>
    </testsuite>
</testsuites>

<filter>
    <whitelist addUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">./app</directory>
        <directory suffix=".php">./database/factories</directory>
        <directory suffix=".php">./database/seeds</directory>
        <directory suffix=".php">./tests</directory>
        <exclude>
            <directory suffix=".blade.php">./resources/views</directory>
            <directory suffix=".php">./tests/Integration</directory>
            <directory suffix=".php">./tests/Acceptance</directory>
        </exclude>
    </whitelist>
</filter>

<listeners>
   <listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener"/>
</listeners>
4. 避免浪费时间的测试用例

如果您的测试套件涵盖了大量的用例,其中许多用例都没有太大价值,在运行时将浪费大量时间。为了避免这种情况,您可以删除无用的测试用例。

您可以使用 PHPUnit 的 --filter 选项,只运行匹配的测试套件:

vendor/bin/phpunit --filter MyTestClassName::testMyMethod

您还可以使用 --exclude-group 选项,从测试中排除特定的组:

vendor/bin/phpunit --exclude-group slow
结论

在本文中,我们探讨了一些在 Laravel 中调优测试运行时间的技巧。通过使用更快的数据库、只运行需要的测试、避免重复的数据库迁移和避免浪费时间的测试用例,您可以快速地运行您的测试套件,并在最短的时间内发现代码中的错误。