Checks if a PHP sourcefile is readable and is optionally checked for
syntax errors through the syntaxCheck() method. The sourcefile is
loaded through the load() method.
/** * Run the runner. * * This will get a singleton instance of the class and configure * it according to the given configuration and any $_REQUEST * overriding parameters. * * It will configure it to use a {@link PHPUnit_Html_Printer} object * as the default output printer. * * @param array $arguments configuration * @return void */ public static function run($arguments = array()) { $_arguments = array('tpldir' => null, 'test' => null, 'testFile' => null, 'coverageClover' => null, 'coverageHtml' => null, 'filter' => null, 'groups' => null, 'excludeGroups' => null, 'processInsolation' => null, 'syntaxCheck' => false, 'stopOnError' => false, 'stopOnFailure' => false, 'stopOnIncomplete' => false, 'stopOnSkipped' => false, 'noGlobalsBackup' => true, 'staticBackup' => true, 'syntaxCheck' => false, 'bootstrap' => null, 'configuration' => null, 'noConfiguration' => false, 'strict' => false); $printer = new PHPUnit_Html_Printer($arguments['tpldir']); try { $arguments = $arguments ? array_merge($_arguments, array_intersect_key($arguments, $_arguments)) : $_arguments; $arguments['backupGlobals'] = !$arguments['noGlobalsBackup']; unset($arguments['noGlobalsBackup']); $arguments['backupStaticAttributes'] = !$arguments['staticBackup']; unset($arguments['staticBackup']); $arguments['useDefaultConfiguration'] = !$arguments['noConfiguration']; unset($arguments['noConfiguration']); if (isset($arguments['coverageHtml'])) { $arguments['reportDirectory'] = $arguments['coverageHtml']; unset($arguments['coverageHtml']); } if (!isset($arguments['test']) && !isset($arguments['testFile'])) { $arguments['test'] = getcwd(); } $arguments['printer'] = $printer; $arguments['listeners'] = array(new PHPUnit_Util_DeprecatedFeature_Logger()); if ($arguments['bootstrap']) { PHPUnit_Util_Fileloader::checkAndLoad($arguments['bootstrap'], $arguments['syntaxCheck']); } $runner = new PHPUnit_Html_TestRunner(); $suite = $runner->getTest($arguments['test'], $arguments['testFile'], $arguments['syntaxCheck']); unset($arguments['test']); unset($arguments['testFile']); $result = $runner->doRun($suite, $arguments); $arguments['printer']->printResult($result); } catch (Exception $e) { $printer->printAborted($e); } }
/** * Loads a bootstrap file. * * @param string $filename * @param boolean $syntaxCheck * @see PHPUnit_TextUI_Command::handleBootstrap() * @since Method available since Release 2.16.0 */ protected function handleBootstrap($filename, $syntaxCheck = false) { try { PHPUnit_Util_Fileloader::checkAndLoad($filename, $syntaxCheck); } catch (RuntimeException $e) { PHPUnit_TextUI_TestRunner::showError($e->getMessage()); } }
/** * @param string $suiteClassName * @param string $suiteClassFile * @return ReflectionClass * @throws RuntimeException */ public function load($suiteClassName, $suiteClassFile = '') { $suiteClassName = str_replace('.php', '', $suiteClassName); if (empty($suiteClassFile)) { $suiteClassFile = PHPUnit_Util_Filesystem::classNameToFilename($suiteClassName); } if (!class_exists($suiteClassName, FALSE)) { PHPUnit_Util_Class::collectStart(); $filename = PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile); $loadedClasses = PHPUnit_Util_Class::collectEnd(); } if (!class_exists($suiteClassName, FALSE) && !empty($loadedClasses)) { $offset = 0 - strlen($suiteClassName); foreach ($loadedClasses as $loadedClass) { $class = new ReflectionClass($loadedClass); if (substr($loadedClass, $offset) === $suiteClassName && $class->getFileName() == $filename) { $suiteClassName = $loadedClass; break; } } } if (!class_exists($suiteClassName, FALSE) && !empty($loadedClasses)) { $testCaseClass = 'PHPUnit_Framework_TestCase'; foreach ($loadedClasses as $loadedClass) { $class = new ReflectionClass($loadedClass); $classFile = $class->getFileName(); if ($class->isSubclassOf($testCaseClass) && !$class->isAbstract()) { $suiteClassName = $loadedClass; $testCaseClass = $loadedClass; if ($classFile == realpath($suiteClassFile)) { break; } } if ($class->hasMethod('suite')) { $method = $class->getMethod('suite'); if (!$method->isAbstract() && $method->isPublic() && $method->isStatic()) { $suiteClassName = $loadedClass; if ($classFile == realpath($suiteClassFile)) { break; } } } } } if (class_exists($suiteClassName, FALSE)) { $class = new ReflectionClass($suiteClassName); $filePath = $GLOBALS['base_dir'] . DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR . 'phpunit' . DIRECTORY_SEPARATOR . $suiteClassFile; if ($class->getFileName() == realpath($filePath)) { return $class; } } throw new PHPUnit_Framework_Exception(sprintf('Class %s could not be found in %s.', $suiteClassName, $suiteClassFile)); }
/** * * @param string $suiteClassName * @param string $suiteClassFile * * @return ReflectionClass * * @throws PHPUnit_Framework_Exception */ public function load($suiteClassName, $suiteClassFile = '') { $suiteClassName = str_replace('.php', '', $suiteClassName); if (empty($suiteClassFile)) { $suiteClassFile = PHPUnit_Util_Filesystem::classNameToFilename($suiteClassName); } if (!class_exists($suiteClassName, false)) { $loadedClasses = get_declared_classes(); $filename = PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile); $loadedClasses = array_values(array_diff(get_declared_classes(), $loadedClasses)); } if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) { $offset = 0 - strlen($suiteClassName); foreach ($loadedClasses as $loadedClass) { $class = new ReflectionClass($loadedClass); if (substr($loadedClass, $offset) === $suiteClassName && $class->getFileName() == $filename) { $suiteClassName = $loadedClass; break; } } } if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) { $testCaseClass = 'PHPUnit_Framework_TestCase'; foreach ($loadedClasses as $loadedClass) { $class = new ReflectionClass($loadedClass); $classFile = $class->getFileName(); if ($class->isSubclassOf($testCaseClass) && !$class->isAbstract()) { $suiteClassName = $loadedClass; $testCaseClass = $loadedClass; if ($classFile == realpath($suiteClassFile)) { break; } } if ($class->hasMethod('suite')) { $method = $class->getMethod('suite'); if (!$method->isAbstract() && $method->isPublic() && $method->isStatic()) { $suiteClassName = $loadedClass; if ($classFile == realpath($suiteClassFile)) { break; } } } } } if (class_exists($suiteClassName, false)) { $class = new ReflectionClass($suiteClassName); if ($class->getFileName() == realpath($suiteClassFile)) { return $class; } } throw new PHPUnit_Framework_Exception(sprintf("Class '%s' could not be found in '%s'.", $suiteClassName, $suiteClassFile)); }
/** * Loads a bootstrap file. * * @param string $filename */ protected function handleBootstrap($filename) { try { PHPUnit_Util_Fileloader::checkAndLoad($filename); } catch (PHPUnit_Framework_Exception $e) { PHPUnit_TextUI_TestRunner::showError($e->getMessage()); } }
/** * Wraps both <code>addTest()</code> and <code>addTestSuite</code> * as well as the separate import statements for the user's convenience. * * If the named file cannot be read or there are no new tests that can be * added, a <code>PHPUnit_Framework_Warning</code> will be created instead, * leaving the current test run untouched. * * @param string $filename * @param boolean $syntaxCheck * @param array $phptOptions Array with ini settings for the php instance * run, key being the name if the setting, * value the ini value. * @throws InvalidArgumentException * @access public * @since Method available since Release 2.3.0 * @author Stefano F. Rausch <*****@*****.**> */ public function addTestFile($filename, $syntaxCheck = TRUE, $phptOptions = array()) { if (!is_string($filename)) { throw new InvalidArgumentException(); } if (file_exists($filename) && substr($filename, -5) == '.phpt') { $this->addTest(new PHPUnit_Extensions_PhptTestCase($filename, $phptOptions)); return; } if (!file_exists($filename)) { $includePaths = explode(PATH_SEPARATOR, get_include_path()); foreach ($includePaths as $includePath) { $file = $includePath . DIRECTORY_SEPARATOR . $filename; if (file_exists($file)) { $filename = $file; break; } } } PHPUnit_Util_Class::collectStart(); PHPUnit_Util_Fileloader::checkAndLoad($filename, $syntaxCheck); $newClasses = PHPUnit_Util_Class::collectEnd(); $testsFound = FALSE; foreach ($newClasses as $className) { $class = new ReflectionClass($className); if (!$class->isAbstract()) { if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) { $method = $class->getMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME); if ($method->isStatic()) { $this->addTest($method->invoke(NULL, $className)); $testsFound = TRUE; } } else { if ($class->implementsInterface('PHPUnit_Framework_Test')) { $this->addTestSuite($class); $testsFound = TRUE; } } } } if (!$testsFound) { $this->addTest(new PHPUnit_Framework_Warning('No tests found in file "' . $filename . '".')); } $this->numTests = -1; }
/** * @param string $loaderName */ 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); }
/** * @param string $suiteClassName * @param string $suiteClassFile * @param boolean $syntaxCheck * @return ReflectionClass * @throws RuntimeException */ public function load($suiteClassName, $suiteClassFile = '', $syntaxCheck = TRUE) { $suiteClassName = str_replace('.php', '', $suiteClassName); if (empty($suiteClassFile)) { $suiteClassFile = str_replace(array('_', '\\'), DIRECTORY_SEPARATOR, $suiteClassName) . '.php'; } if (!class_exists($suiteClassName, FALSE)) { if (!file_exists($suiteClassFile)) { $includePaths = explode(PATH_SEPARATOR, get_include_path()); foreach ($includePaths as $includePath) { $file = $includePath . DIRECTORY_SEPARATOR . $suiteClassFile; if (file_exists($file)) { $suiteClassFile = $file; break; } } } PHPUnit_Util_Class::collectStart(); PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile, $syntaxCheck); $loadedClasses = PHPUnit_Util_Class::collectEnd(); } if (!class_exists($suiteClassName, FALSE) && !empty($loadedClasses)) { $offset = 0 - strlen($suiteClassName); foreach ($loadedClasses as $loadedClass) { if (substr($loadedClass, $offset) === $suiteClassName) { $suiteClassName = $loadedClass; break; } } } if (!class_exists($suiteClassName, FALSE) && !empty($loadedClasses)) { $testCaseClass = 'PHPUnit_Framework_TestCase'; foreach ($loadedClasses as $loadedClass) { $class = new ReflectionClass($loadedClass); if ($class->isSubclassOf($testCaseClass)) { $suiteClassName = $loadedClass; $testCaseClass = $loadedClass; if ($class->getFileName() == realpath($suiteClassFile)) { break; } } if ($class->hasMethod('suite')) { $method = $class->getMethod('suite'); if (!$method->isAbstract() && $method->isPublic() && $method->isStatic()) { $suiteClassName = $loadedClass; break; } } } } if (class_exists($suiteClassName, FALSE)) { $class = new ReflectionClass($suiteClassName); if ($class->getFileName() == realpath($suiteClassFile)) { return $class; } } throw new RuntimeException(sprintf('Class %s could not be found in %s.', $suiteClassName, $suiteClassFile)); }
/** * @param string $suiteClassName * @param string $suiteClassFile * @return ReflectionClass * @throws RuntimeException * @access public */ public function load($suiteClassName, $suiteClassFile = '') { $suiteClassName = str_replace('.php', '', $suiteClassName); $suiteClassFile = !empty($suiteClassFile) ? $suiteClassFile : str_replace('_', '/', $suiteClassName) . '.php'; if (!class_exists($suiteClassName, FALSE)) { if (!file_exists($suiteClassFile)) { $includePaths = PHPUnit_Util_Fileloader::getIncludePaths(); foreach ($includePaths as $includePath) { $file = $includePath . DIRECTORY_SEPARATOR . $suiteClassFile; if (file_exists($file)) { $suiteClassFile = $file; break; } } } PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile); } if (class_exists($suiteClassName, FALSE)) { return new ReflectionClass($suiteClassName); } else { throw new RuntimeException(sprintf('Class %s could not be found in %s.', $suiteClassName, $suiteClassFile)); } }
/** * @param string $suiteClassName * @param string $suiteClassFile * @param boolean $syntaxCheck * @return ReflectionClass * @throws RuntimeException */ public function load($suiteClassName, $suiteClassFile = '', $syntaxCheck = TRUE) { $suiteClassName = str_replace('.php', '', $suiteClassName); if (empty($suiteClassFile)) { $suiteClassFile = str_replace(array('_', '::'), DIRECTORY_SEPARATOR, $suiteClassName) . '.php'; } if (!class_exists($suiteClassName, FALSE)) { if (!file_exists($suiteClassFile)) { $includePaths = explode(PATH_SEPARATOR, get_include_path()); foreach ($includePaths as $includePath) { $file = $includePath . DIRECTORY_SEPARATOR . $suiteClassFile; if (file_exists($file)) { $suiteClassFile = $file; break; } } } PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile, $syntaxCheck); } if (class_exists($suiteClassName, FALSE)) { return new ReflectionClass($suiteClassName); } else { throw new RuntimeException(sprintf('Class %s could not be found in %s.', $suiteClassName, $suiteClassFile)); } }
/** * Wraps both <code>addTest()</code> and <code>addTestSuite</code> * as well as the separate import statements for the user's convenience. * * If the named file cannot be read or there are no new tests that can be * added, a <code>PHPUnit_Framework_Warning</code> will be created instead, * leaving the current test run untouched. * * @param string $filename * @param array $phptOptions Array with ini settings for the php instance * run, key being the name if the setting, * value the ini value. * @throws PHPUnit_Framework_Exception * @since Method available since Release 2.3.0 * @author Stefano F. Rausch <*****@*****.**> */ public function addTestFile($filename, $phptOptions = array()) { if (!is_string($filename)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (file_exists($filename) && substr($filename, -5) == '.phpt') { $this->addTest(new PHPUnit_Extensions_PhptTestCase($filename, $phptOptions)); return; } $classes = get_declared_classes(); $filename = PHPUnit_Util_Fileloader::checkAndLoad($filename); $newClasses = array_diff(get_declared_classes(), $classes); foreach ($newClasses as $className) { $this->foundClasses[] = $className; } $baseName = str_replace('.php', '', basename($filename)); end($this->foundClasses); while ($className = current($this->foundClasses)) { if (substr($className, 0 - strlen($baseName)) == $baseName) { $class = new ReflectionClass($className); if ($class->getFileName() == $filename) { $newClasses = array($className); unset($this->foundClasses[key($this->foundClasses)]); break; } } prev($this->foundClasses); } foreach ($newClasses as $className) { $class = new ReflectionClass($className); if (!$class->isAbstract()) { if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) { $method = $class->getMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME); if ($method->isStatic()) { $this->addTest($method->invoke(null, $className)); } } elseif ($class->implementsInterface('PHPUnit_Framework_Test')) { $this->addTestSuite($class); } } } $this->numTests = -1; }
public static function collectTestsFromFile($filename) { PHPUnit_Util_Class::collectStart(); PHPUnit_Util_Fileloader::checkAndLoad($filename, FALSE); $newClasses = PHPUnit_Util_Class::collectEnd(); $baseName = str_replace('.php', '', basename($filename)); foreach ($newClasses as $className) { if (substr($className, 0 - strlen($baseName)) == $baseName) { $newClasses = array($className); break; } } $tests = array(); // of PHPUnit_Framework_Test foreach ($newClasses as $className) { $class = new ReflectionClass($className); if (!$class->isAbstract()) { if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) { $method = $class->getMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME); if ($method->isStatic()) { $newTest = $method->invoke(NULL, $className); // of type PHPUnit_Framework_Test $tests[] = $newTest; } } else { if ($class->implementsInterface('PHPUnit_Framework_Test')) { $tests[] = new PHPUnit_Framework_TestSuite($class); } } } } return $tests; }
protected static function _suite($alltests_class, $alltests_file, $sub_suite = null) { $suite_name = basename($alltests_class, "_AllTests"); $readable_name = str_replace("_", " ", $suite_name); $suite = new PHPUnit_Framework_TestSuite($readable_name); $tests = self::_getTests(dirname($alltests_file)); // trickery to get around the statics problem in php eval("\$disabled = " . $alltests_class . "::\$disabled;"); eval("\$requires_config = " . $alltests_class . "::\$requires_config;"); foreach ($tests as $test => $filename) { $test_file_path = dirname($alltests_file) . DIRECTORY_SEPARATOR . $filename; $test_class_name = $suite_name . "_" . $test; $test_class_config = ZFTestManager::getConfig($test_class_name); if (!is_null($sub_suite) && strpos($test, $sub_suite) === false) { continue; } // if test is disabled by default, and not turned on, continue if (in_array($test_class_name, $disabled) && $test_class_config['enabled'] != true) { continue; } // if test is not disabled by default, but is disabled in config, continue if (!in_array($test_class_name, $disabled) && $test_class_config['disabled'] == true) { continue; } if (in_array($test_class_name, $requires_config) && $test_class_config === null) { echo "Class {$test_class_name} is enabled, but requires config options to be set in TestConfiguration.ini.\n"; echo "See {$test_file_path} for more details.\n"; exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } PHPUnit_Util_Fileloader::checkAndLoad($test_file_path); try { $suite->addTestSuite($test_class_name); } catch (InvalidArgumentException $e) { echo "File for {$test_class_name} was loaded, but a class named {$test_class_name} was not found.\n"; exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } //$suite->addTestFile($test_file_path); } return $suite; }
/** * Wraps both <code>addTest()</code> and <code>addTestSuite</code> * as well as the separate import statements for the user's convenience. * * If the named file cannot be read or there are no new tests that can be * added, a <code>PHPUnit_Framework_Warning</code> will be created instead, * leaving the current test run untouched. * * @param string $filename * @param boolean $syntaxCheck * @param array $phptOptions Array with ini settings for the php instance * run, key being the name if the setting, * value the ini value. * @throws InvalidArgumentException * @since Method available since Release 2.3.0 * @author Stefano F. Rausch <*****@*****.**> */ public function addTestFile($filename, $syntaxCheck = FALSE, $phptOptions = array()) { if (!is_string($filename)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (file_exists($filename) && substr($filename, -5) == '.phpt') { $this->addTest(new PHPUnit_Extensions_PhptTestCase($filename, $phptOptions)); return; } PHPUnit_Util_Class::collectStart(); $filename = PHPUnit_Util_Fileloader::checkAndLoad($filename, $syntaxCheck); $newClasses = PHPUnit_Util_Class::collectEnd(); $baseName = str_replace('.php', '', basename($filename)); foreach ($newClasses as $className) { if (substr($className, 0 - strlen($baseName)) == $baseName) { $class = new ReflectionClass($className); if ($class->getFileName() == $filename) { $newClasses = array($className); break; } } } $testsFound = FALSE; foreach ($newClasses as $className) { $class = new ReflectionClass($className); if (!$class->isAbstract()) { if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) { $method = $class->getMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME); if ($method->isStatic()) { $this->addTest($method->invoke(NULL, $className)); $testsFound = TRUE; } } else { if ($class->implementsInterface('PHPUnit_Framework_Test')) { $this->addTestSuite($class); $testsFound = TRUE; } } } } $this->numTests = -1; }
/** * Include a file * * @param string $filename */ public static function loadFile($filename) { PHPUnitFileLoader::checkAndLoad($filename); }
/** * Wraps both <code>addTest()</code> and <code>addTestSuite</code> * as well as the separate import statements for the user's convenience. * * If the named file cannot be read or there are no new tests that can be * added, a <code>PHPUnit_Framework_Warning</code> will be created instead, * leaving the current test run untouched. * * @param string $filename * @throws PHPUnit_Framework_Exception * @since Method available since Release 2.3.0 */ public function addTestFile($filename) { if (!is_string($filename)) { throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); } if (file_exists($filename) && substr($filename, -5) == '.phpt') { $this->addTest(new PHPUnit_Extensions_PhptTestCase($filename)); return; } // The given file may contain further stub classes in addition to the // test class itself. Figure out the actual test class. $classes = get_declared_classes(); $filename = PHPUnit_Util_Fileloader::checkAndLoad($filename); $newClasses = array_diff(get_declared_classes(), $classes); // The diff is empty in case a parent class (with test methods) is added // AFTER a child class that inherited from it. To account for that case, // cumulate all discovered classes, so the parent class may be found in // a later invocation. if ($newClasses) { // On the assumption that test classes are defined first in files, // process discovered classes in approximate LIFO order, so as to // avoid unnecessary reflection. $this->foundClasses = array_merge($newClasses, $this->foundClasses); } // The test class's name must match the filename, either in full, or as // a PEAR/PSR-0 prefixed shortname ('NameSpace_ShortName'), or as a // PSR-1 local shortname ('NameSpace\ShortName'). The comparison must be // anchored to prevent false-positive matches (e.g., 'OtherShortName'). $shortname = basename($filename, '.php'); $shortnameRegEx = '/(?:^|_|\\\\)' . preg_quote($shortname, '/') . '$/'; foreach ($this->foundClasses as $i => $className) { if (preg_match($shortnameRegEx, $className)) { $class = new ReflectionClass($className); if ($class->getFileName() == $filename) { $newClasses = [$className]; unset($this->foundClasses[$i]); break; } } } foreach ($newClasses as $className) { $class = new ReflectionClass($className); if (!$class->isAbstract()) { if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) { $method = $class->getMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME); if ($method->isStatic()) { $this->addTest($method->invoke(null, $className)); } } elseif ($class->implementsInterface('PHPUnit_Framework_Test')) { $this->addTestSuite($class); } } } $this->numTests = -1; }
protected function guess_class_from_path($file) { // Somebody is using just the file name, we need to look inside the file and guess the testcase // class name. Let's throw fatal error if there are more testcases in one file. $classes = get_declared_classes(); PHPUnit_Util_Fileloader::checkAndLoad($file); $includePathFilename = stream_resolve_include_path($file); $loadedClasses = array_diff(get_declared_classes(), $classes); $candidates = array(); foreach ($loadedClasses as $loadedClass) { $class = new ReflectionClass($loadedClass); if ($class->isSubclassOf('PHPUnit_Framework_TestCase') and !$class->isAbstract()) { if (realpath($includePathFilename) === realpath($class->getFileName())) { $candidates[] = $loadedClass; } } } if (count($candidates) == 0) { throw new PHPUnit_Framework_Exception(sprintf("File '%s' does not contain any test cases.", $file)); } if (count($candidates) > 1) { throw new PHPUnit_Framework_Exception(sprintf("File '%s' contains multiple test cases: " . implode(', ', $candidates), $file)); } $classname = reset($candidates); return new ReflectionClass($classname); }