verkkokauppacom / parallel-phpunit
phpunit命令行的并行版本
Requires
This package is not auto-updated.
Last update: 2024-09-23 12:09:18 UTC
README
phpunit
是一个用于运行PHPUnit测试的命令行工具。它不支持并行运行测试。parallel-phpunit
是一个与phpunit
工作方式相同的命令行工具,但可以并行运行测试。它会搜索您想要执行的PHPUnit测试,同时启动多个phpunit
命令来运行它们,监控进度并最终返回结果。parallel-phpunit
的用户体验与phpunit
相同。在大多数情况下,您只需将phpunit
替换为parallel-phpunit
即可获得相同的结果。
为什么?
因为它更快!您只需通过将phpunit
替换为parallel-phpunit
,就可以在开发或持续集成中节省大量时间。通常,您有一些值得执行的测试,但它们执行时间较长。例如,Selenium测试由于其本质较慢,测试越多,测试执行时间越长。
PHPUnit内建的并行支持已经期待了很久,但一直没有任何进展。考虑到PHP语言级别的限制,如糟糕的线程支持以及内建事物(如代码覆盖率)的全局性质,我们可能需要很长时间才能拥有它,也许我们永远都得不到。而parallel-phpunit
已经是一个可以立即使用的解决方案。
何时使用?
当您的phpunit
命令执行时间过长时(根据您的观点),您应该测试parallel-phpunit
是否能使其更快。
需要什么?
parallel-phpunit
是用Bash编写的,并依赖于*nux命令行工具的速度和功能。要运行它,您需要以下条件
- 有效的Bash环境(在Mac和几种Linux版本中进行了测试)
- 有效的
phpunit
命令
如何安装?
要安装parallel-phpunit
,您只需将bin目录添加到您的PATH中
cd /path/of/your/choice
git clone https://github.com/verkkokauppacom/parallel-phpunit.git
<add /path/of/your/choice/parallel-phpunit/bin to your PATH>
要选择您想要使用的版本(或升级或降级)您只需使用相应的发布分支
git fetch
git checkout 1.3.0
另外,您还可以使用Composer安装parallel-phpunit
:(https://packagist.org.cn/packages/verkkokauppacom/parallel-phpunit)。
如何运行?
用法
parallel-phpunit [phpunit and parallel-phpunit switches] <directory>
仅支持phpunit
的目录版本,因此您不能将目录部分替换为文件名。parallel-phpunit的开关有
- --pu-cmd - 自定义phpunit运行脚本(默认:PATH中的第一个phpunit或parallel-phpunit旁边的phpunit)
- --pu-threads - 同时运行的
phpunit
命令的最大数量(默认为3) - --pu-retries - 如果测试失败,重试测试文件的次数(默认为0)
- --pu-verbose - 打印所有启动和结束的phpunit命令及其输出,默认情况下只输出失败情况(默认关闭)
所有其他开关都被视为phpunit
开关,它们被直接传递给phpunit
命令。
它是如何工作的?
parallel-phpunit
命令首先在给定目录下查找所有 PHPUnit 测试文件。默认情况下,所有以 'Test.php' 或 '.phpt' 结尾的文件都被视为测试文件。您可以使用 phpunit
的 --test-suffix 开关更改此默认设置。然后,测试文件会被过滤,以匹配您的 phpunit
--filter 开关。如果您在命令行中没有给出任何过滤器,则不会对文件列表进行过滤。测试文件将按字母顺序执行,并且对每个测试文件执行以下命令:
phpunit [phpunit switches] <test_file>
并行 PHPUnit 命令(由 --pu-threads 开关控制)有一个最大限制,并且同时只运行这么多并发测试执行。其余的执行都在等待某个正在运行的测试执行完成。
至少有一个 phpunit
命令运行时,每秒钟打印一次摘要报告行。以下是一个示例输出:
Success: 30 Fail: 0 Error: 0 Skip: 3 Incomplete: 0
Success: 35 Fail: 0 Error: 0 Skip: 3 Incomplete: 0
如果任何 phpunit
命令失败,则打印命令及其输出,否则执行静默。您可以通过向您的命令添加 --pu-verbose 开关来更改此默认行为。然后,无论结果如何,都会打印出所有单独的 phpunit
命令及其输出。如果您的测试不稳定(有时在应该成功时失败),您可以在您的命令中添加 --pu-retries 开关。这将导致 parallel-phpunit
重新运行失败的 phpunit
命令(最多给定次数),以验证它们确实损坏。如果在某些重试中失败的命令成功,则认为它是成功的。当所有 phpunit
命令完成后,执行将结束。如果所有 phphunit
命令都返回 0,则退出状态为 0,否则为 1。
有一个简单的测试集示例,您可以使用它来测试或学习 parallel-phpunit
。在您的 parallel-phpunit Git 克隆的根目录中运行以下命令:
parallel-phpunit example
这将并行运行一个简单的测试集,将其并行化成三个并发 phpunit
命令。您可以使用此命令测试您的 parallel-phpunit
命令是否正常工作。您还可以调查并可能更改 example 下的测试和目录结构,以了解 parallel-phpunit
命令的工作方式。
已知限制
-
由于所有并行执行都在相同的目录或文件中写入,因此报告开关(如
--coverage-*
或--log-*
)不一定能正常工作。只有--log-junit
是确保可以正常工作的,因为它是通过parallel-phphunit
作为特殊情况进行处理的。 -
测试执行摘要行是从
phpunit
输出的 "进度点" 计数的,因此如果您的测试在点之间打印某些内容,您可能会在摘要行中看到错误数字。出于同样的原因,使用--tap
或--testdox
将会破坏摘要行。 -
基于在文件内容上运行过滤器正则表达式来过滤测试文件列表,而不是像 PHPUnit 那样仅对 Classname::testMethod 字符串进行过滤。这就是为什么有时测试文件列表可能无法正确过滤(例如,将匹配被注释的测试方法,并且某些边缘情况正则表达式,如 'ClassName..testMethod',将不起作用)。
发行说明
主分支
版本 1.3.0
- 将失败的 phpunit 命令视为测试失败(修复问题 #13)
- 添加对 Composer 安装的支持
- 过滤文件列表以匹配给定的 --filter 开关(日志中不再出现“未执行任何测试”)
- 添加 --pu-retries 开关(对于不稳定的 Selenium 测试等非常有用)
版本 1.2
- 将存储库从 siivonen 移至 verkkokauppacom
- 修复问题 4(某些环境中留下了悬挂的临时日志文件)
- 使用单独的目录写入临时文件(parallel-phpunit* 文件不再写入测试旁边)
版本 1.1
- 开始使用按测试文件并行化而不是按测试目录并行化
- 使用 --pu-threads 开关控制并发 phpunit 命令的数量
- 将 --pu-cmd 转换为覆盖并行的 phpunit 命令行
- 允许更改测试文件名模式(=使用 --test-suffix 而不是硬编码的模式)
版本 1.0
- 第一个完全工作的版本
贡献和错误报告
使用标准的 GitHub 工具:拉取请求、问题和 Wiki。