Spec-Zone.ru › PHPUnit 8

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

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

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

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 8.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 8.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 Любая семейство операционных систем OS family @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/8.5/incomplete-and-skipped-tests.html

Spec-Zone.ru

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