turgutsaricam / phpunit-tools
使用PHPUnit简化常见操作的工具
Requires
- php: >=7.2
- ext-json: *
- phpunit/php-code-coverage: *
Requires (Dev)
- phpunit/phpunit: ^8.3
README
此仓库包含使用PHPUnit进行单元和UI测试时通常需要的工具,支持代码覆盖率。
覆盖率软件包
此软件包包含 CoverageHandler 和 ReportGenerator 类。 CoverageHandler 负责监听 $_POST、$_GET 和 $_POST 数组,以获取启用代码覆盖率的通知。当类检索到通知时,它将启动代码覆盖率并将覆盖率数据输出到定义的目录。 ReportGenerator 负责根据 CoverageHandler 输出的代码覆盖率数据生成代码覆盖率报告。它可以生成HTML和Clover报告。
CoverageHandler
注意以下事项以确保该类正常运行
- PHP的Xdebug扩展必须在执行测试的网站服务器上启用。
- 创建一个名为
start-coverage.php的文件,并在该文件中创建CoverageHandler的实例。 - 必须使用
auto_prepend_file注入此文件。可以通过向执行UI测试的网站的.htaccess文件中添加以下行来完成此操作
php_value auto_prepend_file "/path/to/start-coverage.php"
完成这些步骤后,在检测到代码覆盖率提示时,代码覆盖率数据将被输出到定义的目录。
示例可以在 examples/start-coverage.php 中查看。
基于 https://tarunlalwani.com/post/php-code-coverage-web-selenium/ 访问此页面以获取更多信息。
CoverageStarterIncluder
此类通过设置 auto_prepend_file 来查找应该包含在 .htaccess 中的PHP文件。可以将单个值作为 auto_prepend_file 的值提供。如果项目包含多个子项目,并且其 start-coverage.php 应该包含在主 .htaccess 文件中,则应创建一个包含 include 语句的PHP文件,以便预包含多个PHP文件。此类处理此情况。
类搜索应该包含的PHP文件,并通过保持对其的引用来包含它们。通过这种方式,start-coverage.php 文件中创建的 CoverageHandler 实例的 __destruct 方法不会提前调用。它们将在脚本退出时调用。因此,可以正确收集和输出覆盖率数据。
只需创建一个PHP文件,在该文件中创建 CoverageStarterIncluder 的实例,并调用 includeFiles() 来包含项目中的所有 start-coverage.php 文件即可。请参阅 examples/coverage-starter-includer.php 和 examples/.htaccess 中的示例。
ReportGenerator
此类从 CoverageHandler 输出的覆盖率数据生成HTML和Clover报告。要使用此功能,请创建一个名为 generate-report.php 的文件,在该文件中创建 ReportGenerator 的实例并调用 generate() 方法。示例可以在 examples/generate-report.php 中查看。
要生成报告,请在终端运行以下命令
php /path/to/generate-report.php
运行此命令后,指定的报告将被生成并保存到指定的目录。
要了解构造函数中提供的参数,请参阅phpDoc。
PHPUnit软件包
包含与PHPUnit直接相关的工具。
重定向
这个类负责将运行phpunit的命令重定向到正确的PHPUnit可运行版本,并修改命令以包含正确的phpunit.xml文件。这是在考虑到存在单元测试和UI测试的情况下完成的。
考虑以下情况。有两个不同的测试,即常规插件测试和用户界面测试。这些测试需要不同版本的PHPUnit和不同的PHPUnit配置。Selenium WebDriver支持PHPUnit 5.x,而WordPress支持PHPUnit 7.x。PHPStorm没有选项为不同的测试目录定义不同的PHPUnit可执行文件。但我们仍然想使用不同的PHPUnit版本。
此类查找测试文件的路径,并通过注入正确的配置文件路径将命令重定向到正确的PHPUnit版本。简而言之,这只是一个将PHPUnit命令重定向到正确的PHPUnit可执行文件的包装器。
如何使用此类
- 创建一个名为
phpunit的文件 - 确保此文件的第一行是
#!/usr/bin/env php - 确保此文件的绝对路径被输入为
Preferences > Languages & Frameworks > PHP > Test Frameworks > (选择或创建一个测试框架) > Path to phpunit.phar的值。 - 确保
Preferences > Languages & Frameworks > PHP > Test Frameworks > (之前设置的框架) > Default configuration file的值与$configPathDefault的值相同(即$relativeDefaultConfigXmlPath的绝对路径) - 在创建的文件中创建此类的实例并调用
redirect()方法
设置正确后,您可以使用PHPStorm的按钮(运行、调试、带有覆盖率运行)来运行测试。
在examples/phpunit中可以查看一个示例phpunit文件。只需参考phpDoc来了解参数。
开发
测试UI覆盖率导出和报告生成
首先,确保127.0.0.1 phpunit-tools.test行存在于/etc/hosts文件中。另外,一个jwilder/nginx-proxy应该启动并运行。然后,通过运行以下命令初始化开发环境:
cd env && docker-compose up -d
接下来,您可以在浏览器中访问phpunit-tools.test。要生成覆盖率导出,您可以使用?coverageStartHintKey=<test-name>查询,例如phpunit-tools.test?coverageStartHintKey=my-test。访问此URL后,覆盖率导出文件将创建在tests/site/coverages目录下。要生成报告,进入容器并运行site/files/generate-report.php,例如:
docker exec -it phpunit-tools-php bash
cd /var/www/html/files
php generate-report.php
完成后,报告可以在/var/www/html/files/reports目录下或/path/to/phpunit-tools/tests/site/files/reports目录下找到。这些目录是相同的,因为本地目录被附加为卷到容器中。
单元测试
单元测试位于tests/Coverages目录下。单元测试是不完整的。
TODO
- 编写测试以覆盖类提供的所有功能