phpunit - может ли название testsuite совпадать с существующим классом?

Я создал набор сценариев php, которые выполняют ряд операций Memcached, и я написал тесты phpunit для этого набора. Название набора тестов Memcachedи phpunit.xml.dist Файл выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true">
    <testsuites>
        <testsuite name="Memcached">
            <directory>./test</directory>
        </testsuite>
    </testsuites>
</phpunit>

Однако, когда я запускаю этот набор тестов с --testsuite=Memcached флаг, я получаю следующую ошибку:

PHP Fatal error:  Uncaught PHPUnit\Framework\Exception: Class "Memcached" does not extend PHPUnit\Framework\TestCase.

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

Если я переименую тестовый набор в MemcachedTest в файле XML, и запустите тесты с --testsuite=MemcachedTest флаг, модульные тесты запускаются и завершаются с нулевыми ошибками.

Я бы лучше назвал набор тестов Memcached, так как это будет соответствовать форматированию наших других наборов тестов.

Можно ли назвать наборы тестов для phpunit так же, как существующий класс?

2 ответа

Решение

Чтобы ответить на ваш вопрос:

Можно ли назвать наборы тестов для phpunit так же, как существующий класс?

Да, но только если класс является реализацией набора тестов.

В противном случае нет.

Причина, по которой вы столкнулись с этой проблемой:

Если имя набора тестов является именем существующего класса, класс будет создан как набор тестов.

Memcached это явно не набор тестов PHPUnit.

С другой стороны:

Если набор тестов является просто строкой, пустой TestSuite Объект будет создан с заданным именем.

Чтобы решить вашу проблему, присвойте комплекту тестов имя, которое не является именем класса:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true">
    <testsuites>
        <testsuite name="Memcached Tests">
            <directory>./test</directory>
        </testsuite>
    </testsuites>
</phpunit>

Поведение, которое вы испытали, на самом деле задокументировано в PHPUnit\Framework\TestSuite класс:

/**
 * Constructs a new TestSuite:
 *
 *   - PHPUnit\Framework\TestSuite() constructs an empty TestSuite.
 *
 *   - PHPUnit\Framework\TestSuite(ReflectionClass) constructs a
 *     TestSuite from the given class.
 *
 *   - PHPUnit\Framework\TestSuite(ReflectionClass, String)
 *     constructs a TestSuite from the given class with the given
 *     name.
 *
 *   - PHPUnit\Framework\TestSuite(String) either constructs a
 *     TestSuite from the given class (if the passed string is the
 *     name of an existing class) or constructs an empty TestSuite
 *     with the given name.
 *
 * @param mixed  $theClass
 * @param string $name
 *
 * @throws Exception
 */

Ваши тестовые классы должны быть расширены \PHPUnit_Framework_TestCase учебный класс

<?php
/**
 * Class SomeTest.
 */
class SomeTest extends \PHPUnit_Framework_TestCase
{
    public function testSomething()
    {
        // test case
    }
}

См. Документ https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html

Другие вопросы по тегам