/** * Renders the report. * * @param PHPUnit_Framework_TestResult $result * @param string $title * @param string $target * @param string $charset * @param boolean $yui * @param boolean $highlight * @param integer $lowUpperBound * @param integer $highLowerBound */ public static function render(PHPUnit_Framework_TestResult $result, $target, $title = '', $charset = 'ISO-8859-1', $yui = TRUE, $highlight = FALSE, $lowUpperBound = 35, $highLowerBound = 70) { $target = PHPUnit_Util_Filesystem::getDirectory($target); 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 = PHPUnit_Util_Filesystem::reducePaths($files); $items = self::buildDirectoryStructure($files); unset($codeCoverageInformation); if ($title == '') { $topTestSuite = $result->topTestSuite(); if ($topTestSuite instanceof PHPUnit_Framework_TestSuite) { $title = $topTestSuite->getName(); } } unset($result); $root = new PHPUnit_Util_Report_Node_Directory($commonPath, NULL); self::addItems($root, $items, $files, $yui, $highlight); self::copyFiles($target); PHPUnit_Util_CodeCoverage::clearSummary(); $root->render($target, $title, $charset, $lowUpperBound, $highLowerBound); }
/** * @param PHPUnit_Framework_TestResult $result */ public function process(PHPUnit_Framework_TestResult $result) { $sutData = $result->getCodeCoverageInformation(); $sutFiles = PHPUnit_Util_CodeCoverage::getSummary($sutData, TRUE); $allData = $result->getCodeCoverageInformation(FALSE); $allFiles = PHPUnit_Util_CodeCoverage::getSummary($allData, TRUE); $testFiles = array_diff(array_keys($allFiles), array_keys($sutFiles)); foreach (array_keys($allFiles) as $key) { if (!@in_array($key, $testFiles)) { unset($allFiles[$key]); } } $allCommonPath = PHPUnit_Util_Filesystem::reducePaths($allFiles); $sutCommonPath = PHPUnit_Util_Filesystem::reducePaths($sutFiles); $testFiles = $allFiles; unset($allData); unset($allFiles); unset($sutData); $testToCoveredLinesMap = array(); $time = time(); foreach ($sutFiles as $filename => $data) { $fullPath = $sutCommonPath . DIRECTORY_SEPARATOR . $filename; if (file_exists($fullPath)) { $fullPath = realpath($fullPath); $document = new DOMDocument('1.0', 'UTF-8'); $document->formatOutput = TRUE; $coveredFile = $document->createElement('coveredFile'); $coveredFile->setAttribute('fullPath', $fullPath); $coveredFile->setAttribute('shortenedPath', $filename); $coveredFile->setAttribute('generated', $time); $coveredFile->setAttribute('phpunit', PHPUnit_Runner_Version::id()); $document->appendChild($coveredFile); $lines = file($fullPath, FILE_IGNORE_NEW_LINES); $lineNum = 1; foreach ($lines as $line) { if (isset($data[$lineNum])) { if (is_array($data[$lineNum])) { $count = count($data[$lineNum]); } else { $count = $data[$lineNum]; } } else { $count = -3; } $xmlLine = $coveredFile->appendChild($document->createElement('line')); $xmlLine->setAttribute('lineNumber', $lineNum); $xmlLine->setAttribute('executed', $count); $xmlLine->appendChild($document->createElement('body', htmlspecialchars(PHPUnit_Util_XML::convertToUtf8($line), ENT_COMPAT, 'UTF-8'))); if (isset($data[$lineNum]) && is_array($data[$lineNum])) { $xmlTests = $document->createElement('tests'); $xmlLine->appendChild($xmlTests); foreach ($data[$lineNum] as $test) { $xmlTest = $xmlTests->appendChild($document->createElement('test')); if ($test instanceof PHPUnit_Framework_TestCase) { $xmlTest->setAttribute('name', $test->getName()); $xmlTest->setAttribute('status', $test->getStatus()); if ($test->hasFailed()) { $xmlTest->appendChild($document->createElement('message', htmlspecialchars(PHPUnit_Util_XML::convertToUtf8($test->getStatusMessage()), ENT_COMPAT, 'UTF-8'))); } $class = new ReflectionClass($test); $testFullPath = $class->getFileName(); $testShortenedPath = str_replace($allCommonPath, '', $testFullPath); $methodName = $test->getName(FALSE); if ($class->hasMethod($methodName)) { $method = $class->getMethod($methodName); $startLine = $method->getStartLine(); $xmlTest->setAttribute('class', $class->getName()); $xmlTest->setAttribute('fullPath', $testFullPath); $xmlTest->setAttribute('shortenedPath', $testShortenedPath); $xmlTest->setAttribute('line', $startLine); if (!isset($testToCoveredLinesMap[$testFullPath][$startLine])) { $testToCoveredLinesMap[$testFullPath][$startLine] = array(); } if (!isset($testToCoveredLinesMap[$testFullPath][$startLine][$fullPath])) { $testToCoveredLinesMap[$testFullPath][$startLine][$fullPath] = array('coveredLines' => array($lineNum), 'shortenedPath' => $filename); } else { $testToCoveredLinesMap[$testFullPath][$startLine][$fullPath]['coveredLines'][] = $lineNum; } } } } } $lineNum++; } $document->save(sprintf('%s%s.xml', $this->directory, PHPUnit_Util_Filesystem::getSafeFilename(str_replace(DIRECTORY_SEPARATOR, '_', $filename)))); } } foreach ($testFiles as $filename => $data) { $fullPath = $allCommonPath . DIRECTORY_SEPARATOR . $filename; if (file_exists($fullPath)) { $document = new DOMDocument('1.0', 'UTF-8'); $document->formatOutput = TRUE; $testFile = $document->createElement('testFile'); $testFile->setAttribute('fullPath', $fullPath); $testFile->setAttribute('shortenedPath', $filename); $testFile->setAttribute('generated', $time); $testFile->setAttribute('phpunit', PHPUnit_Runner_Version::id()); $document->appendChild($testFile); $lines = file($fullPath, FILE_IGNORE_NEW_LINES); $lineNum = 1; foreach ($lines as $line) { $xmlLine = $testFile->appendChild($document->createElement('line')); $xmlLine->setAttribute('lineNumber', $lineNum); $xmlLine->appendChild($document->createElement('body', htmlspecialchars(PHPUnit_Util_XML::convertToUtf8($line), ENT_COMPAT, 'UTF-8'))); if (isset($testToCoveredLinesMap[$fullPath][$lineNum])) { $xmlCoveredFiles = $xmlLine->appendChild($document->createElement('coveredFiles')); foreach ($testToCoveredLinesMap[$fullPath][$lineNum] as $coveredFileFullPath => $coveredFileData) { $xmlCoveredFile = $xmlCoveredFiles->appendChild($document->createElement('coveredFile')); $xmlCoveredFile->setAttribute('fullPath', $fullPath); $xmlCoveredFile->setAttribute('shortenedPath', $coveredFileData['shortenedPath']); foreach ($coveredFileData['coveredLines'] as $coveredLineNum) { $xmlCoveredLine = $xmlCoveredFile->appendChild($document->createElement('coveredLine', $coveredLineNum)); } } } $lineNum++; } $document->save(sprintf('%s%s.xml', $this->directory, PHPUnit_Util_Filesystem::getSafeFilename(str_replace(DIRECTORY_SEPARATOR, '_', $filename)))); } } }