Неполные и пропущенные тесты
Вступление
# Неполные тесты
Когда мы собираемся написать новый тестовый класс, мы можем начать с написания пустых тестовых методов, таких как этот:
public function testSomething()
{
}
с намерением завершить его позже или отслеживать тесты, которые мы должны написать. Эти методы тестирования обычно пусты и поэтому называются неполными тестами в PHPUnit.
Одна из основных проблем этого типа методов тестирования в PHPUnit заключается в том, что они интерпретируются как успех, ложная интерпретация, которая делает отчеты о тестах бесполезными. Это связано с тем, что в PHPUnit по умолчанию нет никакого механизма сказать, что тест еще не полностью реализован.
В этой ситуации даже вызов `$ this-> fail ()` в нереализованном методе test также не помогает, так как тест будет интерпретирован как сбой. Это было бы так же неправильно, как интерпретировать невыполненный тест как успех.
Мы можем думать об этом таким образом, рассматривая успешный тест как зеленый свет, а неудавшийся тест как красный, поэтому нам нужен дополнительный желтый свет, чтобы пометить тест как незавершенный или еще не реализованный.
Благодаря `PHPUnit / Framework / IncompleteTest`, интерфейс маркера для маркировки исключения, которое будет вызвано тестовым методом в результате теста, является неполным или не полностью реализованным.
Стандартный интерфейс для реализации `PHPUnit / Framework / IncompleteTest` - это PHPUnit / Framework / IncompleteTestError`.
В приведенном ниже примере показан класс тестового примера `SampleTest`, который содержит один тестовый метод` testSomething () `. В этом классе тестового примера исключение `PHPUnit / Framework / IncompleteTestError` было вызвано вызовом вспомогательного метода markTestIncomplete ()` (который автоматически вызывает исключение PHPUnit / Framework / IncompleteTestError) в тестовом методе, помечая тест как неполный.
<?php
use PHPUnit\Framework\TestCase;
class SampleTest extends TestCase
{
public function testSomething()
{
// 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 |version|.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.
В PHPUnit API помогает пометить тесты как неполные.
метод | Имея в виду |
---|---|
void markTestIncomplete () | Отмечает текущий тест как незавершенный. |
void markTestIncomplete (строка $ message) | Помечает текущий тест как незавершенный, используя `$ message` в качестве пояснительного сообщения. |
# Пропуск тестов
В реальной среде некоторые тесты не могут выполняться в какой-либо среде, а некоторые - взаимоисключающие. В таких ситуациях тест может быть пропущен, чтобы дать возможность другому запустить.
Рассмотрим, например, уровень абстракции базы данных, который имеет несколько драйверов для различных систем баз данных, которые он поддерживает. Тесты для драйвера MySQL могут, конечно, выполняться только при наличии сервера MySQL.
В приведенном ниже примере показан класс тестового примера `DatabaseTest`, который содержит один тестовый метод` testConnection () `. В методе шаблона класса `setUp ()` тестового примера мы проверяем, доступно ли расширение MySQLi, и используем метод markTestSkipped (), чтобы пропустить тест, если это не так.
<?php
use PHPUnit\Framework\TestCase;
class DatabaseTest extends TestCase
{
protected function setUp(): void
{
if (!extension_loaded('mysqli')) {
$this->markTestSkipped(
'The MySQLi extension is not available.'
);
}
}
public function testConnection()
{
// ...
}
}
?>
PHPUnit обозначает пропущенный тест символом `S` в выходных данных средства запуска теста командной строки PHPUnit, как показано в следующем примере:
$ phpunit --verbose DatabaseTest
PHPUnit |version|.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.
метод | Имея в виду |
---|---|
void markTestSkipped () | Помечает текущий тест как пропущенный |
Void markTestSkipped (строка $ сообщение) | Помечает текущий тест как пропущенный, используя $ message в качестве пояснительного сообщения. |
# Пропуск тестов с использованием @requires
В дополнение к перечисленным выше методам, в PHPUnit также можно использовать аннотацию `@ require` для выражения общих предварительных условий для тестового примера, как показано в таблице.
Тип | Возможные значения | Примеры | Другой пример |
---|---|---|---|
PHP | Любой идентификатор версии PHP | @requires PHP 5.3.3 | @requires PHP 7.1-dev |
PHPUnit | Любой идентификатор версии PHPUnit | @requires PHPUnit 3.6.3 | @requires PHPUnit 4.6 |
Операционные системы | Регулярное выражение, соответствующее PHP_OS | @requires ОС Linux | @requires OS WIN32 | WINNT |
OSFAMILY | Любое семейство ОС | @requires OSFAMILY Solaris | @requires OSFAMILY Windows |
ФУНКЦИЯ | Любой действительный параметр для function_exists | Функция @requires imap_open | Функция @requires ReflectionMethod :: setAccessible |
расширение | Любое имя расширения вместе с необязательным идентификатором версии | @requires расширение mysqli | @requires extension redis 2.2.0 |
Пример, иллюстрирующий пропущенный тест с использованием @requires
<?php
use PHPUnit\Framework\TestCase;
/**
* @requires extension mysqli
*/
class DatabaseTest extends TestCase
{
/**
* @requires PHP 5.3
*/
public function testConnection()
{
// Test requires the mysqli extension and PHP >= 5.3
}
// ... All other tests require the mysqli extension
}
?>
Если вы используете синтаксис, который не компилируется с определенной версией PHP, изучите конфигурацию xml для зависимых от версии включений в комплектах тестов.
Предыдущая: Рискованные тесты
Далее: Тест удваивается
Новый контент: Composer: менеджер зависимостей для PHP , R программирования