Spec-Zone.ru › PHPUnit 9

Незавершенные и пропущенные тесты

Незавершенные тесты

При работе над новым классом тестовых случаев, вы можете начать с написания пустых тестовых методов, таких как:

public function testSomething(): void
{
}

чтобы отслеживать тесты, которые необходимо написать. Проблема с пустыми тестовыми методами заключается в том, что они интерпретируются фреймворком PHPUnit как успешные. Это неправильное толкование приводит к тому, что отчеты о тестах бесполезны — вы не можете увидеть, действительно ли тест успешен, или просто еще не реализован. Вызов $this->fail() в методе нереализованного теста также не помогает, так как тогда тест будет интерпретироваться как неудачный. Это было бы так же неправильно, как интерпретировать нереализованный тест как успешный.

Если мы считаем успешный тест зелёным светом, а неудачу теста — красным светом, нам нужен дополнительный жёлтый свет, чтобы отметить тест как неполный или ещё не реализованный. PHPUnit\Framework\IncompleteTest — это маркерный интерфейс для маркировки исключения, которое генерируется тестовым методом в результате неполного или нереализованного теста. PHPUnit\Framework\IncompleteTestError — стандартная реализация этого интерфейса.

Пример 7.1 демонстрирует класс тестового случая, SampleTest, который содержит один тестовый метод, testSomething(). Вызывая вспомогательный метод markTestIncomplete() (который автоматически генерирует исключение PHPUnit\Framework\IncompleteTestError) в тестовом методе, мы помечаем тест как неполный.

Пример 7.1 Отметить тест как неполный
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;

final class SampleTest extends TestCase
{
    public function testSomething(): void
    {
        // Optional: Test anything here, if you want.
        $this->assertTrue(true, 'This should already work.');

        // Stop here and mark this test as incomplete.
        $this->markTestIncomplete(
          'This test has not been implemented yet.'
        );
    }
}

Незавершенный тест обозначается I в выводе тестовой утилиты PHPUnit, как показано в следующем примере:

$ phpunit --verbose SampleTest
PHPUnit 9.5.0 by Sebastian Bergmann and contributors.

I

Time: 0 seconds, Memory: 3.95Mb

There was 1 incomplete test:

1) SampleTest::testSomething
This test has not been implemented yet.

/home/sb/SampleTest.php:12
OK, but incomplete or skipped tests!
Tests: 1, Assertions: 1, Incomplete: 1.

Таблица 7.1 отображает API для обозначения тестов как неполных.

Таблица 7.1 API для неполных тестов
Метод Значение
void markTestIncomplete() Помечает текущий тест как неполный.
void markTestIncomplete(string $message) Помечает текущий тест как неполный, используя $message в качестве поясняющего сообщения.

Пропускание тестов

Не все тесты могут выполняться в каждой среде. Например, рассмотрите абстракцию уровня базы данных, которая имеет несколько драйверов для различных систем баз данных, которые она поддерживает. Тесты для драйвера MySQL могут выполняться только в том случае, если сервер MySQL доступен.

Пример 7.2 демонстрирует класс тестового случая, DatabaseTest, который содержит один тестовый метод, testConnection(). В шаблоне метода setUp() класса тестового случая мы проверяем доступность расширения MySQLi и используем метод markTestSkipped() для пропуска теста, если он недоступен.

Пример 7.2 Пропуск теста
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;

final class DatabaseTest extends TestCase
{
    protected function setUp(): void
    {
        if (!extension_loaded('mysqli')) {
            $this->markTestSkipped(
              'The MySQLi extension is not available.'
            );
        }
    }

    public function testConnection(): void
    {
        // ...
    }
}

Тест, который был пропущен, обозначается S в выводе тестовой утилиты PHPUnit, как показано в следующем примере:

$ phpunit --verbose DatabaseTest
PHPUnit 9.5.0 by Sebastian Bergmann and contributors.

S

Time: 0 seconds, Memory: 3.95Mb

There was 1 skipped test:

1) DatabaseTest::testConnection
The MySQLi extension is not available.

/home/sb/DatabaseTest.php:9
OK, but incomplete or skipped tests!
Tests: 1, Assertions: 0, Skipped: 1.

Таблица 7.2 показывает API для пропуска тестов.

Таблица 7.2 API для пропуска тестов
Метод Значение
void markTestSkipped() Помечает текущий тест как пропущенный.
void markTestSkipped(string $message) Помечает текущий тест как пропущенный, используя $message в качестве поясняющего сообщения.

Пропускание тестов с помощью @requires

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

Таблица 7.3 Возможные использования @requires
Тип Возможные значения Примеры Другой пример
PHP Любой идентификатор версии PHP вместе с необязательным оператором @requires PHP 7.1.20 @requires PHP >= 7.2
PHPUnit Любой идентификатор версии PHPUnit вместе с необязательным оператором @requires PHPUnit 7.3.1 @requires PHPUnit < 8
OS Любой регулярный выражение, сопоставляющий PHP_OS @requires OS Linux @requires OS WIN32|WINNT
OSFAMILY Любая семейство ОС @requires OSFAMILY Solaris @requires OSFAMILY Windows
function Любой допустимый параметр для function_exists @requires function imap_open @requires function ReflectionMethod::setAccessible
extension Любое имя расширения вместе с необязательным идентификатором версии и необязательным оператором @requires extension mysqli @requires extension redis >= 2.2.0

Поддерживаются следующие операторы для ограничений версий PHP, PHPUnit и расширений: <, <=, >, >=, =, ==, !=, <>.

Сравнение версий выполняется с помощью функции PHP version_compare. Это означает, что операторы = и == могут использоваться только с полными X.Y.Z номерами версий, и просто X.Y не сработает.

Пример 7.3 Пропуск тестовых случаев с помощью @requires
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;

/**
 * @requires extension mysqli
 */
final class DatabaseTest extends TestCase
{
    /**
     * @requires PHP >= 5.3
     */
    public function testConnection(): void
    {
        // Test requires the mysqli extension and PHP >= 5.3
    }

    // ... All other tests require the mysqli extension
}

Если вы используете синтаксис, который не компилируется с определённой версией PHP, обратитесь к xml-конфигурации для включения зависимых от версии в Элемент <testsuites>

© 2005–2020 Sebastian Bergmann
Licensed under the Creative Commons Attribution 3.0 Unported License.
https://phpunit.readthedocs.io/en/9.5/incomplete-and-skipped-tests.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API