Sets the code coverage object.
public setCodeCoverage ( SebastianBergmann\CodeCoverage\CodeCoverage $codeCoverage ) | ||
$codeCoverage | SebastianBergmann\CodeCoverage\CodeCoverage |
public function testThatAfterSuiteRespectsRemoteFalseSetting() { $reflection = new ReflectionClass('Codeception\\Subscriber\\RemoteCodeCoverage'); $settingsProperty = $reflection->getProperty('settings'); $settingsProperty->setAccessible(true); /** @var $codeCoverageMock \Codeception\Subscriber\RemoteCodeCoverage|PHPUnit_Framework_MockObject_MockObject */ $codeCoverageMock = $this->getMockBuilder('Codeception\\Subscriber\\RemoteCodeCoverage')->disableOriginalConstructor()->setMethods(array('getRemoteConnectionModule'))->getMock(); $settingsProperty->setValue($codeCoverageMock, array('enabled' => true, 'remote' => false)); /** @var $testSuite PHPUnit_Framework_TestSuite|PHPUnit_Framework_MockObject_MockObject */ $testSuite = $this->getMock('PHPUnit_Framework_TestSuite', array(), array(), '', false); $testResult = new PHPUnit_Framework_TestResult(); $testResult->setCodeCoverage(new \PHP_CodeCoverage()); $suiteEvent = new Suite($testSuite, $testResult); $codeCoverageMock->beforeSuite($suiteEvent); }
/** * Run a test */ public function run(PHPUnit_Framework_TestSuite $suite) { $res = new PHPUnit_Framework_TestResult(); if ($this->codecoverage) { $whitelist = CoverageMerger::getWhiteList($this->project); $this->codecoverage->filter()->addFilesToWhiteList($whitelist); $res->setCodeCoverage($this->codecoverage); } $res->addListener($this); foreach ($this->formatters as $formatter) { $res->addListener($formatter); } /* Set PHPUnit error handler */ if ($this->useCustomErrorHandler) { $oldErrorHandler = set_error_handler(array($this, 'handleError'), E_ALL | E_STRICT); } $suite->run($res, false, $this->groups, $this->excludeGroups, $this->processIsolation); foreach ($this->formatters as $formatter) { $formatter->processResult($res); } /* Restore Phing error handler */ if ($this->useCustomErrorHandler) { restore_error_handler(); } if ($this->codecoverage) { CoverageMerger::merge($this->project, $this->codecoverage->getData()); } if ($res->errorCount() != 0) { $this->retCode = self::ERRORS; } else { if ($res->failureCount() != 0) { $this->retCode = self::FAILURES; } else { if ($res->notImplementedCount() != 0) { $this->retCode = self::INCOMPLETES; } else { if ($res->skippedCount() != 0) { $this->retCode = self::SKIPPED; } } } } }
/** * Run a test * * @param PHPUnit_Framework_TestSuite $suite */ public function run(PHPUnit_Framework_TestSuite $suite) { $res = new PHPUnit_Framework_TestResult(); if ($this->codecoverage) { $whitelist = CoverageMerger::getWhiteList($this->project); $this->codecoverage->filter()->addFilesToWhiteList($whitelist); $res->setCodeCoverage($this->codecoverage); } $res->addListener($this); foreach ($this->formatters as $formatter) { $res->addListener($formatter); } /* Set PHPUnit error handler */ if ($this->useCustomErrorHandler) { $oldErrorHandler = set_error_handler(array($this, 'handleError'), E_ALL | E_STRICT); } $version = PHPUnit_Runner_Version::id(); if (version_compare($version, '4.0.0') >= 0) { $this->injectFilters($suite); $suite->run($res); } else { $suite->run($res, false, $this->groups, $this->excludeGroups, $this->processIsolation); } foreach ($this->formatters as $formatter) { $formatter->processResult($res); } /* Restore Phing error handler */ if ($this->useCustomErrorHandler) { restore_error_handler(); } if ($this->codecoverage) { CoverageMerger::merge($this->project, $this->codecoverage->getData()); } $this->checkResult($res); }
public function applyFilter(\PHPUnit_Framework_TestResult $result) { $result->setCodeCoverage(new DummyCodeCoverage()); Filter::setup($this->coverage)->whiteList($this->filters)->blackList($this->filters); $result->setCodeCoverage($this->coverage); }
/** * * Somewhat messy and god-method, but this override exists because * * a) we want to change the configuration of items from the user-set TESTING_CONFIG * variable if it exists * * b) PhpUnitWrapper is referenced with explicit class settings, rather than allowing us to * override as we like (to change code coverage behaviour). * * @global type TESTING_CONFIG * @global type $TESTING_CONFIG * @global type $databaseConfig * @param type $classList * @param type $coverage * @throws Exception */ 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') { if (class_exists("Multisites")) { Multisites::inst()->resetCurrentSite(); } global $databaseConfig; $newConfig = $databaseConfig; $newConfig = array_merge($databaseConfig, $TESTING_CONFIG); $newConfig['memory'] = isset($TESTING_CONFIG['memory']) ? $TESTING_CONFIG['memory'] : true; $newDbName = $TESTING_CONFIG['database']; $type = isset($newConfig['type']) ? $newConfig['type'] : 'MySQL'; Debug::message("Connecting to new {$type} database {$TESTING_CONFIG['database']} as defined by testing config"); DB::connect($newConfig); if (!DB::getConn()->databaseExists($newDbName)) { DB::getConn()->createDatabase($newDbName); } if (!DB::getConn()->selectDatabase($newDbName)) { throw new Exception("Could not find database to use for testing"); } if ($newConfig['memory']) { Debug::message("Using in memory database"); } $dbadmin = new DatabaseAdmin(); if (isset($_REQUEST['clear']) && $_REQUEST['clear'] == 0) { } else { $dbadmin->clearAllData(); } if (!(isset($_REQUEST['build']) && $_REQUEST['build'] == 0)) { Debug::message("Executing dev/build as requested"); $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')); } $abstractClasses = array(); 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); $reflection = new ReflectionClass($className); if ($reflection->isAbstract()) { array_push($abstractClasses, $className); } } $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 ($reporterClass = $this->request->requestVar('reporter')) { $clazz = $reporterClass; } else { if (isset($TESTING_CONFIG['reporter'])) { $clazz = $TESTING_CONFIG['reporter']; } else { $clazz = "CliTestReporter"; } } } else { $clazz = "SapphireTestReporter"; } // END CUSTOMISATION // CUSTOMISATION $outputFile = null; if ($TESTING_CONFIG['logfile']) { $outputFile = BASE_PATH . '/' . $TESTING_CONFIG['logfile']; } $reporter = new $clazz($outputFile); $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) { $coverer = $this->getCodeCoverage(); $results->setCodeCoverage($coverer); $suite->run($results); $writer = new PHP_CodeCoverage_Report_HTML(); $writer->process($coverer, Director::baseFolder() . '/ssautesting/html/code-coverage-report'); } else { $suite->run($results); } if (!Director::is_cli()) { echo '<div class="trace">'; } if (method_exists($reporter, 'writeResults')) { $reporter->writeResults($outputFile); } else { $reporter->flush(); } // 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); } }