如何设置 Laravel Boilerplate phpunit 以在 Homestead 环境中提供代码覆盖

Posted

技术标签:

【中文标题】如何设置 Laravel Boilerplate phpunit 以在 Homestead 环境中提供代码覆盖【英文标题】:How to setup Laravel Boilerplate phpunit to provide code coverage in Homestead environment 【发布时间】:2017-09-13 06:32:27 【问题描述】:

我有一个新的Laravel Boilerplate 在运行完美的Laravel Homestead 环境中运行。 php -v 命令正在向我返回此信息

PHP 7.1.2-3+deb.sury.org~xenial+1 (cli) (built: Feb 22 2017 10:08:33) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.2-3+deb.sury.org~xenial+1, Copyright (c) 1999-2017, by Zend Technologies
    with blackfire v1.14.3~linux-x64-non_zts71, https://blackfire.io, by Blackfireio Inc.

我正在搜索如何设置 phpunit 的代码覆盖率以使其工作,并发现我需要 xDebug 才能使其工作。谷歌搜索了一下,找到了xon homestead 命令,它启用了 xDebug 扩展。所以我运行它,发现 xDebug 扩展已启用,正如新的php -v 所示:

PHP 7.1.2-3+deb.sury.org~xenial+1 (cli) (built: Feb 22 2017 10:08:33) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.2-3+deb.sury.org~xenial+1, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.5.0, Copyright (c) 2002-2016, by Derick Rethans
    with blackfire v1.14.3~linux-x64-non_zts71, https://blackfire.io, by Blackfireio Inc.

我还需要使用composer require --dev phpunit/php-code-coverage:4.0.8 添加 php-code-coverage 依赖项(特定版本,因为我在尝试安装最新版本时遇到了一些需求错误)。

然后我运行phpunit --coverage-clover=coverage.xml 并得到这个致命错误:

PHPUnit 5.7.19 by Sebastian Bergmann and contributors.

PHP Fatal error:  Uncaught Error: Class 'Breadcrumbs' not found in /home/vagrant/servirme/app/Http/Breadcrumbs/Backend/Access/User.php:3
Stack trace:
#0 /home/vagrant/servirme/app/Http/Breadcrumbs/Backend/Access.php(3): require()
#1 /home/vagrant/servirme/vendor/phpunit/php-code-coverage/src/CodeCoverage.php(1083): include_once('/home/vagrant/s...')
#2 /home/vagrant/servirme/vendor/phpunit/php-code-coverage/src/CodeCoverage.php(256): SebastianBergmann\CodeCoverage\CodeCoverage->initializeData()
#3 /home/vagrant/servirme/vendor/phpunit/phpunit/src/Framework/TestResult.php(650): SebastianBergmann\CodeCoverage\CodeCoverage->start(Object(AccessHelperTest))
#4 /home/vagrant/servirme/vendor/phpunit/phpunit/src/Framework/TestCase.php(860): PHPUnit_Framework_TestResult->run(Object(AccessHelperTest))
#5 /home/vagrant/servirme/vendor/phpunit/phpunit/src/Framework/TestSuite.php(722): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult))
#6 /home/vagrant/servirme/vendor/phpunit/phpunit/src/Framework/TestSuite.php(722): PHP in /home/vagrant/servirme/app/Http/Breadcrumbs/Backend/Access/User.php on line 3

Fatal error: Uncaught Error: Class 'Breadcrumbs' not found in /home/vagrant/servirme/app/Http/Breadcrumbs/Backend/Access/User.php on line 3

Error: Class 'Breadcrumbs' not found in /home/vagrant/servirme/app/Http/Breadcrumbs/Backend/Access/User.php on line 3

