📅  最后修改于: 2023-12-03 15:11:41.991000             🧑  作者: Mango
如果你接触过 Laravel 的测试,你一定知道它们是多么的快速和强大。但是,当我们的测试越来越多,测试套件的运行时间可能会变得很长。在本文中,我们将探讨一些在 Laravel 中调优测试运行时间的技巧。
默认情况下,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>
通过使用 PHPUnit 的 group
功能可以只运行需要的测试,从而提高测试运行速度。
例如,如果你的测试有多个功能,你可以设置每个功能为一个组:
/**
* @group feature1
*/
public function testFeature1()
{
// test code here
}
/**
* @group feature2
*/
public function testFeature2()
{
// test code here
}
然后可以通过以下方式只运行 feature1
测试:
vendor/bin/phpunit --group feature1
默认情况下,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>
如果您的测试套件涵盖了大量的用例,其中许多用例都没有太大价值,在运行时将浪费大量时间。为了避免这种情况,您可以删除无用的测试用例。
您可以使用 PHPUnit 的 --filter
选项,只运行匹配的测试套件:
vendor/bin/phpunit --filter MyTestClassName::testMyMethod
您还可以使用 --exclude-group
选项,从测试中排除特定的组:
vendor/bin/phpunit --exclude-group slow
在本文中,我们探讨了一些在 Laravel 中调优测试运行时间的技巧。通过使用更快的数据库、只运行需要的测试、避免重复的数据库迁移和避免浪费时间的测试用例,您可以快速地运行您的测试套件,并在最短的时间内发现代码中的错误。