ENHANCEMENT Added "module=" argument to FullTestSuite (to support comma-separated module lists)

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.4@111489 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Ingo Schommer 2010-10-02 03:27:30 +00:00 committed by Sam Minnee
parent 4965cb0f69
commit 98e8dd035c

View File

@ -1,35 +1,79 @@
<?php
@require_once('sapphire/tests/bootstrap.php');
/**
* Alternative to letting PHPUnit handle class retrieval via
* traversing the filesystem. Works around restrictions of PHPUnit
* on running tests on multiple directories at once, without resorting
* to group or testsuite definitions in a custom phpunit.xml file.
*
* Usage:
* - "phpunit sapphire/tests/FullTestSuite.php"
* (all tests)
* - "phpunit sapphire/tests/FullTestSuite.php '' module=sapphire,cms"
* (comma-separated modules. empty quotes are necessary to avoid PHPUnit argument confusion)
*
* See http://www.phpunit.de/manual/current/en/organizing-tests.html#organizing-tests.testsuite
*
* Note: We can't unit test this class because of segfaults in PHP5.3 when trying to
* use get_all_tests() within a SapphireTest.
*
* @package sapphire
* @subpackage testing
*/
class FullTestSuite {
public static function get_tests() {
ManifestBuilder::load_test_manifest();
$tests = ClassInfo::subclassesFor('SapphireTest');
array_shift($tests);
unset($tests['FunctionalTest']);
// Remove tests that don't need to be executed every time
unset($tests['PhpSyntaxTest']);
foreach($tests as $class => $v) {
$reflection = new ReflectionClass($class);
if (!$reflection->isInstantiable()) {
unset($tests[$class]);
}
}
return $tests;
}
/**
* Called by the PHPUnit runner to gather runnable tests.
*
* @return PHPUnit_Framework_TestSuite
*/
public static function suite() {
$suite = new PHPUnit_Framework_TestSuite();
$classList = self::get_tests();
if(isset($_GET['module'])) {
$classList = self::get_module_tests($_GET['module']);
} else {
$classList = self::get_all_tests();
}
foreach($classList as $className) {
$suite->addTest(new SapphireTestSuite($className));
}
return $suite;
}
/**
* @return Array
*/
public static function get_all_tests() {
ManifestBuilder::load_test_manifest();
$tests = ClassInfo::subclassesFor('SapphireTest');
array_shift($tests);
return $tests;
}
/**
* Run tests for one or more "modules".
* A module is generally a toplevel folder, e.g. "mysite" or "sapphire".
*
* @param String $nameStr
* @return Array
*/
protected static function get_module_tests($namesStr) {
$tests = array();
$names = explode(',', $namesStr);
foreach($names as $name) {
$classesForModule = ClassInfo::classes_for_folder($name);
if($classesForModule) foreach($classesForModule as $class) {
if(class_exists($class) && is_subclass_of($class, 'SapphireTest')) {
$tests[] = $class;
}
}
}
return $tests;
}
}