Call Stack:
    0.0005     350872   1. main() /home/vagrant/servirme/vendor/phpunit/phpunit/phpunit:0
    0.0736     562656   2. PHPUnit_TextUI_Command::main() /home/vagrant/servirme/vendor/phpunit/phpunit/phpunit:52
    0.0736     562768   3. PHPUnit_TextUI_Command->run() /home/vagrant/servirme/vendor/phpunit/phpunit/src/TextUI/Command.php:116
    0.3058    1886960   4. PHPUnit_TextUI_TestRunner->doRun() /home/vagrant/servirme/vendor/phpunit/phpunit/src/TextUI/Command.php:186
    0.5521    1993968   5. PHPUnit_Framework_TestSuite->run() /home/vagrant/servirme/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:517
    0.5558    1994968   6. PHPUnit_Framework_TestSuite->run() /home/vagrant/servirme/vendor/phpunit/phpunit/src/Framework/TestSuite.php:722
    0.5598    1995536   7. PHPUnit_Framework_TestCase->run() /home/vagrant/servirme/vendor/phpunit/phpunit/src/Framework/TestSuite.php:722
    0.5599    1995536   8. PHPUnit_Framework_TestResult->run() /home/vagrant/servirme/vendor/phpunit/phpunit/src/Framework/TestCase.php:860
    0.5704    2003832   9. SebastianBergmann\CodeCoverage\CodeCoverage->start() /home/vagrant/servirme/vendor/phpunit/phpunit/src/Framework/TestResult.php:650
    0.5704    2003832  10. SebastianBergmann\CodeCoverage\CodeCoverage->initializeData() /home/vagrant/servirme/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:256
    0.6267    2193768  11. include_once('/home/vagrant/servirme/app/Http/Breadcrumbs/Backend/Access.php') /home/vagrant/servirme/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:1083
    0.6278    2194104  12. require('/home/vagrant/servirme/app/Http/Breadcrumbs/Backend/Access/User.php') /home/vagrant/servirme/app/Http/Breadcrumbs/Backend/Access.php:3

我感觉这与 Laravel Facades 有关,这让我认为 phpunit 没有运行我的自动加载文件,但 bootstrap="bootstrap/autoload.php" 属性默认存在于 phpunit.xml 文件中。

不知道从哪里开始,不知道哪里出了问题。

编辑: 我的 Homestead 版本是 5.1.0

【问题讨论】:

没有覆盖的 phpunit 可以工作吗?您是否尝试将echo "Test\n\n"; 添加到您的引导文件并在输出中查找它? 是的,没有代码覆盖,它可以按预期工作。没试过,因为phpunit 命令正常工作 【参考方案1】:

全新的 Boilerplate 安装附带一个 phpunit.xml 文件。在其中,有一个带有此数据的过滤器标签

<filter>
    <whitelist processUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">
            ./app
        </directory>
    </whitelist>
</filter>

我不是 PHPUnit 专家,所以我玩了一点 XML,发现 whitelist 标记导致它崩溃。我用它玩了一点,发现如果我删除processUncoveredFilesFromWhitelist="true" 属性,phpunit 命令能够运行并生成我需要的代码覆盖率。


只是一个注释。

不幸的是,过去没有代码覆盖测试需要大约 1.5 分钟才能运行,而使用此技巧打开代码覆盖,测试需要大约 11 分钟。

由于该问题与生成代码覆盖率报告有关,因此我会将其标记为已接受,如果我发现任何可能对与我有相同问题的人有帮助的内容,我会及时更新此问题。

【讨论】:

以上是关于如何设置 Laravel Boilerplate phpunit 以在 Homestead 环境中提供代码覆盖的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 完整开源项目大全

无法正确设置 react-boilerplate:“npm ERR!ngrok - 不支持平台 darwinarm64。”

Angular 6 Boilerplate 只有基本功能(一直需要)?

如何将 HTML5 Boilerplate 与 Twitter Bootstrap 正确集成?

Laravel 未经身份验证无触发

Scenekit Xcode 模板 (BoilerPlate) 代码在运行时崩溃,Xcode 13, 2021