/** * @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)))); } } }
/** * Skipped test. * * @param PHPUnit_Framework_Test $test * @param Exception $e * @param float $time * @since Method available since Release 3.0.0 */ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { if ($this->logIncompleteSkipped) { $error = $this->document->createElement('error'); $error->setAttribute('type', get_class($e)); $error->appendChild($this->document->createCDATASection(PHPUnit_Util_XML::convertToUtf8("Skipped Test\n" . PHPUnit_Util_Filter::getFilteredStacktrace($e, FALSE)))); $this->currentTestCase->appendChild($error); $this->testSuiteErrors[$this->testSuiteLevel]++; } else { $this->attachCurrentTestCase = FALSE; } }
/** * @param PHPUnit_Framework_TestResult $result */ public function process(PHPUnit_Framework_TestResult $result, $minLines = 5, $minMatches = 70) { $codeCoverage = $result->getCodeCoverageInformation(); $summary = PHPUnit_Util_CodeCoverage::getSummary($codeCoverage); $files = array_keys($summary); $metrics = new PHPUnit_Util_Metrics_Project($files, $summary, TRUE, $minLines, $minMatches); $document = new DOMDocument('1.0', 'UTF-8'); $document->formatOutput = TRUE; $cpd = $document->createElement('pmd-cpd'); $cpd->setAttribute('version', 'PHPUnit ' . PHPUnit_Runner_Version::id()); $document->appendChild($cpd); foreach ($metrics->getDuplicates() as $duplicate) { $xmlDuplication = $cpd->appendChild($document->createElement('duplication')); $xmlDuplication->setAttribute('lines', $duplicate['numLines']); $xmlDuplication->setAttribute('tokens', $duplicate['numTokens']); $xmlFile = $xmlDuplication->appendChild($document->createElement('file')); $xmlFile->setAttribute('path', $duplicate['fileA']->getPath()); $xmlFile->setAttribute('line', $duplicate['firstLineA']); $xmlFile = $xmlDuplication->appendChild($document->createElement('file')); $xmlFile->setAttribute('path', $duplicate['fileB']->getPath()); $xmlFile->setAttribute('line', $duplicate['firstLineB']); $xmlDuplication->appendChild($document->createElement('codefragment', htmlspecialchars(PHPUnit_Util_XML::convertToUtf8(join('', array_slice($duplicate['fileA']->getLines(), $duplicate['firstLineA'] - 1, $duplicate['numLines']))), ENT_COMPAT, 'UTF-8'))); } $this->write($document->saveXML()); $this->flush(); }