Повторный запуск последнего неудачного теста в PHPUnit

Вы можете использовать --stop-on-failure чтобы сломать тестирование устройства, когда один из тестов --stop-on-failure с ошибкой.

Есть ли какой-нибудь быстрый способ сказать PHPUnit повторно запустить этот неудачный тест, вместо этого предоставив полный путь вручную?

Посмотрите опцию --filter . Вы можете найти пример в organisation docs и в CLI Docs .

–фильтр

Выполняется только те тесты, чье имя соответствует заданному шаблону. Шаблон может быть либо именем одного теста, либо регулярным выражением, которое соответствует нескольким именам тестов.

Предположим, что ваш запуск phpunit Tests/ and Tests/Stuff/ThatOneTestClassAgain::testThisWorks завершается с ошибкой:

ваши варианты:

phpunit --filter ThatOneTestClassAgain

а также

phpunit --filter testThisWorks

или большинство других строк, которые каким-то образом имеют смысл

Способ, которым я нашел его реализовать, довольно прост, но требует выполнения регистрации. Вы устанавливаете phpunit для входа в json-файл. Затем вы изменяете команду phpunit на что-то похожее:

 cd /home/vagrant/tests && php -d auto_prepend_file=./tests-prepend.php /usr/local/bin/phpunit 

Это делает auto_prepend php-файл перед выполнением phpunit. Таким образом, мы можем захватить $ argsv и автоматически предоставить необходимую команду фильтра phpunit.

tests-prepend.php (обязательно исправьте путь файла json log)

 <?php global $argv, $argc; if(empty($argv) === false) { // are we re-running? $has_rerun = false; foreach ($argv as $key => $value) { if($value === '--rerun-failures') { $has_rerun = true; unset($argv[$key]); break; } } if($has_rerun === true) { // validate the path exists and if so then capture the json data. $path = realpath(dirname(__FILE__).'/../logs/report.json'); if(is_file($path) === true) { // special consideration taken here as phpunit does not store the report as a json array. $data = json_decode('['.str_replace('}{'.PHP_EOL, '},{'.PHP_EOL, file_get_contents($path).']'), true); $failed = array(); // capture the failures as well as errors but taking care not to capture skipped tests. foreach ($data as $event) { if($event['event'] === 'test') { if($event['status'] === 'fail') { $failed[] = array($event['test'], 'failed'); } elseif($event['status'] === 'error' && $event['trace'][0]['function'] !== 'markTestIncomplete') { $failed[] = array($event['test'], 'error\'d'); } } } if(empty($failed) === true) { echo 'There are no failed tests to re-run.'.PHP_EOL.PHP_EOL; exit; } else{ echo '--------------------------------------------------------------------'.PHP_EOL; echo 'Re-running the following tests: '.PHP_EOL; foreach ($failed as $key => $test_data) { echo ' - '.$test_data[0].' ('.$test_data[1].')'.PHP_EOL; // important to escapre the namespace backslashes. $failed[$key] = addslashes($test_data[0]); } echo '--------------------------------------------------------------------'.PHP_EOL.PHP_EOL; } $argv[] = '--filter'; $argv[] = '/('.implode('|', $failed).')/'; // important to update the globals in every location. $_SERVER['argv'] = $GLOBALS['_SERVER']['argv'] = $GLOBALS['argv'] = $argv = array_values($argv); $_SERVER['argc'] = $GLOBALS['_SERVER']['argc'] = $GLOBALS['argc'] = $argc = count($argv); } else{ echo 'The last run report log at '.$path.' does not exist so it is not possible to re-run the failed tests. Please re-run the test suite without the --rerun-failures command.'.PHP_EOL.PHP_EOL; exit; } } } с <?php global $argv, $argc; if(empty($argv) === false) { // are we re-running? $has_rerun = false; foreach ($argv as $key => $value) { if($value === '--rerun-failures') { $has_rerun = true; unset($argv[$key]); break; } } if($has_rerun === true) { // validate the path exists and if so then capture the json data. $path = realpath(dirname(__FILE__).'/../logs/report.json'); if(is_file($path) === true) { // special consideration taken here as phpunit does not store the report as a json array. $data = json_decode('['.str_replace('}{'.PHP_EOL, '},{'.PHP_EOL, file_get_contents($path).']'), true); $failed = array(); // capture the failures as well as errors but taking care not to capture skipped tests. foreach ($data as $event) { if($event['event'] === 'test') { if($event['status'] === 'fail') { $failed[] = array($event['test'], 'failed'); } elseif($event['status'] === 'error' && $event['trace'][0]['function'] !== 'markTestIncomplete') { $failed[] = array($event['test'], 'error\'d'); } } } if(empty($failed) === true) { echo 'There are no failed tests to re-run.'.PHP_EOL.PHP_EOL; exit; } else{ echo '--------------------------------------------------------------------'.PHP_EOL; echo 'Re-running the following tests: '.PHP_EOL; foreach ($failed as $key => $test_data) { echo ' - '.$test_data[0].' ('.$test_data[1].')'.PHP_EOL; // important to escapre the namespace backslashes. $failed[$key] = addslashes($test_data[0]); } echo '--------------------------------------------------------------------'.PHP_EOL.PHP_EOL; } $argv[] = '--filter'; $argv[] = '/('.implode('|', $failed).')/'; // important to update the globals in every location. $_SERVER['argv'] = $GLOBALS['_SERVER']['argv'] = $GLOBALS['argv'] = $argv = array_values($argv); $_SERVER['argc'] = $GLOBALS['_SERVER']['argc'] = $GLOBALS['argc'] = $argc = count($argv); } else{ echo 'The last run report log at '.$path.' does not exist so it is not possible to re-run the failed tests. Please re-run the test suite without the --rerun-failures command.'.PHP_EOL.PHP_EOL; exit; } } }