Незавершенные и пропущенные тесты
Незавершенные тесты
При работе над новым классом тестовых случаев, вы можете начать с написания пустых тестовых методов, таких как:
public function testSomething(): void
{
}
чтобы отслеживать тесты, которые необходимо написать. Проблема с пустыми тестовыми методами заключается в том, что они интерпретируются фреймворком PHPUnit как успешные. Это неправильное толкование приводит к тому, что отчеты о тестах бесполезны — вы не можете увидеть, действительно ли тест успешен, или просто еще не реализован. Вызов $this->fail() в методе нереализованного теста также не помогает, так как тогда тест будет интерпретироваться как неудачный. Это было бы так же неправильно, как интерпретировать нереализованный тест как успешный.
Если мы считаем успешный тест зелёным светом, а неудачу теста — красным светом, нам нужен дополнительный жёлтый свет, чтобы отметить тест как неполный или ещё не реализованный. PHPUnit\Framework\IncompleteTest — это маркерный интерфейс для маркировки исключения, которое генерируется тестовым методом в результате неполного или нереализованного теста. PHPUnit\Framework\IncompleteTestError — стандартная реализация этого интерфейса.
Пример 7.1 демонстрирует класс тестового случая, SampleTest, который содержит один тестовый метод, testSomething(). Вызывая вспомогательный метод markTestIncomplete() (который автоматически генерирует исключение PHPUnit\Framework\IncompleteTestError) в тестовом методе, мы помечаем тест как неполный.
<?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 для обозначения тестов как неполных.
| Метод | Значение |
|---|---|
void markTestIncomplete() | Помечает текущий тест как неполный. |
void markTestIncomplete(string $message) | Помечает текущий тест как неполный, используя $message в качестве поясняющего сообщения. |
Пропускание тестов
Не все тесты могут выполняться в каждой среде. Например, рассмотрите абстракцию уровня базы данных, которая имеет несколько драйверов для различных систем баз данных, которые она поддерживает. Тесты для драйвера MySQL могут выполняться только в том случае, если сервер MySQL доступен.
Пример 7.2 демонстрирует класс тестового случая, DatabaseTest, который содержит один тестовый метод, testConnection(). В шаблоне метода setUp() класса тестового случая мы проверяем доступность расширения MySQLi и используем метод markTestSkipped() для пропуска теста, если он недоступен.
<?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 для пропуска тестов.
| Метод | Значение |
|---|---|
void markTestSkipped() | Помечает текущий тест как пропущенный. |
void markTestSkipped(string $message) | Помечает текущий тест как пропущенный, используя $message в качестве поясняющего сообщения. |
Пропускание тестов с помощью @requires
Помимо вышеперечисленных методов, также можно использовать аннотацию @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 не сработает.
<?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