jwage / phpchunkit
PHPUnit 测试运行器
Requires
- php: >=7.0.0
- doctrine/inflector: ^1.1
- phpunit/php-token-stream: >=1.4
- phpunit/phpunit: >=5.0
- phpunit/phpunit-mock-objects: ^3.1|>=4.0
- pimple/pimple: ^3.0
- sebastian/comparator: >=1.2.3
- symfony/console: ^2.7|^3.0
- symfony/event-dispatcher: ^2.7|^3.0
- symfony/finder: ^2.7|^3.0
- symfony/process: ^2.7|^3.0
- symfony/stopwatch: ^2.7|^3.0
- twig/twig: ^1.27
Requires (Dev)
- ext-pdo: *
- ext-pdo_mysql: *
- kherge/box: ^2.7
This package is auto-updated.
Last update: 2024-09-17 17:18:52 UTC
README
PHPChunkit 是一个库,位于 PHPUnit 之上,并添加了额外的功能,使处理大型单元和功能测试套件更容易。主要功能是测试分块和数据库沙箱,这使您能够在同一服务器或多个服务器上并行运行测试。
为了在相同的服务器上并行运行功能测试,您需要有一个数据库沙箱的概念。您负责实现沙箱准备、数据库创建和沙箱清理。PHPChunkit 提供了一个框架,您可以将其挂钩以准备您的应用程序环境沙箱。
并行执行示例
假设您有 100 个测试,每个测试需要 1 秒。当测试串行运行时,将需要 100 秒才能完成。但如果将 100 个测试分成 10 个相等的块并在并行运行这些块,理论上只需要 10 秒即可完成。
现在假设您有一个两个节点的 Jenkins 集群。您可以将每个块的运行分布在 2 个服务器上,每个服务器上有 5 个并行作业
Jenkins 服务器 #1,有 5 个作业工作者
phpchunkit --num-chunks=10 --chunk=1 --sandbox --create-dbs
phpchunkit --num-chunks=10 --chunk=2 --sandbox --create-dbs
phpchunkit --num-chunks=10 --chunk=3 --sandbox --create-dbs
phpchunkit --num-chunks=10 --chunk=4 --sandbox --create-dbs
phpchunkit --num-chunks=10 --chunk=5 --sandbox --create-dbs
Jenkins 服务器 #2,有 5 个作业工作者
phpchunkit --num-chunks=10 --chunk=6 --sandbox --create-dbs
phpchunkit --num-chunks=10 --chunk=7 --sandbox --create-dbs
phpchunkit --num-chunks=10 --chunk=8 --sandbox --create-dbs
phpchunkit --num-chunks=10 --chunk=9 --sandbox --create-dbs
phpchunkit --num-chunks=10 --chunk=10 --sandbox --create-dbs
截图
安装
使用 composer 在项目中安装
composer require jwage/phpchunkit
./vendor/bin/phpchunkit
使用 composer 全局安装
composer global require jwage/phpchunkit
ln -s /home/youruser/.composer/vendor/bin/phpchunkit /usr/local/bin/phpchunkit
cd /path/to/your/project
phpchunkit
安装 Phar
wget https://github.com/jwage/phpchunkit/raw/master/phpchunkit.phar
chmod +x phpchunkit.phar
sudo mv phpchunkit.phar /usr/local/bin/phpchunkit
cd /path/to/your/project
phpchunkit
设置
如上所述,在介绍中提到,您负责通过添加 事件调度器 监听器来实现沙箱准备、数据库创建和沙箱清理过程。您可以监听以下事件
sandbox.prepare
- 使用Events::SANDBOX_PREPARE
常量。databases.create
- 使用Events::DATABASES_CREATE
常量。sandbox.cleanup
- 使用Events::SANDBOX_CLEANUP
常量。
查看此项目测试套件中实现的事件监听器示例
配置
这里是一个示例 phpchunkit.xml
文件。将其放置在项目根目录下
<?xml version="1.0" encoding="UTF-8"?> <phpchunkit bootstrap="./tests/phpchunkit_bootstrap.php" root-dir="./" tests-dir="./tests" phpunit-path="./vendor/bin/phpunit" memory-limit="512M" num-chunks="2" > <watch-directories> <watch-directory>./src</watch-directory> <watch-directory>./tests</watch-directory> </watch-directories> <database-names> <database-name>testdb1</database-name> <database-name>testdb2</database-name> </database-names> <events> <listener event="sandbox.prepare"> <class>PHPChunkit\Test\Listener\SandboxPrepare</class> </listener> <listener event="sandbox.cleanup"> <class>PHPChunkit\Test\Listener\SandboxCleanup</class> </listener> <listener event="databases.create"> <class>PHPChunkit\Test\Listener\DatabasesCreate</class> </listener> </events> </phpchunkit>
tests/phpchunkit_bootstrap.php
文件在 XML 加载后加载,并允许您使用 配置 做更多高级的事情。
这里是一个示例
<?php use PHPChunkit\Events; // Manipulate $configuration which is an instance of PHPChunkit\Configuration /** @var PHPChunkit\Configuration $configuration */ $rootDir = $configuration->getRootDir(); $configuration = $configuration ->setWatchDirectories([ sprintf('%s/src', $rootDir), sprintf('%s/tests', $rootDir) ]) ->setTestsDirectory(sprintf('%s/tests', $rootDir)) ->setPhpunitPath(sprintf('%s/vendor/bin/phpunit', $rootDir)) ->setDatabaseNames(['testdb1', 'testdb2']) ->setMemoryLimit('256M') ->setNumChunks(2) ; $eventDispatcher = $configuration->getEventDispatcher(); $eventDispatcher->addListener(Events::SANDBOX_PREPARE, function() { // prepare the sandbox }); $eventDispatcher->addListener(Events::SANDBOX_CLEANUP, function() { // cleanup the sandbox }); $eventDispatcher->addListener(Events::DATABASES_CREATE, function() { // create databases });
可用命令
运行所有测试
phpchunkit
仅运行单元测试
phpchunkit --exclude-group=functional
在 2 个并行进程上运行 4 块测试
phpchunkit --exclude-group=functional --num-chunks=4 --parallel=2
运行所有功能测试
phpchunkit --group=functional
运行特定的功能测试块
phpchunkit --num-chunks=5 --chunk=1
运行匹配筛选器的测试路径
phpchunkit --filter=BuildSandbox
运行特定文件
phpchunkit --file=tests/Command/BuildSandboxTest.php
运行包含给定内容的测试
phpchunkit --contains="SOME_CONSTANT_NAME"
运行不包含给定内容的测试
phpchunkit --group=functional --not-contains="SOME_CONSTANT_NAME"
运行更改文件的测试
注意:这依赖于 git 来知道哪些文件已更改。
phpchunkit --changed
监视代码更改并运行测试
phpchunkit watch
创建数据库
phpchunkit create-dbs
从类生成测试骨架
phpchunkit generate "MyProject\ClassName"
将生成的测试保存到文件
phpchunkit generate "MyProject\ClassName" --file=tests/MyProject/Test/ClassNameTest.php
将选项传递给运行测试时的 PHPUnit
phpchunkit --phpunit-opt="--coverage-html /path/to/save/coverage"
列出所有可用选项
phpchunkit --help
设置 PHPChunkit 的帮助信息
phpchunkit setup
示例项目
查看 jwage/phpchunkit-demo 以了解它如何集成到现有的 PHPUnit 项目中。
IRC
请加入 irc.freenode.net/phpchunkit 以提问。