. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * Neither the name of Sebastian Bergmann nor the names of his * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @category Testing * @package PHPUnit * @author Sebastian Bergmann * @copyright 2002-2008 Sebastian Bergmann * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @version SVN: $Id: Command.php 1985 2007-12-26 18:11:55Z sb $ * @link http://www.phpunit.de/ * @since File available since Release 3.0.0 */ require_once 'PHPUnit/TextUI/TestRunner.php'; require_once 'PHPUnit/Util/Log/PMD.php'; require_once 'PHPUnit/Util/Log/TAP.php'; require_once 'PHPUnit/Util/Configuration.php'; require_once 'PHPUnit/Util/Fileloader.php'; require_once 'PHPUnit/Util/Filter.php'; require_once 'PHPUnit/Util/Getopt.php'; require_once 'PHPUnit/Util/Skeleton.php'; require_once 'PHPUnit/Util/TestDox/ResultPrinter/Text.php'; PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT'); /** * A TestRunner for the Command Line Interface (CLI) * PHP SAPI Module. * * @category Testing * @package PHPUnit * @author Sebastian Bergmann * @copyright 2002-2008 Sebastian Bergmann * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @version Release: 3.2.9 * @link http://www.phpunit.de/ * @since Class available since Release 3.0.0 */ class PHPUnit_TextUI_Command { /** * @access public * @static */ public static function main() { $arguments = self::handleArguments(); $runner = new PHPUnit_TextUI_TestRunner(); if (is_object($arguments['test']) && $arguments['test'] instanceof PHPUnit_Framework_Test) { $suite = $arguments['test']; } else { $suite = $runner->getTest($arguments['test'], $arguments['testFile'], $arguments['syntaxCheck']); } if ($suite->testAt(0) instanceof PHPUnit_Framework_Warning && strpos($suite->testAt(0)->getMessage(), 'No tests found in class') !== FALSE) { $skeleton = new PHPUnit_Util_Skeleton($arguments['test'], $arguments['testFile']); $result = $skeleton->generate(TRUE); if (! $result['incomplete']) { eval(str_replace(array(''), '', $result['code'])); $suite = new PHPUnit_Framework_TestSuite($arguments['test'] . 'Test'); } } try { $result = $runner->doRun($suite, $arguments); } catch (Exception $e) { throw new RuntimeException('Could not create and run test suite: ' . $e->getMessage()); } if ($result->wasSuccessful()) { exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); } else if ($result->errorCount() > 0) { exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } else { exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } } /** * @access protected * @static */ protected static function handleArguments() { $arguments = array('syntaxCheck' => TRUE); $longOptions = array('configuration=', 'exclude-group=', 'filter=', 'group=', 'help', 'loader=', 'log-json=', 'log-tap=', 'log-xml=', 'repeat=', 'skeleton', 'stop-on-failure', 'tap', 'testdox', 'testdox-html=', 'testdox-text=', 'no-syntax-check', 'verbose', 'version', 'wait'); if (class_exists('Image_GraphViz', FALSE)) { $longOptions[] = 'log-graphviz='; } if (extension_loaded('pdo')) { $longOptions[] = 'test-db-dsn='; $longOptions[] = 'test-db-log-rev='; $longOptions[] = 'test-db-log-prefix='; $longOptions[] = 'test-db-log-info='; } if (extension_loaded('xdebug')) { $longOptions[] = 'coverage-html='; $longOptions[] = 'coverage-xml='; $longOptions[] = 'log-metrics='; $longOptions[] = 'log-pmd='; $longOptions[] = 'report='; } try { $options = PHPUnit_Util_Getopt::getopt($_SERVER['argv'], 'd:', $longOptions); } catch (RuntimeException $e) { PHPUnit_TextUI_TestRunner::showError($e->getMessage()); } if (isset($options[1][0])) { $arguments['test'] = $options[1][0]; } if (isset($options[1][1])) { $arguments['testFile'] = $options[1][1]; } else { $arguments['testFile'] = ''; } foreach ($options[0] as $option) { switch ($option[0]) { case '--configuration': { $arguments['configuration'] = $option[1]; } break; case '--coverage-xml': { $arguments['coverageXML'] = $option[1]; } break; case 'd': { $ini = explode('=', $option[1]); if (isset($ini[0])) { if (isset($ini[1])) { ini_set($ini[0], $ini[1]); } else { ini_set($ini[0], TRUE); } } } break; case '--help': { self::showHelp(); exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); } break; case '--filter': { if (preg_match('/^[a-zA-Z0-9_]/', $option[1])) { $arguments['filter'] = '/^' . $option[1] . '$/'; } else { $arguments['filter'] = $option[1]; } } break; case '--group': { $arguments['groups'] = explode(',', $option[1]); } break; case '--exclude-group': { $arguments['excludeGroups'] = explode(',', $option[1]); } break; case '--loader': { self::handleLoader($option[1]); } break; case '--log-json': { $arguments['jsonLogfile'] = $option[1]; } break; case '--log-graphviz': { $arguments['graphvizLogfile'] = $option[1]; } break; case '--log-tap': { $arguments['tapLogfile'] = $option[1]; } break; case '--log-xml': { $arguments['xmlLogfile'] = $option[1]; } break; case '--log-pmd': { $arguments['pmdXML'] = $option[1]; } break; case '--log-metrics': { $arguments['metricsXML'] = $option[1]; } break; case '--repeat': { $arguments['repeat'] = (int)$option[1]; } break; case '--stop-on-failure': { $arguments['stopOnFailure'] = TRUE; } break; case '--test-db-dsn': { $arguments['testDatabaseDSN'] = $option[1]; } break; case '--test-db-log-rev': { $arguments['testDatabaseLogRevision'] = $option[1]; } break; case '--test-db-prefix': { $arguments['testDatabasePrefix'] = $option[1]; } break; case '--test-db-log-info': { $arguments['testDatabaseLogInfo'] = $option[1]; } break; case '--coverage-html': case '--report': { $arguments['reportDirectory'] = $option[1]; } break; case '--skeleton': { if (isset($arguments['test']) && isset($arguments['testFile'])) { self::doSkeleton($arguments['test'], $arguments['testFile']); } else { self::showHelp(); exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } } break; case '--tap': { $arguments['printer'] = new PHPUnit_Util_Log_TAP(); } break; case '--testdox': { $arguments['printer'] = new PHPUnit_Util_TestDox_ResultPrinter_Text(); } break; case '--testdox-html': { $arguments['testdoxHTMLFile'] = $option[1]; } break; case '--testdox-text': { $arguments['testdoxTextFile'] = $option[1]; } break; case '--no-syntax-check': { $arguments['syntaxCheck'] = FALSE; } break; case '--verbose': { $arguments['verbose'] = TRUE; } break; case '--version': { PHPUnit_TextUI_TestRunner::printVersionString(); exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); } break; case '--wait': { $arguments['wait'] = TRUE; } break; } } if (! isset($arguments['test']) && isset($arguments['configuration'])) { $configuration = new PHPUnit_Util_Configuration($arguments['configuration']); $testSuite = $configuration->getTestSuiteConfiguration(); if ($testSuite !== NULL) { $arguments['test'] = $testSuite; } } if (! isset($arguments['test']) || (isset($arguments['testDatabaseLogRevision']) && ! isset($arguments['testDatabaseDSN']))) { self::showHelp(); exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } return $arguments; } /** * @param string $test * @param string $testFile * @access protected * @static */ protected static function doSkeleton($test, $testFile) { if ($test !== FALSE) { PHPUnit_TextUI_TestRunner::printVersionString(); try { $skeleton = new PHPUnit_Util_Skeleton($test, $testFile); $skeleton->write(); } catch (Exception $e) { print $e->getMessage() . "\n"; printf('Could not write test class skeleton for "%s" to "%s".' . "\n", $test, $testFile); exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } printf('Wrote test class skeleton for "%s" to "%s".' . "\n", $test, $skeleton->getTestSourceFile()); exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); } } /** * @param string $loaderName * @access protected * @static */ protected static function handleLoader($loaderName) { if (! class_exists($loaderName, FALSE)) { PHPUnit_Util_Fileloader::checkAndLoad(str_replace('_', '/', $loaderName) . '.php'); } if (class_exists($loaderName, FALSE)) { $class = new ReflectionClass($loaderName); if ($class->implementsInterface('PHPUnit_Runner_TestSuiteLoader') && $class->isInstantiable()) { $loader = $class->newInstance(); } } if (! isset($loader)) { PHPUnit_TextUI_TestRunner::showError(sprintf('Could not use "%s" as loader.', $loaderName)); } PHPUnit_TextUI_TestRunner::setLoader($loader); } /** * @access public * @static */ public static function showHelp() { PHPUnit_TextUI_TestRunner::printVersionString(); print "Usage: phpunit [switches] UnitTest [UnitTest.php]\n\n"; if (class_exists('Image_GraphViz', FALSE)) { print " --log-graphviz Log test execution in GraphViz markup.\n"; } print " --log-json Log test execution in JSON format.\n" . " --log-tap Log test execution in TAP format to file.\n" . " --log-xml Log test execution in XML format to file.\n"; if (extension_loaded('xdebug')) { print " --log-metrics Write metrics report in XML format.\n" . " --log-pmd Write violations report in PMD XML format.\n\n" . " --coverage-html Generate code coverage report in HTML format.\n" . " --coverage-xml Write code coverage information in XML format.\n\n"; } if (extension_loaded('pdo')) { print " --test-db-dsn DSN for the test database.\n" . " --test-db-log-rev Revision information for database logging.\n" . " --test-db-prefix ... Prefix that should be stripped from filenames.\n" . " --test-db-log-info ... Additional information for database logging.\n\n"; } print " --testdox-html Write agile documentation in HTML format to file.\n" . " --testdox-text Write agile documentation in Text format to file.\n\n" . " --filter Filter which tests to run.\n" . " --group ... Only runs tests from the specified group(s).\n" . " --exclude-group ... Exclude tests from the specified group(s).\n\n" . " --loader TestSuiteLoader implementation to use.\n" . " --repeat Runs the test(s) repeatedly.\n\n" . " --tap Report test execution progress in TAP format.\n" . " --testdox Report test execution progress in TestDox format.\n\n" . " --no-syntax-check Disable syntax check of test source files.\n" . " --stop-on-failure Stop execution upon first error or failure.\n" . " --verbose Output more verbose information.\n" . " --wait Waits for a keystroke after each test.\n\n" . " --skeleton Generate skeleton UnitTest class for Unit in Unit.php.\n\n" . " --help Prints this usage information.\n" . " --version Prints the version and exits.\n\n" . " --configuration Read configuration from XML file.\n" . " -d key[=value] Sets a php.ini value.\n"; } } define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main'); PHPUnit_TextUI_Command::main(); ?>