Перезапустить последний неудачный тест в PHPUnit - PullRequest
10 голосов
/ 19 августа 2011

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

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

Ответы [ 3 ]

10 голосов
/ 19 августа 2011

Взгляните на опцию --filter cli. Вы можете найти пример в organisation docs и в CLI Docs.

- фильтр

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

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

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

phpunit --filter ThatOneTestClassAgain

и

phpunit --filter testThisWorks

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

2 голосов
/ 18 декабря 2015

Способ, который я нашел для его реализации, довольно прост, но для его реализации требуется регистрация. Вы настраиваете 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.

Тесты-prepend.php (не забудьте изменить путь к файлу журнала JSON)

<?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;
        }
    }
}
0 голосов
/ 24 мая 2019

Начиная с PhpUnit 7.3 , вы можете кэшировать результаты своих тестов, а затем упорядочивать их по дефектам.

В phpunit.xml включите cacheResults:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit cacheResult="true"
         ...>

Если вы не хотите редактировать свой phpunit.xml, вы также можете запустить свои тесты с флагом --cache-results.

При кэшировании результатов PhpUnit создаст файл .phpunit.result.cache после выполнения тестов (обязательно добавьте этот файл в ваш (глобальный) файл gitignore).

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

phpunit --order-by=defects --stop-on-failure
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...