2014-04-23 10:51:50 +08:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* TestRunner for CakePHP Test suite.
|
|
|
|
*
|
2018-03-18 09:24:15 +08:00
|
|
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
|
|
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
2014-04-23 10:51:50 +08:00
|
|
|
*
|
|
|
|
* Licensed under The MIT License
|
|
|
|
* For full copyright and license information, please see the LICENSE.txt
|
|
|
|
* Redistributions of files must retain the above copyright notice.
|
|
|
|
*
|
2018-03-18 09:24:15 +08:00
|
|
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
|
|
|
* @link https://cakephp.org CakePHP(tm) Project
|
2014-04-23 10:51:50 +08:00
|
|
|
* @package Cake.TestSuite
|
|
|
|
* @since CakePHP(tm) v 2.0
|
2018-03-18 09:24:15 +08:00
|
|
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
2014-04-23 10:51:50 +08:00
|
|
|
*/
|
|
|
|
|
2018-03-18 09:24:15 +08:00
|
|
|
if (!class_exists('PHPUnit_TextUI_Command')) {
|
2016-02-25 20:25:24 +08:00
|
|
|
require_once 'PHPUnit/TextUI/Command.php';
|
|
|
|
}
|
2014-04-23 10:51:50 +08:00
|
|
|
|
|
|
|
App::uses('CakeTestRunner', 'TestSuite');
|
|
|
|
App::uses('CakeTestLoader', 'TestSuite');
|
|
|
|
App::uses('CakeTestSuite', 'TestSuite');
|
|
|
|
App::uses('CakeTestCase', 'TestSuite');
|
|
|
|
App::uses('ControllerTestCase', 'TestSuite');
|
|
|
|
App::uses('CakeTestModel', 'TestSuite/Fixture');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Class to customize loading of test suites from CLI
|
|
|
|
*
|
|
|
|
* @package Cake.TestSuite
|
|
|
|
*/
|
|
|
|
class CakeTestSuiteCommand extends PHPUnit_TextUI_Command {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Construct method
|
|
|
|
*
|
2016-02-25 20:25:24 +08:00
|
|
|
* @param mixed $loader The loader instance to use.
|
2014-04-23 10:51:50 +08:00
|
|
|
* @param array $params list of options to be used for this run
|
|
|
|
* @throws MissingTestLoaderException When a loader class could not be found.
|
|
|
|
*/
|
|
|
|
public function __construct($loader, $params = array()) {
|
|
|
|
if ($loader && !class_exists($loader)) {
|
|
|
|
throw new MissingTestLoaderException(array('class' => $loader));
|
|
|
|
}
|
|
|
|
$this->arguments['loader'] = $loader;
|
|
|
|
$this->arguments['test'] = $params['case'];
|
|
|
|
$this->arguments['testFile'] = $params;
|
|
|
|
$this->_params = $params;
|
|
|
|
|
|
|
|
$this->longOptions['fixture='] = 'handleFixture';
|
|
|
|
$this->longOptions['output='] = 'handleReporter';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Ugly hack to get around PHPUnit having a hard coded class name for the Runner. :(
|
|
|
|
*
|
2016-02-25 20:25:24 +08:00
|
|
|
* @param array $argv The command arguments
|
|
|
|
* @param bool $exit The exit mode.
|
2014-04-23 10:51:50 +08:00
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function run(array $argv, $exit = true) {
|
|
|
|
$this->handleArguments($argv);
|
|
|
|
|
|
|
|
$runner = $this->getRunner($this->arguments['loader']);
|
|
|
|
|
|
|
|
if (is_object($this->arguments['test']) &&
|
|
|
|
$this->arguments['test'] instanceof PHPUnit_Framework_Test) {
|
|
|
|
$suite = $this->arguments['test'];
|
|
|
|
} else {
|
|
|
|
$suite = $runner->getTest(
|
|
|
|
$this->arguments['test'],
|
|
|
|
$this->arguments['testFile']
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->arguments['listGroups']) {
|
|
|
|
PHPUnit_TextUI_TestRunner::printVersionString();
|
|
|
|
|
|
|
|
print "Available test group(s):\n";
|
|
|
|
|
|
|
|
$groups = $suite->getGroups();
|
|
|
|
sort($groups);
|
|
|
|
|
|
|
|
foreach ($groups as $group) {
|
|
|
|
print " - $group\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
|
|
|
|
}
|
|
|
|
|
|
|
|
unset($this->arguments['test']);
|
|
|
|
unset($this->arguments['testFile']);
|
|
|
|
|
|
|
|
try {
|
|
|
|
$result = $runner->doRun($suite, $this->arguments);
|
|
|
|
} catch (PHPUnit_Framework_Exception $e) {
|
|
|
|
print $e->getMessage() . "\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($exit) {
|
|
|
|
if (isset($result) && $result->wasSuccessful()) {
|
|
|
|
exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
|
|
|
|
} elseif (!isset($result) || $result->errorCount() > 0) {
|
|
|
|
exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
|
|
|
|
}
|
|
|
|
exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a runner for the command.
|
|
|
|
*
|
|
|
|
* @param mixed $loader The loader to be used for the test run.
|
|
|
|
* @return CakeTestRunner
|
|
|
|
*/
|
|
|
|
public function getRunner($loader) {
|
|
|
|
return new CakeTestRunner($loader, $this->_params);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handler for customizing the FixtureManager class/
|
|
|
|
*
|
|
|
|
* @param string $class Name of the class that will be the fixture manager
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function handleFixture($class) {
|
|
|
|
$this->arguments['fixtureManager'] = $class;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles output flag used to change printing on webrunner.
|
|
|
|
*
|
2016-02-25 20:25:24 +08:00
|
|
|
* @param string $reporter The reporter class to use.
|
2014-04-23 10:51:50 +08:00
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function handleReporter($reporter) {
|
|
|
|
$object = null;
|
|
|
|
|
|
|
|
$reporter = ucwords($reporter);
|
|
|
|
$coreClass = 'Cake' . $reporter . 'Reporter';
|
|
|
|
App::uses($coreClass, 'TestSuite/Reporter');
|
|
|
|
|
|
|
|
$appClass = $reporter . 'Reporter';
|
|
|
|
App::uses($appClass, 'TestSuite/Reporter');
|
|
|
|
|
|
|
|
if (!class_exists($appClass)) {
|
|
|
|
$object = new $coreClass(null, $this->_params);
|
|
|
|
} else {
|
|
|
|
$object = new $appClass(null, $this->_params);
|
|
|
|
}
|
|
|
|
return $this->arguments['printer'] = $object;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|