Как настроить PHPUnit, чтобы рассматривать ошибку поставщика данных как сбой, а не как предупреждение? - PullRequest
2 голосов
/ 02 апреля 2019

Я запускаю свои модульные тесты PHP, используя PHPUnit. Если провайдер данных не загружается, вместо сбоя выдается предупреждение.

Вплоть до версии 4 PHPUnit, когда провайдер данных не загружается, в выводе PHPUnit отображается сбой. Начиная с PHPUnit 5, вместо этого выдается предупреждение. Это проблема при запуске тестов с использованием сценария (например, при непрерывной интеграции), поэтому я не вижу результатов.

Другое отличие заключается в том, что при выполнении кода с PHP 5 по сравнению с PHP 7. При запуске тестов с PHP 5 вместо просмотра вывода PHPUnit я сразу получаю PHP Fatal Error. В PHP 7 он показывает только сбой / предупреждение, когда PHPUnit попадает в неудачный тест. Это наводит меня на мысль, что это как-то связано с обработчиком error_handler, установленным PHPUnit, который может отлавливать ошибку, которую выдает PHP7, но PHP5 нет.

Вот мой PHP-код:

class TestTest extends PHPUnit_Extensions_Database_TestCase
{
    /**
     * @dataProvider provider_sample
     */

    public function test_sample($foo)
    {
        $this->assertString($foo);
    }

    public function provider_sample()
    {
        return [
            [ClassName::string] // no such class, this should fail
        ];
    }

    public function getDataset()
    {
        return new ArrayDataSet([]);
    }
}

Вот результаты работы PHPUnit 4:

PHPUnit 4.8.36 by Sebastian Bergmann and contributors.

Runtime:        PHP 7.2.5
Configuration:  /home/some-path/phpunit.xml
Warning:        The Xdebug extension is not loaded
                No code coverage will be generated.

F

Time: 120 ms, Memory: 14.00MB

There was 1 failure:

1) Warning
The data provider specified for TestTest::test_sample is invalid.
Class 'ClassName' not found

FAILURES!
Tests: 1, Assertions: 0, Failures: 1.

А вот результаты запуска того же кода с PHPUnit 5:

PHPUnit 5.7.21 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.2.5
Configuration: /home/some-path/phpunit.xml
Error:         No code coverage driver is available

W                                                                   1 / 1 (100%)

Time: 99 ms, Memory: 14.00MB

There was 1 warning:

1) Warning
The data provider specified for TestTest::test_sample is invalid.
Class 'ClassName' not found

WARNINGS!
Tests: 1, Assertions: 0, Warnings: 1.

Результаты PHPUnit 4 - это то, чего я ожидаю и чего хочу. Есть ли способ настроить PHPUnit 5 и выше для того же поведения?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Я не думаю, что вы можете сделать именно то, что вам нужно, но если вы хотите интегрировать PHPUnit с сервером непрерывной интеграции (например, Jenkins), то вы можете создать JUnit-совместимый отчет с предупреждениями вместо ошибок, и попросите Дженкинса использовать это вместо отчета PHPUnit.

Для этого вам нужно будет расширить регистратор JUnit, поставляемый с PHPUnit:

use PHPUnit\Util\Log\JUnit;

class MyJUnit extends Junit {
    public function addWarning(Test $test, Warning $e, float $time): void {
        $this->addError($test, $e, $time);
    }
}

И зарегистрируйте его как слушателя в phpunit.xml:

<listeners>
  <listener class="MyJUnit" file="MyJUnit.php">
    <arguments>
      <!-- 
        Print the output to the file instead of stdout 
        which is the default.
      -->
      <string>junit.xml</string> 
    </arguments>
  </listener>
</listeners>

Наконец, перейдите в настройки Jenkins и добавьте задание JUnit, указывающее местоположение выходного файла.

0 голосов
/ 02 апреля 2019

проверьте имя файла и импортируйте

 require_once 'ClassName.php';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...