Почему мой пользовательский тест не запускается PHPUnit? - PullRequest
1 голос
/ 06 июня 2019

Как описано в PHPUnit doc , вы можете реализовать PHPUnit\Framework\Test для написания пользовательских тестов.

Звучит отлично, но как я могу запустить эти тесты как часть моего комплекта тестов?

Учитывая следующий тестовый каталог:

+tests/
   |- NormalTestExtendingTestCaseTest.php
   |- CustomTestImplementingTest.php
phpunit.xml

И мой файл phpunit.xml:

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.3/phpunit.xsd"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
>
    <testsuites>
        <testsuite name="My Test Suite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

PHPUnit выполняет только NormalTestExtendingTestCaseTest.php.


CustomTestImplementingTest.php

<?php
use PHPUnit\Framework\TestCase;

class CustomTestImplementingTest implements PHPUnit\Framework\Test
{

    public function count()
    {
        return 1;
    }

    public function run(PHPUnit\Framework\TestResult $result = null)
    {
        if ($result === null) {
            $result = new PHPUnit\Framework\TestResult;
        }

        $result->startTest($this);
        // do something
        $result->endTest($this, $stopTime);

        return $result;
    }
}

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Я нашел решение этой проблемы:

  1. Пользовательский класс теста должен реализовывать метод suite(), поэтому PHPUnit запускает полученный TestSuite (с нашими тестами)
  2. Тестовый класс должен объявлять метод получения getName() (даже если он не объявлен в интерфейсе PHPUnit\Framework\Test или при выполнении выдается исключение. Кроме того, имя не должно быть равно нулю или другое исключение - это выбрасывать при выполнении .

Итак, последний класс -

<?php

use PHPUnit\Framework\TestResult;
use PHPUnit\Framework\TestSuite;
use SebastianBergmann\Timer\Timer;
use PHPUnit\Framework\Test;

class CustomTestImplementingTest implements Test {

    protected $name = '';

    /**
     * This method create a TestSuite for this Test
     *
     * @return TestSuite
     * @throws ReflectionException
     */
    public static function suite() {
        $classname = (new \ReflectionClass(static::class))->getShortName();
        $suite = new TestSuite();
        $suite->setName($classname);
        $suite->addTest(new static());
        return $suite;
    }

    /**
     * @return mixed
     */
    public function getName() {
        return $this->name;
    }

    /**
     * @param mixed $name
     */
    public function setName($name): void {
        $this->name = $name;
    }

    public function count() {
        return 1;
    }

    public function run(TestResult $result = null): TestResult {
        if ($result === null) {
            $result = new PHPUnit\Framework\TestResult;
        }
        Timer::start();
        $stopTime = null;
        $result->startTest($this);

        try {
            // do something
        } catch (PHPUnit\Framework\AssertionFailedError $e) {
            $result->addFailure($this, $e, $stopTime);
        } catch (Exception $e) {
            $result->addError($this, $e, $stopTime);
        } finally {
            $stopTime = Timer::stop();
        }

        $result->endTest($this, $stopTime);

        return $result;
    }
}
0 голосов
/ 06 июня 2019

Убедитесь, что ваши классы имеют правильное наследование, правильные методы имен (начиная с 'test') и правильное пространство имен.

Возможно, вам придется запустить дамп-автозагрузку composer.

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