/** * Renders the report. * * @param PHPUnit_Framework_TestResult $result * @param string $target * @param string $charset * @param boolean $yui * @param boolean $highlight * @param integer $lowUpperBound * @param integer $highLowerBound * @access public * @static */ public static function render(PHPUnit_Framework_TestResult $result, $target, $charset = 'ISO-8859-1', $yui = TRUE, $highlight = FALSE, $lowUpperBound = 35, $highLowerBound = 70) { self::$templatePath = sprintf('%s%sReport%sTemplate%s', dirname(__FILE__), DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR); $codeCoverageInformation = $result->getCodeCoverageInformation(); $files = PHPUnit_Util_CodeCoverage::getSummary($codeCoverageInformation); $commonPath = self::reducePaths($files); $items = self::buildDirectoryStructure($files); $root = new PHPUnit_Util_Report_Node_Directory($commonPath, NULL); self::addItems($root, $items, $files, $yui, $highlight); self::copyFiles($target); $root->render($target, $result->topTestSuite()->getName(), $charset, $highlight, $lowUpperBound, $highLowerBound); }
/** * Overwrites aferRunTests. Creates coverage report and clover report * if required. */ protected function aferRunTests() { if ($this->getCoverageStatus()) { if (!file_exists(ASSETS_PATH . '/coverage-report')) { mkdir(ASSETS_PATH . '/coverage-report'); } $ret = PHPUnit_Util_Report::render($this->getFrameworkTestResults(), ASSETS_PATH . '/coverage-report/'); $coverageApp = ASSETS_PATH . '/coverage-report/' . preg_replace('/[^A-Za-z0-9]/', '_', preg_replace('/(\\/$)|(^\\/)/', '', Director::baseFolder())) . '.html'; $coverageTemplates = ASSETS_PATH . '/coverage-report/' . preg_replace('/[^A-Za-z0-9]/', '_', preg_replace('/(\\/$)|(^\\/)/', '', realpath(TEMP_FOLDER))) . '.html'; echo "<p>Coverage reports available here:<ul>\n\t\t\t\t<li><a href=\"{$coverageApp}\">Coverage report of the application</a></li>\n\t\t\t\t<li><a href=\"{$coverageTemplates}\">Coverage report of the templates</a></li>\n\t\t\t</ul>"; } }
/** * @param array $classList * @param boolean $coverage */ function runTests($classList, $coverage = false) { $startTime = microtime(true); // XDEBUG seem to cause problems with test execution :-( if (function_exists('xdebug_disable')) { xdebug_disable(); } ini_set('max_execution_time', 0); $this->setUp(); // Optionally skip certain tests $skipTests = array(); if ($this->request->getVar('SkipTests')) { $skipTests = explode(',', $this->request->getVar('SkipTests')); } $classList = array_diff($classList, $skipTests); // run tests before outputting anything to the client $suite = new PHPUnit_Framework_TestSuite(); natcasesort($classList); foreach ($classList as $className) { // Ensure that the autoloader pulls in the test class, as PHPUnit won't know how to do this. class_exists($className); $suite->addTest(new SapphireTestSuite($className)); } // Remove the error handler so that PHPUnit can add its own restore_error_handler(); /*, array("reportDirectory" => "/Users/sminnee/phpunit-report")*/ if (Director::is_cli()) { $reporter = new CliTestReporter(); } else { $reporter = new SapphireTestReporter(); } self::$default_reporter->writeHeader("Sapphire Test Runner"); if (count($classList) > 1) { self::$default_reporter->writeInfo("All Tests", "Running test cases: ", implode(", ", $classList)); } else { self::$default_reporter->writeInfo($classList[0], ""); } $results = new PHPUnit_Framework_TestResult(); $results->addListener($reporter); if ($coverage === true) { foreach (self::$coverage_filter_dirs as $dir) { PHPUnit_Util_Filter::addDirectoryToFilter(BASE_PATH . '/' . $dir); } $results->collectCodeCoverageInformation(true); $suite->run($results); if (!file_exists(ASSETS_PATH . '/coverage-report')) { mkdir(ASSETS_PATH . '/coverage-report'); } PHPUnit_Util_Report::render($results, ASSETS_PATH . '/coverage-report/'); $coverageApp = ASSETS_PATH . '/coverage-report/' . preg_replace('/[^A-Za-z0-9]/', '_', preg_replace('/(\\/$)|(^\\/)/', '', Director::baseFolder())) . '.html'; $coverageTemplates = ASSETS_PATH . '/coverage-report/' . preg_replace('/[^A-Za-z0-9]/', '_', preg_replace('/(\\/$)|(^\\/)/', '', realpath(TEMP_FOLDER))) . '.html'; echo "<p>Coverage reports available here:<ul>\n\t\t\t\t<li><a href=\"{$coverageApp}\">Coverage report of the application</a></li>\n\t\t\t\t<li><a href=\"{$coverageTemplates}\">Coverage report of the templates</a></li>\n\t\t\t</ul>"; } else { $suite->run($results); } if (!Director::is_cli()) { echo '<div class="trace">'; } $reporter->writeResults(); $endTime = microtime(true); if (Director::is_cli()) { echo "\n\nTotal time: " . round($endTime - $startTime, 3) . " seconds\n"; } else { echo "<p>Total time: " . round($endTime - $startTime, 3) . " seconds</p>\n"; } if (!Director::is_cli()) { echo '</div>'; } // Put the error handlers back Debug::loadErrorHandlers(); if (!Director::is_cli()) { self::$default_reporter->writeFooter(); } $this->tearDown(); // Todo: we should figure out how to pass this data back through Director more cleanly if (Director::is_cli() && $results->failureCount() + $results->errorCount() > 0) { exit(2); } }
/** * Generate a report using the specified $temp_path * * @param array $groups Groups to test * @param string $temp_path Temporary path to use while generating report */ public function generate_report(array $groups, $temp_path, $create_sub_dir = TRUE) { if (!is_writable($temp_path)) { throw new Kohana_Exception('Temp path :path does not exist or is not writable by the webserver', array(':path' => $temp_path)); } $folder_path = $temp_path; if ($create_sub_dir === TRUE) { // Icky, highly unlikely, but do it anyway // Basically adds "(n)" to the end of the filename until there's a free file $count = 0; do { $folder_name = date('Y-m-d_H:i:s') . (empty($groups) ? '' : '[' . implode(',', $groups) . ']') . ($count > 0 ? '(' . $count . ')' : ''); ++$count; } while (is_dir($folder_path . $folder_name)); $folder_path .= $folder_name; mkdir($folder_path, 0777); } else { $folder_name = basename($folder_path); } $this->run($groups, TRUE); require_once 'PHPUnit/Runner/Version.php'; require_once 'PHPUnit/Util/Report.php'; PHPUnit_Util_Report::render($this->result, $folder_path); return array($folder_path, $folder_name); }
/** * Main function - runs the tests and outputs HTML code * * @return void * @author Robert Lemke <*****@*****.**> * @author Karsten Dambekalns <*****@*****.**> * @internal Preliminary solution - there surely will be nicer ways to implement a test runner */ public function run() { $this->renderPageHeader(); $this->renderTestForm(); if (!empty($this->packageKey)) { $testcaseFileNamesAndPaths = $this->getTestcaseFilenames(); if (count($testcaseFileNamesAndPaths) > 0) { $this->renderInfoAndProgressbar(); $this->requireTestCaseFiles($testcaseFileNamesAndPaths); $testListener = new \F3\Testing\TestListener(); $testListener->baseUri = $this->request->getBaseUri(); $testResult = new \PHPUnit_Framework_TestResult(); $testResult->addListener($testListener); $testResult->collectCodeCoverageInformation($this->collectCodeCoverage); $startTime = microtime(TRUE); foreach (get_declared_classes() as $className) { if (substr($className, -4, 4) == 'Test') { $class = new \ReflectionClass($className); if ($class->isSubclassOf('PHPUnit_Framework_TestCase') && substr($className, 0, 8) !== 'PHPUnit_') { $testSuite = new \PHPUnit_Framework_TestSuite($class); $testSuite->run($testResult); } } } $endTime = microtime(TRUE); // Display test statistics: if ($testResult->wasSuccessful()) { echo '<script type="text/javascript">document.getElementById("progress-bar").style.backgroundColor = "green";document.getElementById("progress-bar").style.backgroundImage = "none";</script> <h1 class="success">SUCCESS</h1> ' . $testResult->count() . ' tests, ' . $testResult->failureCount() . ' failures, ' . $testResult->errorCount() . ' errors. </h1>'; } else { echo ' <script>document.getElementById("progress-bar").style.backgroundColor = "red";document.getElementById("progress-bar").style.backgroundImage = "none";</script> <h1 class="failure">FAILURE</h1> ' . $testResult->count() . ' tests, ' . $testResult->failureCount() . ' failures, ' . $testResult->errorCount() . ' errors. '; } echo '<p>Peak memory usage was: ~' . floor(memory_get_peak_usage() / 1024 / 1024) . ' MByte.<br />'; echo 'Test run took ' . round($endTime - $startTime, 4) . ' seconds.</p>'; if ($this->collectCodeCoverage === TRUE) { \F3\FLOW3\Utility\Files::emptyDirectoryRecursively($this->coverageOutputPath); \PHPUnit_Util_Report::render($testResult, $this->coverageOutputPath); echo '<a href="_Resources/CodeCoverageReport/index.html">See code coverage report...</a>'; } } else { echo '<p>No testcase found. Did you specify the intended pattern?</p>'; } } $this->renderPageFooter(); }
/** * @param PHPUnit_Framework_Test $suite * @param array $arguments * @return PHPUnit_Framework_TestResult */ public function doRun(PHPUnit_Framework_Test $suite, array $arguments = array()) { $this->handleConfiguration($arguments); if (isset($arguments['bootstrap'])) { require_once $arguments['bootstrap']; } if (is_integer($arguments['repeat'])) { $suite = new PHPUnit_Extensions_RepeatedTest($suite, $arguments['repeat'], $arguments['filter'], $arguments['groups'], $arguments['excludeGroups']); } $result = $this->createTestResult(); if (!$arguments['convertErrorsToExceptions']) { $result->convertErrorsToExceptions(FALSE); } if (!$arguments['convertNoticesToExceptions']) { PHPUnit_Framework_Error_Notice::$enabled = FALSE; } if (!$arguments['convertWarningsToExceptions']) { PHPUnit_Framework_Error_Warning::$enabled = FALSE; } if ($arguments['stopOnFailure']) { $result->stopOnFailure(TRUE); } if ($this->printer === NULL) { if (isset($arguments['printer']) && $arguments['printer'] instanceof PHPUnit_Util_Printer) { $this->printer = $arguments['printer']; } else { $this->printer = new PHPUnit_TextUI_ResultPrinter(NULL, $arguments['verbose'], $arguments['ansi']); } } $this->printer->write(PHPUnit_Runner_Version::getVersionString() . "\n\n"); foreach ($arguments['listeners'] as $listener) { $result->addListener($listener); } $result->addListener($this->printer); if (isset($arguments['storyHTMLFile'])) { require_once 'PHPUnit/Extensions/Story/ResultPrinter/HTML.php'; $result->addListener(new PHPUnit_Extensions_Story_ResultPrinter_HTML($arguments['storyHTMLFile'])); } if (isset($arguments['storyTextFile'])) { require_once 'PHPUnit/Extensions/Story/ResultPrinter/Text.php'; $result->addListener(new PHPUnit_Extensions_Story_ResultPrinter_Text($arguments['storyTextFile'])); } if (isset($arguments['testdoxHTMLFile'])) { require_once 'PHPUnit/Util/TestDox/ResultPrinter/HTML.php'; $result->addListener(new PHPUnit_Util_TestDox_ResultPrinter_HTML($arguments['testdoxHTMLFile'])); } if (isset($arguments['testdoxTextFile'])) { require_once 'PHPUnit/Util/TestDox/ResultPrinter/Text.php'; $result->addListener(new PHPUnit_Util_TestDox_ResultPrinter_Text($arguments['testdoxTextFile'])); } if (isset($arguments['graphvizLogfile'])) { if (PHPUnit_Util_Filesystem::fileExistsInIncludePath('Image/GraphViz.php')) { require_once 'PHPUnit/Util/Log/GraphViz.php'; $result->addListener(new PHPUnit_Util_Log_GraphViz($arguments['graphvizLogfile'])); } } if ((isset($arguments['coverageClover']) || isset($arguments['coverageSource']) || isset($arguments['metricsXML']) || isset($arguments['pmdXML']) || isset($arguments['reportDirectory'])) && extension_loaded('xdebug')) { $result->collectCodeCoverageInformation(TRUE); } if (isset($arguments['jsonLogfile'])) { require_once 'PHPUnit/Util/Log/JSON.php'; $result->addListener(new PHPUnit_Util_Log_JSON($arguments['jsonLogfile'])); } if (isset($arguments['tapLogfile'])) { require_once 'PHPUnit/Util/Log/TAP.php'; $result->addListener(new PHPUnit_Util_Log_TAP($arguments['tapLogfile'])); } if (isset($arguments['xmlLogfile'])) { require_once 'PHPUnit/Util/Log/XML.php'; $result->addListener(new PHPUnit_Util_Log_XML($arguments['xmlLogfile'], $arguments['logIncompleteSkipped'])); } if (isset($arguments['testDatabaseDSN']) && isset($arguments['testDatabaseLogRevision']) && extension_loaded('pdo')) { $writeToTestDatabase = TRUE; } else { $writeToTestDatabase = FALSE; } if ($writeToTestDatabase) { $dbh = PHPUnit_Util_PDO::factory($arguments['testDatabaseDSN']); require_once 'PHPUnit/Util/Log/Database.php'; $dbListener = PHPUnit_Util_Log_Database::getInstance($dbh, $arguments['testDatabaseLogRevision'], isset($arguments['testDatabaseLogInfo']) ? $arguments['testDatabaseLogInfo'] : ''); $result->addListener($dbListener); $result->collectCodeCoverageInformation(TRUE); } $suite->run($result, $arguments['filter'], $arguments['groups'], $arguments['excludeGroups']); $result->flushListeners(); if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) { $this->printer->printResult($result); } if (extension_loaded('tokenizer') && extension_loaded('xdebug')) { if (isset($arguments['coverageClover'])) { $this->printer->write("\nWriting code coverage data to XML file, this may take a moment."); require_once 'PHPUnit/Util/Log/CodeCoverage/XML/Clover.php'; $writer = new PHPUnit_Util_Log_CodeCoverage_XML_Clover($arguments['coverageClover']); $writer->process($result); $this->printer->write("\n"); } if (isset($arguments['coverageSource'])) { $this->printer->write("\nWriting code coverage data to XML files, this may take a moment."); require_once 'PHPUnit/Util/Log/CodeCoverage/XML/Source.php'; $writer = new PHPUnit_Util_Log_CodeCoverage_XML_Source($arguments['coverageSource']); $writer->process($result); $this->printer->write("\n"); } if ($writeToTestDatabase) { $this->printer->write("\nStoring code coverage and software metrics data in database.\nThis may take a moment."); require_once 'PHPUnit/Util/Log/CodeCoverage/Database.php'; $testDb = new PHPUnit_Util_Log_CodeCoverage_Database($dbh); $testDb->storeCodeCoverage($result, $dbListener->getRunId(), $arguments['testDatabaseLogRevision'], $arguments['testDatabasePrefix']); $this->printer->write("\n"); } if (isset($arguments['metricsXML'])) { $this->printer->write("\nWriting metrics report XML file, this may take a moment."); require_once 'PHPUnit/Util/Log/Metrics.php'; $writer = new PHPUnit_Util_Log_Metrics($arguments['metricsXML']); $writer->process($result); $this->printer->write("\n"); } if (isset($arguments['pmdXML'])) { require_once 'PHPUnit/Util/Log/PMD.php'; $writer = new PHPUnit_Util_Log_PMD($arguments['pmdXML'], $arguments['pmd']); $this->printer->write("\nWriting violations report XML file, this may take a moment."); $writer->process($result); require_once 'PHPUnit/Util/Log/CPD.php'; $writer = new PHPUnit_Util_Log_CPD(str_replace('.xml', '-cpd.xml', $arguments['pmdXML'])); $writer->process($result, $arguments['cpdMinLines'], $arguments['cpdMinMatches']); $this->printer->write("\n"); } if (isset($arguments['reportDirectory'])) { $this->printer->write("\nGenerating code coverage report, this may take a moment."); unset($suite); PHPUnit_Util_Report::render($result, $arguments['reportDirectory'], $arguments['reportCharset'], $arguments['reportYUI'], $arguments['reportHighlight'], $arguments['reportLowUpperBound'], $arguments['reportHighLowerBound']); $this->printer->write("\n"); } } $this->pause($arguments['wait']); return $result; }
/** * @param array $items * @param boolean $includeDetails * @return string * @access protected */ protected function doRenderItems(array $items, $includeDetails) { $result = ''; foreach ($items as $item) { $itemTemplate = new PHPUnit_Util_Template(PHPUnit_Util_Report::getTemplatePath() . 'coverage_item.html'); $details = ''; if ($includeDetails) { foreach ($item->getCoveringTests() as $suite => $tests) { $detailsHeaderTemplate = new PHPUnit_Util_Template(PHPUnit_Util_Report::getTemplatePath() . 'coverage_item_details_header.html'); $detailsHeaderTemplate->setVar('link', sprintf('<a href="%s-test.html">%s</a>', PHPUnit_Util_Filesystem::getSafeFilename($suite), $suite)); $details .= $detailsHeaderTemplate->render(); foreach ($tests as $test => $_test) { $detailsTemplate = new PHPUnit_Util_Template(PHPUnit_Util_Report::getTemplatePath() . 'coverage_item_details.html'); if ($_test['object']->getResult() !== PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { $failure = sprintf('<br /><pre>%s</pre>', htmlspecialchars($_test['object']->getResult()->exceptionMessage())); } else { $failure = ''; } $detailsTemplate->setVar(array('item', 'executed_percent', 'executed_lines', 'executable_lines'), array($test . $failure, sprintf('%01.2f', $_test['numLinesExecuted'] / $item->getNumExecutableLines() * 100), $_test['numLinesExecuted'], $item->getNumExecutableLines())); $details .= $detailsTemplate->render(); } } } $floorPercent = floor($item->getExecutedPercent()); if ($floorPercent < self::LOW_UPPER_BOUND) { $color = 'scarlet_red'; $level = 'Lo'; } else { if ($floorPercent >= self::LOW_UPPER_BOUND && $floorPercent < self::HIGH_LOWER_BOUND) { $color = 'butter'; $level = 'Med'; } else { $color = 'chameleon'; $level = 'Hi'; } } $itemTemplate->setVar(array('link', 'color', 'level', 'executed_width', 'executed_percent', 'not_executed_width', 'executable_lines', 'executed_lines', 'details'), array($item->getLink(FALSE, FALSE), $color, $level, floor($item->getExecutedPercent()), $item->getExecutedPercent(), 100 - floor($item->getExecutedPercent()), $item->getNumExecutableLines(), $item->getNumExecutedLines(), $details)); $result .= $itemTemplate->render(); } return $result; }
/** * Generate a report using the specified $temp_path * * @param string $temp_path Temporary path to use while generating report * @param string $format */ public function generate_report(array $groups, $temp_path, $format) { if (!is_writable($temp_path)) { throw new Kohana_Exception('Temp path :path does not exist or is not writable by the webserver', array(':path' => $temp_path)); } // Icky, highly unlikely, but do it anyway $count = 0; do { $folder_name = date('Y-m-d_H:i:s') . (!empty($groups) ? '[' . implode(',', $groups) . ']' : '') . ($count > 0 ? '(' . $count . ')' : ''); ++$count; } while (is_dir($temp_path . $folder_name)); $folder = $temp_path . $folder_name; mkdir($folder, 0777); $this->run($groups, TRUE); require_once 'PHPUnit/Runner/Version.php'; switch ($format) { // Not implmeneted yet.. case 'PHPUnit_Util_Log_CodeCoverage_XML_Clover': case 'PHPUnit_Util_Log_CodeCoverage_XML_Source': case 'PHPUnit_Util_Report': default: require_once 'PHPUnit/Util/Report' . EXT; PHPUnit_Util_Report::render($this->result, $folder); break; } return array($folder, $folder_name); }
/** * @param PHPUnit_Framework_Test $suite * @param array $parameters * @return PHPUnit_Framework_TestResult * @access public */ public function doRun(PHPUnit_Framework_Test $suite, array $parameters = array()) { $parameters['filter'] = isset($parameters['filter']) ? $parameters['filter'] : FALSE; $parameters['stopOnFailure'] = isset($parameters['stopOnFailure']) ? $parameters['stopOnFailure'] : FALSE; $parameters['repeat'] = isset($parameters['repeat']) ? $parameters['repeat'] : FALSE; $parameters['verbose'] = isset($parameters['verbose']) ? $parameters['verbose'] : FALSE; $parameters['wait'] = isset($parameters['wait']) ? $parameters['wait'] : FALSE; if (is_integer($parameters['repeat'])) { $suite = new PHPUnit_Extensions_RepeatedTest($suite, $parameters['repeat']); } if (isset($parameters['reportDirectory'])) { $parameters['reportDirectory'] = $this->getDirectory($parameters['reportDirectory']); } $result = $this->createTestResult(); if ($parameters['stopOnFailure']) { $result->stopOnFailure(TRUE); } if ($this->printer === NULL) { if (isset($parameters['printer']) && $parameters['printer'] instanceof PHPUnit_Util_Printer) { $this->printer = $parameters['printer']; } else { $this->printer = new PHPUnit_TextUI_ResultPrinter(NULL, $parameters['verbose']); } } $this->printer->write(PHPUnit_Runner_Version::getVersionString() . "\n\n"); $result->addListener($this->printer); if (isset($parameters['testdoxHTMLFile'])) { $result->addListener(PHPUnit_Util_TestDox_ResultPrinter::factory('HTML', $parameters['testdoxHTMLFile'])); } if (isset($parameters['testdoxTextFile'])) { $result->addListener(PHPUnit_Util_TestDox_ResultPrinter::factory('Text', $parameters['testdoxTextFile'])); } if (isset($parameters['graphvizLogfile'])) { if (class_exists('Image_GraphViz', FALSE)) { $result->addListener(new PHPUnit_Util_Log_GraphViz($parameters['graphvizLogfile'])); } } if (isset($parameters['reportDirectory']) && extension_loaded('xdebug')) { if (class_exists('Image_GraphViz', FALSE)) { $result->addListener(new PHPUnit_Util_Report_GraphViz($parameters['reportDirectory'])); } $result->addListener(new PHPUnit_TextUI_ResultPrinter($parameters['reportDirectory'] . '/logfile.txt', TRUE)); $result->addListener(new PHPUnit_Util_Log_XML($parameters['reportDirectory'] . '/logfile.xml')); $result->addListener(new PHPUnit_Util_Log_TAP($parameters['reportDirectory'] . '/logfile.tap')); $result->collectCodeCoverageInformation(TRUE); } if (isset($parameters['jsonLogfile'])) { $result->addListener(new PHPUnit_Util_Log_JSON($parameters['jsonLogfile'])); } if (isset($parameters['tapLogfile'])) { $result->addListener(new PHPUnit_Util_Log_TAP($parameters['tapLogfile'])); } if (isset($parameters['xmlLogfile'])) { $result->addListener(new PHPUnit_Util_Log_XML($parameters['xmlLogfile'])); } if (isset($parameters['testDatabaseDSN']) && isset($parameters['testDatabaseLogRevision']) && extension_loaded('pdo')) { $writeToTestDatabase = TRUE; } else { $writeToTestDatabase = FALSE; } if ($writeToTestDatabase) { $dbh = new PDO($parameters['testDatabaseDSN']); $dbListener = PHPUnit_Util_Log_Database::getInstance($dbh, $parameters['testDatabaseLogRevision'], isset($parameters['testDatabaseLogInfo']) ? $parameters['testDatabaseLogInfo'] : ''); $result->addListener($dbListener); $result->collectCodeCoverageInformation(TRUE); } $suite->run($result, $parameters['filter']); $result->flushListeners(); if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) { $this->printer->printResult($result); } if ($writeToTestDatabase && extension_loaded('xdebug')) { $this->printer->write("\nStoring code coverage data in database, this may take a moment."); $testDb = new PHPUnit_Util_Database($dbh); $testDb->storeCodeCoverage($result, $parameters['testDatabaseLogRevision']); $this->printer->write("\n"); } if (isset($parameters['reportDirectory']) && extension_loaded('xdebug')) { $this->printer->write("\nGenerating report, this may take a moment."); PHPUnit_Util_Report::render($result, $parameters['reportDirectory']); $this->printer->write("\n"); } $this->pause($parameters['wait']); return $result; }
function runTests($classList, $coverage = false) { // XDEBUG seem to cause problems with test execution :-( if(function_exists('xdebug_disable')) xdebug_disable(); ini_set('max_execution_time', 0); $this->setUp(); // run tests before outputting anything to the client $suite = new PHPUnit_Framework_TestSuite(); foreach($classList as $className) { // Ensure that the autoloader pulls in the test class, as PHPUnit won't know how to do this. class_exists($className); $suite->addTest(new PHPUnit_Framework_TestSuite($className)); } // Remove the error handler so that PHPUnit can add its own restore_error_handler(); /*, array("reportDirectory" => "/Users/sminnee/phpunit-report")*/ if(Director::is_cli()) $reporter = new CliTestReporter(); else $reporter = new SapphireTestReporter(); self::$default_reporter->writeHeader("Sapphire Test Runner"); if (count($classList) > 1) { self::$default_reporter->writeInfo("All Tests", "Running test cases: " . implode(", ", $classList)); } else { self::$default_reporter->writeInfo($classList[0], ""); } $results = new PHPUnit_Framework_TestResult(); $results->addListener($reporter); if($coverage) { $results->collectCodeCoverageInformation(true); $suite->run($results); if(!file_exists(ASSETS_PATH . '/coverage-report')) mkdir(ASSETS_PATH . '/coverage-report'); PHPUnit_Util_Report::render($results, ASSETS_PATH . '/coverage-report/'); $coverageApp = ASSETS_PATH . '/coverage-report/' . preg_replace('/[^A-Za-z0-9]/','_',preg_replace('/(\/$)|(^\/)/','',Director::baseFolder())) . '.html'; $coverageTemplates = ASSETS_PATH . '/coverage-report/' . preg_replace('/[^A-Za-z0-9]/','_',preg_replace('/(\/$)|(^\/)/','',realpath(TEMP_FOLDER))) . '.html'; echo "<p>Coverage reports available here:<ul> <li><a href=\"$coverageApp\">Coverage report of the application</a></li> <li><a href=\"$coverageTemplates\">Coverage report of the templates</a></li> </ul>"; } else { $suite->run($results); } if(!Director::is_cli()) echo '<div class="trace">'; $reporter->writeResults(); if(!Director::is_cli()) echo '</div>'; // Put the error handlers back Debug::loadErrorHandlers(); if(!Director::is_cli()) self::$default_reporter->writeFooter(); $this->tearDown(); // Todo: we should figure out how to pass this data back through Director more cleanly if(Director::is_cli() && ($results->failureCount() + $results->errorCount()) > 0) exit(2); }
/** * @return string * @access protected */ protected function renderItems() { $result = ''; foreach ($this->tests as $item) { $itemTemplate = new PHPUnit_Util_Template(PHPUnit_Util_Report::getTemplatePath() . 'testsuite_item.html'); $resultCode = $item->getResult(); if ($resultCode instanceof PHPUnit_Framework_TestFailure) { if ($resultCode->isFailure()) { $testResult = 'Failure'; } else { if ($resultCode->thrownException() instanceof PHPUnit_Framework_SkippedTest) { $testResult = 'Skipped'; } else { if ($resultCode->thrownException() instanceof PHPUnit_Framework_IncompleteTest) { $testResult = 'Incomplete'; } else { $testResult = 'Error'; } } } } else { if ($resultCode === PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { $testResult = 'Passed'; } else { $testResult = 'Error'; } } switch ($testResult) { case 'Passed': case 'Skipped': $color = 'chameleon'; break; case 'Incomplete': $color = 'butter'; break; case 'Error': case 'Failure': default: $color = 'scarlet_red'; } $itemTemplate->setVar(array('color', 'result', 'name'), array($color, $testResult, $item->getName())); $result .= $itemTemplate->render(); } return $result; }
/** * Renders this node. * * @param string $target * @param string $title * @access public */ public function render($target, $title) { $template = new PHPUnit_Util_Template(PHPUnit_Util_Report::getTemplatePath() . 'coverage_file.html'); $i = 1; $lines = ''; foreach ($this->codeLines as $line) { $css = ''; if (isset($this->executedLines[$i])) { $count = ''; // Array: Line is executable and was executed. // count(Array) = Number of tests that hit this line. if (is_array($this->executedLines[$i])) { $color = 'lineCov'; $count = sprintf('%8d', count($this->executedLines[$i])); } else { if ($this->executedLines[$i] == -1) { $color = 'lineNoCov'; $count = sprintf('%8d', 0); } else { $color = 'lineDeadCode'; $count = ' '; } } $css = sprintf('<span class="%s"> %s : ', $color, $count); } $lines .= sprintf('<span class="lineNum"><a name="%d"></a><a href="#%d">%8d</a> </span>%s%s%s' . "\n", $i, $i, $i, !empty($css) ? $css : ' : ', $line . str_repeat(' ', array_shift($this->codeLinesFillup)), !empty($css) ? '</span>' : ''); $i++; } $this->setTemplateVars($template, $title); $template->setVar('lines', $lines); $cleanId = PHPUnit_Util_Filesystem::getSafeFilename($this->getId()); $template->renderTo($target . $cleanId . '.html'); }
/** * @param PHPUnit_Framework_Test $suite * @param array $parameters * @return PHPUnit_Framework_TestResult * @access public */ public function doRun(PHPUnit_Framework_Test $suite, array $parameters = array()) { $parameters['repeat'] = isset($parameters['repeat']) ? $parameters['repeat'] : FALSE; $parameters['filter'] = isset($parameters['filter']) ? $parameters['filter'] : FALSE; $parameters['verbose'] = isset($parameters['verbose']) ? $parameters['verbose'] : FALSE; if (is_integer($parameters['repeat'])) { $suite = new PHPUnit_Extensions_RepeatedTest($suite, $parameters['repeat']); } if (isset($parameters['reportDirectory'])) { $parameters['reportDirectory'] = $this->getDirectory($parameters['reportDirectory']); } $result = $this->createTestResult(); if ($this->printer === NULL) { $this->printer = $parameters['xml'] ? new CopixTestXMLPrinter(NULL, $parameters['verbose']) : new CopixTestPrinter(NULL, $parameters['verbose']); } $result->addListener($this->printer); if (isset($parameters['testdoxHTMLFile'])) { $result->addListener(PHPUnit_Util_TestDox_ResultPrinter::factory('HTML', $parameters['testdoxHTMLFile'])); } if (isset($parameters['testdoxTextFile'])) { $result->addListener(PHPUnit_Util_TestDox_ResultPrinter::factory('Text', $parameters['testdoxTextFile'])); } if (isset($parameters['graphvizLogfile'])) { if (class_exists('Image_GraphViz', FALSE) && class_exists('PHPUnit_Util_Log_GraphViz', FALSE)) { $result->addListener(new PHPUnit_Util_Log_GraphViz($parameters['graphvizLogfile'])); } } if (isset($parameters['reportDirectory']) && extension_loaded('xdebug')) { if (class_exists('Image_GraphViz', FALSE) && class_exists('PHPUnit_Util_Report_GraphViz', FALSE)) { $result->addListener(new PHPUnit_Util_Report_GraphViz($parameters['reportDirectory'])); } $result->collectCodeCoverageInformation(TRUE); } if (isset($parameters['jsonLogfile'])) { $result->addListener(new PHPUnit_Util_Log_JSON($parameters['jsonLogfile'])); } if (isset($parameters['tapLogfile'])) { $result->addListener(new PHPUnit_Util_Log_TAP($parameters['tapLogfile'])); } if (isset($parameters['xmlLogfile'])) { $result->addListener(new PHPUnit_Util_Log_XML($parameters['xmlLogfile'])); } $suite->run($result, $parameters['filter']); $result->flushListeners(); if (isset($parameters['reportDirectory']) && extension_loaded('xdebug')) { $this->printer->codeCoverage($parameters['reportDirectory']); PHPUnit_Util_Report::render($result, $parameters['reportDirectory']); } else { $this->printer->codeCoverage(false); } if ($this->printer) { $this->printer->printResult($result); } return $result; }
/** * @param PHPUnit_Framework_Test $suite * @param array $arguments * @return PHPUnit_Framework_TestResult * @access public */ public function doRun(PHPUnit_Framework_Test $suite, array $arguments = array()) { $this->handleConfiguration($arguments); if (is_integer($arguments['repeat'])) { $suite = new PHPUnit_Extensions_RepeatedTest($suite, $arguments['repeat'], $arguments['filter'], $arguments['groups'], $arguments['excludeGroups']); } $result = $this->createTestResult(); if ($arguments['stopOnFailure']) { $result->stopOnFailure(TRUE); } if ($this->printer === NULL) { if (isset($arguments['printer']) && $arguments['printer'] instanceof PHPUnit_Util_Printer) { $this->printer = $arguments['printer']; } else { $this->printer = new PHPUnit_TextUI_ResultPrinter(NULL, $arguments['verbose']); } } $this->printer->write(PHPUnit_Runner_Version::getVersionString() . "\n\n"); foreach ($arguments['listeners'] as $listener) { $result->addListener($listener); } $result->addListener($this->printer); if (isset($arguments['testdoxHTMLFile'])) { $result->addListener(new PHPUnit_Util_TestDox_ResultPrinter_HTML($arguments['testdoxHTMLFile'])); } if (isset($arguments['testdoxTextFile'])) { $result->addListener(new PHPUnit_Util_TestDox_ResultPrinter_Text($arguments['testdoxTextFile'])); } if (isset($arguments['graphvizLogfile'])) { if (class_exists('Image_GraphViz', FALSE)) { $result->addListener(new PHPUnit_Util_Log_GraphViz($arguments['graphvizLogfile'])); } } if ((isset($arguments['coverageXML']) || isset($arguments['metricsXML']) || isset($arguments['pmdXML'])) && extension_loaded('xdebug')) { $result->collectCodeCoverageInformation(TRUE); } if (isset($arguments['reportDirectory']) && extension_loaded('xdebug')) { $result->collectCodeCoverageInformation(TRUE); } if (isset($arguments['jsonLogfile'])) { $result->addListener(new PHPUnit_Util_Log_JSON($arguments['jsonLogfile'])); } if (isset($arguments['tapLogfile'])) { $result->addListener(new PHPUnit_Util_Log_TAP($arguments['tapLogfile'])); } if (isset($arguments['xmlLogfile'])) { $result->addListener(new PHPUnit_Util_Log_XML($arguments['xmlLogfile'], $arguments['logIncompleteSkipped'])); } if (isset($arguments['testDatabaseDSN']) && isset($arguments['testDatabaseLogRevision']) && extension_loaded('pdo')) { $writeToTestDatabase = TRUE; } else { $writeToTestDatabase = FALSE; } if ($writeToTestDatabase) { $dbh = PHPUnit_Util_PDO::factory($arguments['testDatabaseDSN']); $dbListener = PHPUnit_Util_Log_Database::getInstance($dbh, $arguments['testDatabaseLogRevision'], isset($arguments['testDatabaseLogInfo']) ? $arguments['testDatabaseLogInfo'] : ''); $result->addListener($dbListener); $result->collectCodeCoverageInformation(TRUE); } $suite->run($result, $arguments['filter'], $arguments['groups'], $arguments['excludeGroups']); $result->flushListeners(); if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) { $this->printer->printResult($result); } if (isset($arguments['coverageXML']) && extension_loaded('tokenizer') && extension_loaded('xdebug')) { $this->printer->write("\nWriting code coverage data to XML file, this may take a moment."); $writer = new PHPUnit_Util_Log_CodeCoverage_XML($arguments['coverageXML']); $writer->process($result); $this->printer->write("\n"); } if ($writeToTestDatabase && extension_loaded('tokenizer') && extension_loaded('xdebug')) { $this->printer->write("\nStoring code coverage and software metrics data in database.\nThis may take a moment."); $testDb = new PHPUnit_Util_Log_CodeCoverage_Database($dbh); $testDb->storeCodeCoverage($result, $dbListener->getRunId(), $arguments['testDatabaseLogRevision'], $arguments['testDatabasePrefix']); $this->printer->write("\n"); } if (isset($arguments['metricsXML']) && extension_loaded('tokenizer') && extension_loaded('xdebug')) { $this->printer->write("\nWriting metrics report XML file, this may take a moment."); $writer = new PHPUnit_Util_Log_Metrics($arguments['metricsXML']); $writer->process($result); $this->printer->write("\n"); } if (isset($arguments['pmdXML']) && extension_loaded('tokenizer') && extension_loaded('xdebug')) { $writer = new PHPUnit_Util_Log_PMD($arguments['pmdXML'], $arguments['pmd']); $this->printer->write("\nWriting violations report XML file, this may take a moment."); $writer->process($result); $writer = new PHPUnit_Util_Log_CPD(str_replace('.xml', '-cpd.xml', $arguments['pmdXML'])); $writer->process($result, $arguments['cpdMinLines'], $arguments['cpdMinMatches']); $this->printer->write("\n"); } if (isset($arguments['reportDirectory']) && extension_loaded('xdebug')) { $this->printer->write("\nGenerating code coverage report, this may take a moment."); PHPUnit_Util_Report::render($result, $arguments['reportDirectory'], $arguments['reportCharset'], $arguments['reportYUI'], $arguments['reportHighlight'], $arguments['reportLowUpperBound'], $arguments['reportHighLowerBound']); $this->printer->write("\n"); } $this->pause($arguments['wait']); return $result; }
function runTests($classList, $coverage = false) { global $TESTING_CONFIG; $startTime = microtime(true); Config::inst()->update('Director', 'environment_type', 'dev'); if (isset($TESTING_CONFIG['database']) && $TESTING_CONFIG['database'] != 'silverstripe_testing') { global $databaseConfig; $newConfig = $databaseConfig; $newConfig = array_merge($databaseConfig, $TESTING_CONFIG); $newConfig['memory'] = isset($TESTING_CONFIG['memory']) ? $TESTING_CONFIG['memory'] : true; $type = isset($newConfig['type']) ? $newConfig['type'] : 'MySQL'; Debug::message("Connecting to new database {$type} as defined by testing config"); DB::connect($newConfig); DB::getConn()->selectDatabase($TESTING_CONFIG['database']); $dbadmin = new DatabaseAdmin(); $dbadmin->clearAllData(); if (!(isset($_REQUEST['build']) && $_REQUEST['build'] == 0)) { $dbadmin->doBuild(true); } } // XDEBUG seem to cause problems with test execution :-( if (function_exists('xdebug_disable')) { xdebug_disable(); } ini_set('max_execution_time', 0); $this->setUp(); // Optionally skip certain tests $skipTests = array(); if ($this->request->getVar('SkipTests')) { $skipTests = explode(',', $this->request->getVar('SkipTests')); } $classList = array_diff($classList, $skipTests); // run tests before outputting anything to the client $suite = new PHPUnit_Framework_TestSuite(); natcasesort($classList); foreach ($classList as $className) { // Ensure that the autoloader pulls in the test class, as PHPUnit won't know how to do this. class_exists($className); $suite->addTest(new SapphireTestSuite($className)); } // Remove the error handler so that PHPUnit can add its own restore_error_handler(); // CUSTOMISATION if (Director::is_cli()) { if (isset($TESTING_CONFIG['reporter'])) { $clazz = $TESTING_CONFIG['reporter']; } else { $clazz = "CliTestReporter"; } } else { $clazz = "SapphireTestReporter"; } // END CUSTOMISATION $reporter = new $clazz(); $default = self::$default_reporter; self::$default_reporter->writeHeader("Sapphire Test Runner"); if (count($classList) > 1) { self::$default_reporter->writeInfo("All Tests", "Running test cases: " . implode(",", $classList)); } else { self::$default_reporter->writeInfo($classList[0], ""); } $results = new PHPUnit_Framework_TestResult(); $results->addListener($reporter); if ($coverage === true) { $results->collectCodeCoverageInformation(true); $suite->run($results); if (!file_exists(ASSETS_PATH . '/coverage-report')) { mkdir(ASSETS_PATH . '/coverage-report'); } PHPUnit_Util_Report::render($results, ASSETS_PATH . '/coverage-report/'); $coverageApp = ASSETS_PATH . '/coverage-report/' . preg_replace('/[^A-Za-z0-9]/', '_', preg_replace('/(\\/$)|(^\\/)/', '', Director::baseFolder())) . '.html'; $coverageTemplates = ASSETS_PATH . '/coverage-report/' . preg_replace('/[^A-Za-z0-9]/', '_', preg_replace('/(\\/$)|(^\\/)/', '', realpath(TEMP_FOLDER))) . '.html'; echo "<p>Coverage reports available here:<ul>\n\t\t\t\t<li><a href=\"{$coverageApp}\">Coverage report of the application</a></li>\n\t\t\t\t<li><a href=\"{$coverageTemplates}\">Coverage report of the templates</a></li>\n\t\t\t</ul>"; } else { $suite->run($results); } if (!Director::is_cli()) { echo '<div class="trace">'; } // CUSTOMISATION $outputFile = null; if ($TESTING_CONFIG['logfile']) { $outputFile = BASE_PATH . '/' . $TESTING_CONFIG['logfile']; } $reporter->writeResults($outputFile); // END CUSTOMISATION $endTime = microtime(true); if (Director::is_cli()) { echo "\n\nTotal time: " . round($endTime - $startTime, 3) . " seconds\n"; } else { echo "<p>Total time: " . round($endTime - $startTime, 3) . " seconds</p>\n"; } if (!Director::is_cli()) { echo '</div>'; } // Put the error handlers back Debug::loadErrorHandlers(); if (!Director::is_cli()) { self::$default_reporter->writeFooter(); } $this->tearDown(); // Todo: we should figure out how to pass this data back through Director more cleanly if (Director::is_cli() && $results->failureCount() + $results->errorCount() > 0) { exit(2); } }