codeception/robo-paracept

使用 Robo Task Runner 并行执行 Codeception 任务

3.1.0 2023-01-02 12:34 UTC

README

PHP Composer Latest Stable Version Total Downloads License

Robo tasks for Codeception tests parallel execution. Requires Robo Task Runner

通过 Composer 安装

composer require codeception/robo-paracept --dev

包含到您的 RoboFile 中

<?php

require_once 'vendor/autoload.php';
require_once 'vendor/codeception/codeception/autoload.php';

class RoboFile extends \Robo\Tasks
{
    use Codeception\Task\Merger\ReportMerger;
    use Codeception\Task\Splitter\TestsSplitterTrait;
}

想法

Codeception 测试的并行执行可以实现不同的方式。根据项目的实际需求,可以不同。因此,我们准备了一套预定义的 Robo 任务,可以组合和重新配置以适应您的需求。

任务

SplitTestsByGroups

从文件夹加载测试并将它们分配到组中。

$result = $this->taskSplitTestsByGroups(5)
    ->testsFrom('tests/acceptance')
    ->projectRoot('.')
    ->groupsTo('tests/_data/group_')
    ->run();

// task returns a result which contains information about processed data:
// optionally check result data   
if ($result->wasSuccessful()) {
    $groups = $result['groups'];
    $tests = $result['tests'];
    $filenames = $result['files'];
}

此命令 将 Codeception 加载到内存中,加载并解析测试以组织它们在组之间。如果您只想分割测试文件而不是实际测试(并且不将测试加载到内存中),请使用 taskSplitTestFilesByGroups

SplitTestFilesByGroups

要按套件(文件)分割测试而不将其加载到内存中,请使用 taskSplitTestFilesByGroups 方法

$result = $this->taskSplitTestFilesByGroups(5)
   ->testsFrom('tests')
   ->groupsTo('tests/_data/paratest_')
   ->run();

// optionally check result data
if ($result->wasSuccessful()) {
    $filenames = $result['files'];
}   

SplitTestsByTime

如果使用 taskSplitTestsByTime 启用收集执行时间的扩展

extensions:
    enabled:
        - Codeception\Task\Extension\TimeReporter

从文件夹加载测试并将它们根据执行时间分配到组中。

$result = $this->taskSplitTestsByTime(5)
    ->testsFrom('tests/acceptance')
    ->projectRoot('.')
    ->groupsTo('tests/_data/group_')
    ->run();

// optionally check result data
if ($result->wasSuccessful()) {
    $filenames = $result['files'];
}

此命令需要运行所有测试并使用 Codeception\Task\TimeReporter 来收集执行时间。如果您只想在组之间分割测试(而不执行它们),则可以使用 SplitTestsByGroups。 请注意:此任务将不会考虑任何 'depends' 注释!

SplitFailedTests

如果使用 taskSplitFailedTests 启用收集失败测试的扩展
该扩展将报告文件保存到 \Codeception\Configuration::outputDir()

extensions:
    enabled:
        - Codeception\Task\Extension\FailedTestsReporter

将创建的报告文件合并为单个文件

$this->taskMergeFailedTestsReports()
    ->fromPathWithPattern(\Codeception\Configuration::outputDir(), '/failedTests_\w+\.txt$/')
    ->into(\Codeception\Configuration::outputDir() . 'failedTests.txt') // absolute path with Filename
    ->run();

从报告文件加载失败的测试到组中

$result = $this
    ->taskSplitFailedTests(5)
    ->setReportPath(\Codeception\Configuration::outputDir() . 'failedTests.txt') // absoulute Path to Reportfile
    ->groupsTo(\Codeception\Configuration::outputDir() . 'group_')
    ->run();

// optionally check result data
if ($result->wasSuccessful()) {
    $filenames = $result['files'];
} 

MergeXmlReports

合并多个 XML 报告

$this->taskMergeXmlReports()
    ->from('tests/result/result1.xml')
    ->from('tests/result/result2.xml')
    ->into('tests/result/merged.xml')
    ->run();

MergeHtmlReports

合并多个 HTML 报告

$this->taskMergeHtmlReports()
    ->from('tests/result/result1.html')
    ->from('tests/result/result2.html')
    ->into('tests/result/merged.html')
    ->run();

过滤器

您可以使用自定义过滤器来选择必要的测试。

已包含两个过滤器:DefaultFilter,GroupFilter

  • DefaultFilter 默认启用,接受所有测试。
  • GroupFilter (只能用于 taskSplitTestsByGroups),允许您根据给定的组过滤加载的测试。您有声明要包含或排除的组的机会。如果您声明 foo 和 bar 为包含的,则只有同时具有这两个组注释的测试才会匹配。当您添加排除的组时,情况也是如此。如果您结合了包含和排除的组,则只有具有完全正确的包含项目组注释和没有任何排除项目的测试才会匹配。

您可以添加任意多的过滤器。FIFO(先进先出)原则适用。下一个过滤器将只获取上一个过滤器的结果。

用法

例如,您想选择所有在文档注释中有 'foo' AND 'bar' 组但不是 'baz' 组的测试,则可以这样做

$filter = new GroupFilter();
$filter
    ->groupIncluded('foo')
    ->groupIncluded('bar')
    ->groupExcluded('baz');

$this->taskSplitTestsByGroups(5)
   ->testsFrom('tests')
   ->groupsTo('tests/_data/paratest_')
   ->addFilter($filter)
   ->run();

现在创建您自己的过滤器类

<?php

declare(strict_types=1);

namespace ...;

use Codeception\Task\Filter\DefaultFilter;

class CustomFilter extends DefaultFilter {

}

The TestFileSplitterTask.php 将 SplFileInfo 对象数组推送到过滤器。
The TestsSplitterTask.php 将 SelfDescribing 对象数组推送到过滤器。

配置

在 split* 任务之前加载 Codeception 配置文件以指定 Codeception 的路径

\Codeception\Configuration::config('tests/codeception.yml');

贡献

感谢您为 codeception/robo-paracept 做出贡献!

  1. 分支此项目
  2. 安装所有依赖项
  3. 从 master 创建分支
  4. 进行更改
  5. 为您的更改扩展或创建测试
  6. 运行 composer test(这将按顺序执行代码检查、代码风格和单元测试)
  7. 打开一个合并请求

编码标准

请注意,此项目遵循PSR-12编码标准。您可以使用以下方法检查您的代码风格:

composer codestyle

单元测试

您所做的所有更改都必须通过单元测试。如果您更改了一些逻辑或添加了一些新方法,请公平地编写测试。

composer unit

许可协议 MIT