拥有高效的测试与编写高效的应用程序同样重要。作为开发人员,快速了解自己刚刚编写的代码能否正常运行,可以大大提高开发效率。接下来,我们将介绍一些可以快速实现的技巧,让你的代码测试更快。此示例测试套件有意模拟更广泛的测试集并突出改进的可行性。实际上,效率的提高可能会有所不同。ParaTest包是用于运行测试套件的PHPUnit扩展。与PHPUnit不同,它可以使用您的多核CPU并行运行测试用例。您可以通过composer将其安装为开发依赖项来开始使用ParaTest。composerrequire--devbrianium/paratest现在我们可以像调用PHPUnit一样调用ParaTest。它会根据你机器的CPU核数自动决定启动多少个进程。如上,可以在控制台看到运行的输出了测试用例启动5个并行进程。为了进行比较,下面使用PHPUnit运行相同的测试用例。1.49秒和6.15秒!虽然ParaTest可以自行确定进程数,但您也可以尝试设置进程数以针对您的机器进行优化。使用---processes选项,可以增加或减少进程数,因为并不是进程越多测试效果越好。./vendor/bin/paratest--processes6警告:在使用ParaTest测试数据库之前,您需要考虑如何准备数据。如果使用Lavarel的RefreshDatabase,它会在运行测试用例后回滚或迁移数据库写入。相反,数据持久性通过DatabaseTransactions跳过,它不会在运行测试时尝试修改数据。重试失败的测试PHPUnit有一个非常方便的功能,允许您只重新运行上次测试中失败的测试。如果您正在进行红-绿-重建风格的TDD开发,它将加快您的开发周期。让我们从一个通过所有现有测试的测试套件中看一下这个功能。接下来添加一个red-green-refactortest测试模型的案例,预计会失败:ischangingthecodebase然后你认为新的测试会通过,你想重新运行测试套件以使其按预期工作。问题是该套件已经需要1.3秒才能运行,并且随着测试代码量的增加,需要等待的时间也会增加。如果我们只能运行失败的测试不是很好吗?非常幸运的是,PHPUnitv7.3添加了执行此操作的能力。要实现此功能,请设置cacheResult="true"添加到phpunit.xml配置。PHPUnit会永远记住过去哪些测试失败了。现在,当我们运行测试单元时,PHPUnit会记住哪些测试失败了以下选项允许我们重新运行那些失败的测试单元。./vendor/bin/phpunit--order-by=defects--stop-on-defect我们不再需要等待整个测试单元运行来查看我们试图修复的一个测试是否通过。将缓存文件.phpunit.result.cache添加到.gitignore也是一个好主意,这样它就不会最终提交到您的存储库。分组慢速测试PHPUnit允许您使用@group注释将测试用例添加到不同的“组”。如果您有一些特别慢的测试用例,最好将它们组合在一起。类MyTest扩展TestCase{publicfunctiontest_that_is_fast(){$this->assertTrue(true);}/***@groupslow*/publicfunctiontest_that_is_slow(){sleep(10);$this->assertTrue(真);}/***@groupslow*/publicfunctiontest_that_is_slow_2_adrians_revenge(){sleep(10);$this->assertFalse(false);}}在此示例中,我们有两个测试用例要运行10秒。在我们的开发周期中,最后要做的就是运行测试用例,尤其是在做测试驱动开发的时候,需要即时执行测试用例。由于这两个慢速测试用例在同一组中,您可以使用PHPUnit的--exclude-group选项将它们从测试运行中排除。./vendor/bin/phpunit--exclude-groupslow这个命令将运行你的测试用例中除了慢速组之外的所有测试用例。对测试用例进行分组还有另一个好处。例如,您需要将所有缓慢的测试用例组织到文档中,以便以后可以对其进行优化。但是,在部署到生产环境之前会执行一些检查,以确保所有测试用例都通过,包括慢速测试用例。设置一个CI管道来运行测试用例是个好主意。过滤测试PHPUnit有一个--filter选项,它接受一个模式来确定运行哪些测试。例如,如果您为所有测试命名空间,则可以通过指定命名空间来运行特定的测试子集。以下命令仅在Tests\Unit\Models命名空间中运行测试并排除所有其他命令。./vendor/bin/phpunit--filter'Tests\\Unit\\Models'--filter选项是灵活的,允许通过methodName、Class::methodName进行过滤,即使是/path/to/my/test.php文件过滤路径。您应该查看此选项的PHPUnit文档并了解更多信息。密码哈希时间Laravel默认使用bcrypt密码哈希算法,该算法设计缓慢且占用系统资源。如果您的测试是验证用户密码,您可以通过设置算法的使用次数来减少测试运行的时间,因为执行的次数越多,花费的时间就越长。如果您的应用程序与laravel/laravelproject的最新更改保持同步,您会发现可以使用环境变量自定义哈希的数量。bcrypt允许的最小次数已在phpunit.xml文件中设置为4。但是,如果您还没有同步最新的更新,您可以使用Hashfacade在CreatesApplication特性中设置它。publicfunctioncreateApplication(){$app=require__DIR__.'/../bootstrap/app.php';$app->make(Kernel::class)->bootstrap();//设置bcrypt哈希时间...散列::回合(4);return$app;}内存数据库利用内存数据库SQLite是加速测试的另一种方法。您可以通过将两个环境字段添加到phpunit.xml配置文件来快速启用它。...说明:虽然这看起来很简单,但是你的制作应考虑环境数据库一致性问题。如果您在生产中使用MySQL数据库,则应警惕因引入不同数据库(例如SQLite)而导致的测试差异。我在这篇文章我的功能测试套件设置中描述了许多细节的差异。我认为保持生产环境的一致性比从一点点速度提升中获益更重要。禁用Xdebug如果你平时不使用Xdebug,可以禁用它,因为它会减慢PHP的执行速度,导致测试用例运行缓慢。如果您每天使用它进行调试,那么在测试执行时禁用它可能不是一个好的选择——但是当您关心测试用例执行速度时,您应该始终意识到这一点。正如您在下面的测试用例中看到的那样,一旦我们禁用Xdebug,执行速度将大大提高。这是启用Xdebug时此测试用例的执行:以及在禁用Xdebug时执行相同的测试用例:Fixthetestspeedistooslow当然我们最想看到的一段话就是:Fixthetestspeedistooslow!如果您正在努力确定哪些测试导致单元测试变慢,您可能需要查看PHPUnit报告。它是一个开源工具,允许您通过生成如下图所示的云来可视化测试单元的性能,其中较大的气泡表示缓慢的测试。这将使您能够找到单元中最慢的测试并逐渐提高其性能。转自PHP/Laravel开发者社区https://laravel-china.org/top...