Написание тестов для PHPUnit (исключения и ошибки)
Вступление
# Тестирование исключений
PHPUnit имеет хороший способ тестирования исключений, используя метод excException () . Приведенный ниже пример иллюстрирует использование метода excException () для проверки исключительной ситуации в тестируемом коде.
<?php
use PHPUnit\Framework\TestCase;
class ExceptionTest extends TestCase
{
public function testException()
{
$this->expectException(InvalidArgumentException::class);
}
}
?>
Когда выполняется тест для исключения, выводится, как показано ниже
$ phpunit ExceptionTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
F
Time: 0 seconds, Memory: 4.75Mb
There was 1 failure:
1) ExceptionTest::testException
Failed asserting that exception of type "InvalidArgumentException" is thrown.
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
Существуют и другие методы исключений, которые можно использовать при написании тестов PHPUnit, кроме методаwellException (), некоторые из них - это методExExceptionCode (), метод ExExceptionMessage () и метод ExExceptionMessageRegExp (). Эти методы используются для определения ожиданий исключений, возникающих в тестируемом коде.
Следует отметить, что методpectExceptionMessage () утверждает, что сообщение $ actual содержит сообщение $ Ожидаемое. Он не выполняет точное сравнение строк.
В качестве альтернативы, мы также можем использовать аннотации @expectedException () , @expectedExceptionCode (), @expectedExceptionMessage () и @expectedExceptionMessageRegExp (), чтобы установить ожидания для исключений, создаваемых тестируемым кодом. Пример ниже иллюстрирует использование некоторых из этих методов.
Пример Использование @ ExpectedException аннотацию
<?php
use PHPUnit\Framework\TestCase;
class ExceptionTest extends TestCase
{
/**
* @expectedException InvalidArgumentException
*/
public function testException()
{
}
}
?>
Когда выполняется тест с использованием аннотации @expectedException, генерируется следующий вывод.
$ phpunit ExceptionTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
F
Time: 0 seconds, Memory: 4.75Mb
There was 1 failure:
1) ExceptionTest::testException
Failed asserting that exception of type "InvalidArgumentException" is thrown.
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
# Тестирование ошибок PHP
По умолчанию PHPUnit преобразует ошибки PHP, предупреждения и уведомления, которые срабатывают во время выполнения теста, в исключение. Используя эти исключения, мы можем, например, ожидать, что тест вызовет ошибку PHP.
Следует отметить, что конфигурация времени выполнения PHP error_reporting может ограничивать количество ошибок, которые PHPUnit преобразует в исключения.
При тестировании на ошибки убедитесь, что ошибка, на которую вы тестируете, не подавлена настройками в конфигурации ошибок PHP.
Пример ниже иллюстрирует тестирование на ошибки PHP с использованием аннотации @expectedException .
<?php
use PHPUnit\Framework\TestCase;
class ExpectedErrorTest extends TestCase
{
/**
* @expectedException PHPUnit\Framework\Error\Error
*/
public function testFailingInclude()
{
include 'not_existing_file.php';
}
}
?>
Когда вышеуказанный тест выполняется, вывод ниже
$ phpunit -d error_reporting=2 ExpectedErrorTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
.
Time: 0 seconds, Memory: 5.25Mb
OK (1 test, 1 assertion)
PHPUnit / Framework / Error / Notice и PHPUnit / Framework / Error / Warning представляют уведомления и предупреждения PHP, соответственно.
Следует отметить, что тесты на исключения должны быть как можно более конкретными. Тестирование на слишком общие классы может привести к нежелательным побочным эффектам.
Также больше не разрешается тестировать класс Exception с помощью аннотации @expectedException и метода Ожидаемое исключение.
В некоторых тестах, использующих функции PHP для вызова ошибок, таких как fopen, иногда полезно использовать подавление ошибок в таких тестах. Это позволяет нам проверять возвращаемые значения, подавляя уведомления, которые могут привести к PHPUnit PHPUnit / Framework / Error / Notice.
Пример ниже иллюстрирует тест для возвращаемых значений кодов, который использует ошибки PHP.
<?php
use PHPUnit\Framework\TestCase;
class ErrorSuppressionTest extends TestCase
{
public function testFileWriting()
{
$writer = new FileWriter;
$this->assertFalse(@$writer->write('/is-not-writeable/file', 'stuff'));
}
}
class FileWriter
{
public function write($file, $content)
{
$file = fopen($file, 'w');
if ($file == false) {
return false;
}
// ...
}
}
?>
Результат теста выше показан ниже
$ phpunit ErrorSuppressionTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
.
Time: 1 seconds, Memory: 5.25Mb
OK (1 test, 1 assertion)
Если подавление ошибок не использовалось в приведенном выше тесте, тест завершится ошибкой, сообщив fopen (/ is-not-writeable / file): не удалось открыть поток: такого файла или каталога нет.
Предыдущая: Написание тестов для phpunit (выходы)
Далее: Тестер командной строки (1)
Новый контент: Composer: менеджер зависимостей для PHP , R программирования