MDL-67673 phpunit: Remove the rerun hint on failed test cases
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 7 Oct 2020 18:41:44 +0000 (20:41 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 21 Oct 2020 10:46:00 +0000 (12:46 +0200)
That custom printer was using some hacks to be able to intercept
configuration switches, reflection and other tricks to be able to
print the:

To re-run:
 vendor/bin/phpunit --verbose "core_setuplib_testcase" lib/tests/setuplib_test.php

line on every failed/exceptional/skipped test. After some internal
discussion it was agreed that the normal phpunit output:

1) core_setuplib_testcase::test_localcachedir
Time is lower that allowed start value
Failed asserting that 1601976686 is equal to 1601976687 or is greater than 1601976687.

/var/www/html/lib/phpunit/classes/advanced_testcase.php:446
/var/www/html/lib/tests/setuplib_test.php:170
/var/www/html/lib/phpunit/classes/advanced_testcase.php:80

has already all the information at hand about how to rerun a test:

- vendor/bin/phpunit lib/tests/setuplib_test.php
- vendor/bin/phpunit --filter core_setuplib_testcase::test_localcachedir
- vendor/bin/phpunit --filter ::test_localcachedir
- vendor/bin/phpunit --testsuite componentname_testsuite
- vendor/bin/phpunit --config <<compoenent directory>>
- use --cache-result to get failed tests rerun with ease.
- ...

So better, let's use standard phpunit output and done. Also, note that,
with the upgrade to phpunit 8.5, the printer was not working correctly
any more, causing some switches, like --verbose ... to be ignored. Sure
it could have been fixed but, as commented above, no real need for all
that "parapheranlia" to print the rerun information.

lib/phpunit/classes/hint_resultprinter.php [deleted file]
lib/phpunit/lib.php
phpunit.xml.dist

