кодесурса
«PHPUnit

Написание тестов для PHPUnit (исключения и ошибки)

script1adsense2code
script1adsense3code

Вступление

# Тестирование исключений

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 программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code