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

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

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

<?php

public 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

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

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

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
20 октября 8 месяцев

Есть вопрос или хотите участвовать в обсуждении?

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

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»