18 private $suiteConfig = [];
42 "Please provide the argument '--time' to the robo command in order to".
43 " generate grouped tests manifests for a parallel execution" 48 $splitSuiteNamesToTests = $this->createGroupsWithinSuites($suiteConfiguration, $time);
49 $splitSuiteNamesToSize = $this->getSuiteToSize($splitSuiteNamesToTests);
50 arsort($testNameToSize);
51 arsort($splitSuiteNamesToSize);
53 $testNameToSizeForUse = $testNameToSize;
56 foreach ($splitSuiteNamesToSize as $testName => $testSize) {
57 $testGroups[$nodeNumber] = [$testName => $testSize];
61 foreach ($testNameToSize as $testName => $testSize) {
62 if (!array_key_exists($testName, $testNameToSizeForUse)) {
67 $testGroup = $this->createTestGroup($time, $testName, $testSize, $testNameToSizeForUse);
68 $testGroups[$nodeNumber] = $testGroup;
71 $testNameToSizeForUse = array_diff_key($testNameToSizeForUse, $testGroup);
85 if (empty($this->suiteConfig)) {
89 return $this->suiteConfig;
103 private function createTestGroup($timeMaximum, $testName, $testSize, $testNameToSizeForUse)
105 $group[$testName] = $testSize;
107 if ($testSize < $timeMaximum) {
108 while (array_sum(
$group) < $timeMaximum && !empty($testNameToSizeForUse)) {
109 $groupSize = array_sum(
$group);
110 $lineGoal = $timeMaximum - $groupSize;
112 $testNameForUse = $this->getClosestLineCount($testNameToSizeForUse, $lineGoal);
113 if ($testNameToSizeForUse[$testNameForUse] < $lineGoal) {
114 $testSizeForUse = $testNameToSizeForUse[$testNameForUse];
115 $group[$testNameForUse] = $testSizeForUse;
118 unset($testNameToSizeForUse[$testNameForUse]);
133 private function getClosestLineCount($testGroup, $desiredValue)
135 $winner = key($testGroup);
136 $closestThreshold = $desiredValue;
137 foreach ($testGroup as $testName => $testValue) {
139 $testThreshold = $desiredValue - $testValue;
143 if ($closestThreshold > $testThreshold && $testThreshold > 0) {
144 $closestThreshold = $testThreshold;
160 private function createGroupsWithinSuites($suiteConfiguration, $lineLimit)
162 $suiteNameToTestSize = $this->getSuiteNameToTestSize($suiteConfiguration);
163 $suiteNameToSize = $this->getSuiteToSize($suiteNameToTestSize);
166 $suitesForResize = array_filter($suiteNameToSize,
function ($val) use ($lineLimit) {
167 return $val > $lineLimit;
171 $remainingSuites = array_diff_key($suiteNameToTestSize, $suitesForResize);
173 foreach ($remainingSuites as $remainingSuite => $tests) {
174 $this->addSuiteToConfig($remainingSuite,
null, $tests);
177 $resultingGroups = [];
178 foreach ($suitesForResize as $suiteName => $suiteSize) {
179 $resultingGroups = array_merge(
181 $this->splitTestSuite($suiteName, $suiteNameToTestSize[$suiteName], $lineLimit)
186 return array_merge($remainingSuites, $resultingGroups);
195 private function getSuiteNameToTestSize($suiteConfiguration)
197 $suiteNameToTestSize = [];
198 foreach ($suiteConfiguration as $suite => $test) {
199 foreach ($test as $testName) {
201 ->getObject($testName)
202 ->getEstimatedDuration();
206 return $suiteNameToTestSize;
217 private function getSuiteToSize($suiteNamesToTests)
219 $suiteNamesToSize = [];
220 foreach ($suiteNamesToTests as
$name => $tests) {
221 $size = array_sum($tests);
222 $suiteNamesToSize[
$name] = $size;
225 return $suiteNamesToSize;
242 private function splitTestSuite($suiteName, $tests, $maxTime)
246 $availableTests = $tests;
249 foreach ($tests as $test => $size) {
250 if (!array_key_exists($test, $availableTests)) {
254 $group = $this->createTestGroup($maxTime, $test, $size, $availableTests);
255 $splitSuites[
"{$suiteName}_${splitCount}"] =
$group;
256 $this->addSuiteToConfig($suiteName,
"{$suiteName}_${splitCount}",
$group);
258 $availableTests = array_diff_key($availableTests,
$group);
275 private function addSuiteToConfig($originalSuiteName, $newSuiteName, $tests)
277 if ($newSuiteName ==
null) {
278 $this->suiteConfig[$originalSuiteName] = array_keys($tests);
282 $this->suiteConfig[$originalSuiteName][$newSuiteName] = array_keys($tests);
getTestsGroupedBySize($suiteConfiguration, $testNameToSize, $time)
getResultingSuiteConfig()
if(!isset($_GET['name'])) $name