Любое утверждение можно превратить в проверку на истинность:
<?php
public function testCapitalize()
{
$this->assertTrue('Hello' == capitalize('hello'));
}
Проблема в том, что в таком случае пострадает вывод. Отлаживать такие проверки значительно сложнее, чем специализированные проверки, заточенные под конкретную ситуацию. PHPUnit поставляется с большим числом готовых утверждений, часть из которых используется достаточно часто. Здесь мы рассмотрим некоторые из них.
Массивы
Рассмотрим проверки для массивов:
<?php
// Проверяет количество элементов
$this->assertCount(0, ['foo']);
// Ожидает пустой массив
$this->assertEmpty(['foo']); // или assertNotEmpty
// При сравнении приводит к одному виду
// В случае массивов сортирует их
$this->assertEqualsCanonicalizing($arr1, $arr2);
// Проверяет, что элемент слева входит в массив справа
$this->assertContains(4, [1, 2, 3]);
Строки
Перейдем к проверкам для строк:
<?php
// Проверяет окончание строки
$this->assertStringEndsWith('suffix', 'foo');
// Проверяет, что строка соответствует формату
// Варианты форматирования указаны в документации PHPUnit
$this->assertStringMatchesFormat('%i', 'foo');
// Проверяет наличие подстроки в строке
$this->assertStringContainsString('foo', 'bar');
Печать на экран
Иногда результат работы кода доступен только как вывод в консоль. В таком случае не существует никакого возврата значения из функции, которое можно сравнить с ожидаемым. Для таких ситуаций в PHPUnit есть несколько специализированных утверждений. Они перехватывают вывод (STDOUT) и дают возможность проверить его:
<?php
public function testSomeCode(): void
{
// Вызывается какой-то код, который печатает на экран
echo 'some output';
$this->expectOutputString('some output');
}
В этом коде expectOutputString()
проверяет точное соответствие, что не всегда удобно. Если хочется проверить только часть вывода, то можно воспользоваться другим способом:
<?php
public function testSomeCode(): void
{
// Вызывается какой-то код, который печатает на экран
echo 'some long output';
// Сюда передается регулярное выражение
$this->expectOutputRegexp('output');
}
Ошибки
Обработка ошибочных ситуаций — это тоже логика, которую нужно программировать и тестировать. Когда что-то идет не так, вызываемый код может выбрасывать исключения:
<?php
throw new Exception('something went wrong');
Исключения не работают как возврат из функций. Вместо этого, они поднимаются по стеку вызовов, до тех пор пока их не перехватят. Поэтому в PHPUnit для работы с исключениями используется специальное утверждение expectException()
:
<?php
public function testSomeCode(): void
{
// Сюда передается имя класса ожидаемого исключения
$this->expectException(Exception::class);
// Здесь вызов кода, который должен выбросить исключение
}
Очень важно вызывать expectException()
до кода, который выбрасывает исключение. Если исключение выброшено, то весь код после него не вызывается.
Это далеко не все утверждения, которые есть в PHPUnit. Более того, PHPUnit может расширяться собственными проверками. В целом, вам придется постоянно заглядывать в документацию, чтобы вспомнить, что там есть.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.