jwage/phpchunkit

PHPUnit 测试运行器

dev-master 2017-12-20 17:28 UTC

This package is auto-updated.

Last update: 2024-09-17 17:18:52 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

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

截图

PHPChunkit Screenshot

安装

使用 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 以提问。