Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Матчеры PHP: Автоматическое тестирование

Любое утверждение можно превратить в проверку на истинность:

<?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 может расширяться собственными проверками. В целом, вам придется постоянно заглядывать в документацию, чтобы вспомнить, что там есть.


Дополнительные материалы

  1. Матчеры PHPUnit

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 4 апреля

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»