diff --git a/lib/phpunit/classes/hint_resultprinter.php b/lib/phpunit/classes/hint_resultprinter.php
deleted file mode 100644 (file)
index 228db3e..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-// This file is part of Moodle - http://moodle.org/
-//
-// Moodle is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Moodle is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
-
-/**
- * Helper test listener.
- *
- * @package    core
- * @category   phpunit
- * @copyright  2012 Petr Skoda {@link http://skodak.org}
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-
-/**
- * Helper test listener that prints command necessary
- * for execution of failed test.
- *
- * @package    core
- * @category   phpunit
- * @copyright  2012 Petr Skoda {@link http://skodak.org}
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class Hint_ResultPrinter extends PHPUnit\TextUI\ResultPrinter {
-    public function __construct() {
-        // ARRGH - PHPUnit does not give us commandline arguments or xml config, so let's hack hard!
-        if (defined('DEBUG_BACKTRACE_PROVIDE_OBJECT')) {
-            $backtrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT);
-            if (isset($backtrace[2]['object']) and ($backtrace[2]['object'] instanceof PHPUnit\TextUI\Command)) {
-                list($verbose, $colors, $debug) = Hacky_TextUI_Command_reader::get_settings_hackery($backtrace[2]['object']);
-                parent::__construct(null, $verbose, $colors, $debug);
-                return;
-            }
-        }
-        // Fallback if something goes wrong.
-        parent::__construct(null, false, self::COLOR_DEFAULT, false);
-    }
-
-    protected function printDefectTrace(PHPUnit\Framework\TestFailure $defect): void {
-        global $CFG;
-
-        parent::printDefectTrace($defect);
-
-        $failedTest = $defect->failedTest();
-        $testName = get_class($failedTest);
-
-        $exception = $defect->thrownException();
-        $trace = $exception->getTrace();
-
-        if (class_exists('ReflectionClass')) {
-            $reflection = new ReflectionClass($testName);
-            $file = $reflection->getFileName();
-
-        } else {
-            $file = false;
-            $dirroot = realpath($CFG->dirroot).DIRECTORY_SEPARATOR;
-            $classpath = realpath("$CFG->dirroot/lib/phpunit/classes").DIRECTORY_SEPARATOR;
-            foreach ($trace as $item) {
-                if (strpos($item['file'], $dirroot) === 0 and strpos($item['file'], $classpath) !== 0) {
-                    if ($content = file_get_contents($item['file'])) {
-                        if (preg_match('/class\s+'.$testName.'\s+extends/', $content)) {
-                            $file = $item['file'];
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-
-        if ($file === false) {
-            return;
-        }
-
-        $cwd = getcwd();
-        if (strpos($file, $cwd) === 0) {
-            $file = substr($file, strlen($cwd)+1);
-            $file = testing_cli_fix_directory_separator($file);
-        }
-
-        $pathprefix = testing_cli_argument_path('/');
-        if ($pathprefix) {
-            $pathprefix .= DIRECTORY_SEPARATOR;
-        }
-
-        // There is only vendor/bin/phpunit executable. There is no .cmd or .bat files.
-        $executable = $pathprefix . 'vendor' . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'phpunit';
-        $executable = testing_cli_fix_directory_separator($executable);
-
-        // Add server arguments to the rerun if passed.
-        if (isset($_SERVER['argv'][0])) {
-            if (preg_match('/phpunit(\.bat|\.cmd)?$/', $_SERVER['argv'][0])) {
-                for($i=1;$i<count($_SERVER['argv']);$i++) {
-                    if (!isset($_SERVER['argv'][$i])) {
-                        break;
-                    }
-                    if (in_array($_SERVER['argv'][$i], array('--colors', '--verbose', '-v', '--debug'))) {
-                        $executable .= ' '.$_SERVER['argv'][$i];
-                    } else if (in_array($_SERVER['argv'][$i], array('-c', '--config'))) {
-                        $executable .= ' '.$_SERVER['argv'][$i] . ' ' . $_SERVER['argv'][++$i];
-                    } else if (strpos($_SERVER['argv'][$i], '--config') === 0) {
-                        $executable .= ' '.$_SERVER['argv'][$i];
-                    }
-                }
-            }
-        }
-
-        $this->write("\nTo re-run:\n $executable \"$testName\" $file\n");
-    }
-}
-
-
-/**
- * Class used in bloody hack that works around result printer constructor troubles.
- *
- * @package    core
- * @category   phpunit
- * @copyright  2012 Petr Skoda {@link http://skodak.org}
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class Hacky_TextUI_Command_reader extends PHPUnit\TextUI\Command {
-    public static function get_settings_hackery(PHPUnit\TextUI\Command $toread) {
-        $arguments = $toread->arguments;
-        $config = PHPUnit\Util\Configuration::getInstance($arguments['configuration'])->getPHPUnitConfiguration();
-
-        $verbose = isset($config['verbose']) ? $config['verbose'] : false;
-        $verbose = isset($arguments['verbose']) ? $arguments['verbose'] : $verbose;
-
-        $colors = isset($config['colors']) ? $config['colors'] : Hint_ResultPrinter::COLOR_DEFAULT;
-        $colors = isset($arguments['colors']) ? $arguments['colors'] : $colors;
-
-        $debug = isset($config['debug']) ? $config['debug'] : false;
-        $debug = isset($arguments['debug']) ? $arguments['debug'] : $debug;
-
-        return array($verbose, $colors, $debug);
-    }
-}
index 3396c7b..d8ac8b7 100644 (file)
@@ -35,7 +35,6 @@ require_once(__DIR__.'/classes/base_testcase.php');
 require_once(__DIR__.'/classes/basic_testcase.php');
 require_once(__DIR__.'/classes/database_driver_testcase.php');
 require_once(__DIR__.'/classes/advanced_testcase.php');
 require_once(__DIR__.'/classes/basic_testcase.php');
 require_once(__DIR__.'/classes/database_driver_testcase.php');
 require_once(__DIR__.'/classes/advanced_testcase.php');
-require_once(__DIR__.'/classes/hint_resultprinter.php'); // Loaded here because phpunit.xml does not support relative links for printerFile.
 require_once(__DIR__.'/classes/constraint_object_is_equal_with_exceptions.php');
 require_once(__DIR__.'/../testing/classes/test_lock.php');
 require_once(__DIR__.'/../testing/classes/tests_finder.php');
 require_once(__DIR__.'/classes/constraint_object_is_equal_with_exceptions.php');
 require_once(__DIR__.'/../testing/classes/test_lock.php');
 require_once(__DIR__.'/../testing/classes/tests_finder.php');
index 2e84bf2..e12def3 100644 (file)
@@ -16,7 +16,6 @@
         stopOnSkipped="false"
         beStrictAboutTestsThatDoNotTestAnything="false"
         beStrictAboutOutputDuringTests="true"
         stopOnSkipped="false"
         beStrictAboutTestsThatDoNotTestAnything="false"
         beStrictAboutOutputDuringTests="true"
-        printerClass="Hint_ResultPrinter"
         testSuiteLoaderClass="phpunit_autoloader"
         >
 
         testSuiteLoaderClass="phpunit_autoloader"
         >