diff --git a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php index c2d4b44cd6d8765c8c7d2eca76d208c4ee46cafd..3c0ea2cc87dbf014ff962569c200a9739f14ffda 100644 --- a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php +++ b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php @@ -195,6 +195,30 @@ public function __construct($test_id = NULL) { $this->testId = $test_id; } + /** + * Provides meta information about this test case, such as test name. + * + * @return array + * An array of untranslated strings with the following keys: + * - name: An overview of what is tested by the class; for example, "User + * access rules". + * - description: One sentence describing the test, starting with a verb. + * - group: The human-readable name of the module ("Node", "Statistics"), or + * the human-readable name of the Drupal facility tested (e.g. "Form API" + * or "XML-RPC"). + */ + public static function getInfo() { + // PHP does not allow us to declare this method as abstract public static, + // so we simply throw an exception here if this has not been implemented by + // a child class. + throw new \RuntimeException("Sub-class must implement the getInfo method!"); + } + + /** + * Performs setup tasks before each individual test method is run. + */ + abstract protected function setUp(); + /** * Checks the matching requirements for Test. * @@ -1018,6 +1042,8 @@ protected function rebuildContainer() { } /** + * Performs cleanup tasks after each individual test method has been run. + * * Deletes created files, database tables, and reverts environment changes. * * This method needs to be invoked for both unit and integration tests. diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module index d04012eb408372b72d3598f41d31281a5e5f58f3..da7c265f972c43fae3018e8502fd3d9d15900079 100644 --- a/core/modules/simpletest/simpletest.module +++ b/core/modules/simpletest/simpletest.module @@ -480,8 +480,23 @@ function simpletest_test_get_all() { foreach ($classes as $class) { // Test classes need to implement getInfo() to be valid. if (class_exists($class) && method_exists($class, 'getInfo')) { - $info = call_user_func(array($class, 'getInfo')); - + $reflectionClass = new ReflectionClass($class); + // Skip abstract classes and interfaces. + if ($reflectionClass->isInstantiable()) { + $reflectionMethod = new ReflectionMethod($class, 'getInfo'); + $declaringClass = $reflectionMethod->getDeclaringClass()->getName(); + // Avoid testing intermediate classes which do not implement the + // method. + if ($class == $declaringClass) { + $info = call_user_func(array($class, 'getInfo')); + } + else { + continue; + } + } + else { + continue; + } // If this test class requires a non-existing module, skip it. if (!empty($info['dependencies'])) { foreach ($info['dependencies'] as $module) { diff --git a/core/tests/Drupal/Tests/UnitTestCase.php b/core/tests/Drupal/Tests/UnitTestCase.php index 2917318d11b22f1e186de01646e3e015df71cfca..1535c779dd5ce742aae15f6ee48a1cb49b66ed11 100644 --- a/core/tests/Drupal/Tests/UnitTestCase.php +++ b/core/tests/Drupal/Tests/UnitTestCase.php @@ -22,22 +22,21 @@ abstract class UnitTestCase extends \PHPUnit_Framework_TestCase { protected $randomGenerator; /** - * This method exists to support the simpletest UI runner. - * - * It should eventually be replaced with something native to phpunit. - * - * Also, this method is empty because you can't have an abstract static - * method. Sub-classes should always override it. + * Provides meta information about this test case, such as test name. * * @return array - * An array describing the test like so: - * array( - * 'name' => 'Something Test', - * 'description' => 'Tests Something', - * 'group' => 'Something', - * ) + * An array of untranslated strings with the following keys: + * - name: An overview of what is tested by the class; for example, "User + * access rules". + * - description: One sentence describing the test, starting with a verb. + * - group: The human-readable name of the module ("Node", "Statistics"), or + * the human-readable name of the Drupal facility tested (e.g. "Form API" + * or "XML-RPC"). */ public static function getInfo() { + // PHP does not allow us to declare this method as abstract public static, + // so we simply throw an exception here if this has not been implemented by + // a child class. throw new \RuntimeException("Sub-class must implement the getInfo method!"); }