Advertisement
  1. Code
  2. Laravel 5
Code

Тестирование в Laravel

by
Difficulty:BeginnerLength:MediumLanguages:

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Независимо от приложения, с которым вы имеете дело, тестирование является важным и часто упускаемым аспектом. Сегодня мы обсудим это в контексте веб-фреймворка Laravel.

Фактически, Laravel уже поддерживает платформу тестирования PHPUnit в самом ядре. PHPUnit - одна из самых популярных и широко распространенных фреймворков для тестирования в сообществе PHP. Он позволяет создавать оба типа тестов - unit и functional.

Мы начнем с базового введения в модульное и функциональное тестирование. По мере продвижения мы изучим, как создавать модульные и функциональные тесты в Laravel. Я предполагаю, что вы знакомы с основами фреймворка PHPUnit, поскольку мы рассмотрим его в контексте Laravel в этой статье.

Модульные и функциональные тесты

Если вы уже знакомы с фреймворком PHPUnit, вы должны знать, что вы можете разделить тесты на два лагеря - модульные тесты и функциональные тесты.

В модульных тестах вы проверяете правильность заданной функции или метода. Что еще более важно, вы тестируете одну часть логики своего кода в данный момент времени.

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

Давайте быстро взглянем на пример, который идеально подходит для модульного тестирования.

Как вы можете видеть, метод делает одно действие. Он использует функцию ucfirst для преобразования заголовка в заголовок, который начинается с верхнего регистра.

В то время как модульный тест используется для проверки правильности одной логической единицы кода, функциональный тест, с другой стороны, позволяет проверить правильность конкретного варианта использования. Более конкретно, это позволяет вам имитировать действия, которые пользователь выполняет в приложении, для запуска конкретного варианта использования.

Например, вы можете реализовать функциональный тестовый пример для некоторых функций входа, которые могут включать в себя следующие шаги.

  • Создать GET запрос для доступа к странице логина.
  • Проверить, находимся ли мы на странице логина.
  • Создать POST запрос для отправки данных на страницу лоигна.
  • Проверить, успешно ли был создан сеанс.

Вот как вы должны создать функциональный тестовый сценарий. В следующем разделе мы создадим примеры, демонстрирующие, как создавать модульные и функциональные тесты в Laravel.

Настройка предварительных условий

Прежде чем мы начнем и создадим фактические тесты, нам нужно настроить несколько вещей, которые будут использоваться в наших тестах.

Мы начнем с создания модели Post и связанной с ней миграции. Выполните следующую команду artisan для создания модели Post.

Вышеупомянутая команда должна создать класс модели Post и связанную с ним миграцию базы данных.

Класс модели Post должен выглядеть так:

И файл миграции базы данных должен быть создан в database/migrations/YYYY_MM_DD_HHMMSS_create_posts_table.php.

Мы также хотим сохранить название поста. Давайте переработаем код файла миграции Post, чтобы он выглядел следующим образом.

Как вы можете видеть, мы добавили столбец $table->string('name'), чтобы сохранить заголовок сообщения. Затем вам просто нужно запустить команду migrate, чтобы фактически создать эту таблицу в базе данных.

Также заменим модель Post следующим содержимым.

Мы только что добавили метод accessor, который изменяет заголовок сообщения, и это именно то, что мы проверим в нашем тестовом примере. Это то, что касается модели Post.

Затем мы создадим файл контроллера в app/Http/Controllers/AccessorController.php. Он будет нужен, когда мы создадим функциональный тестовый сценарий на более позднем этапе.

В методе index мы извлекаем идентификатор сообщения из параметров запроса и пытаемся загрузить объект модели Post.

Давайте добавим связанный маршрут и в файл routes/web.php.

И теперь вы можете открыть http://your-laravel-site.com/accessor/index, чтобы узнать, работает ли он так, как ожидалось.

Модульное тестирование

В предыдущем разделе мы сделали первоначальную настройку, которая будет полезна нам в этом и последующих разделах. В этом разделе мы собираемся создать пример, демонстрирующий концепции модульного тестирования в Laravel.

Как всегда, Laravel предоставляет команду artisan, которая позволяет вам создать базовый шаблонный класс модульного теста.

Выполните следующую команду, чтобы создать класс AccessorTest. Важно отметить, что мы передаем ключевое слово --unit, которое создает модульный тестовый кейс, и он будет расположен в директории tests/Unit.

И это должно создать следующий класс в tests/Unit/AccessorTest.php.

Давайте заменим его каким-нибудь полезным кодом.

Как вы можете видеть, код точно такой же, как в ядре PHP. Мы только что импортировали зависимости от Laravel, которые позволяют нам использовать необходимые API. В методе testAccessorTest мы должны проверить правильность метода getNameAttribute модели Post.

Для этого мы вытащили пример поста из базы данных и подготовили ожидаемый результат в переменной $db_post_title. Затем мы загружаем один и тот же пост с помощью модели Eloquent, которая также выполняет метод getNameAttribute, чтобы подготовить заголовок сообщения. Наконец, мы используем метод assertEquals для сравнения обеих переменных.

Это что касается модульных тестов в Laravel.

Функциональное тестирование

В этом разделе мы создадим функциональный тестовый кейс, который проверяет функциональность контроллера, который мы создали ранее.

Выполните следующую команду, чтобы создать класс функционального теста AccessorTest. Поскольку мы не используем ключевое слово --unit, он будет рассматриваться как функциональный тестовый кейс и будет помещен в каталог tests/Feature.

Он создаст следующий класс в tests/Feature/AccessorTest.php.

Давайте заменим его на следующий код.

Опять же, код должен выглядеть знакомым для тех, у кого уже есть опыт функционального тестирования.

Во-первых, мы извлекаем пост из базы данных и готовим ожидаемый результат в переменной $db_post_title. После этого мы пытаемся имитировать GET запрос к /accessor/index?id=1 и захватить ответ этого запроса в переменную $response.

Затем мы попытались сопоставить код ответа в переменной $response с ожидаемым кодом ответа. В нашем случае это должно быть 200, так как мы должны получить действительный ответ на наш запрос GET. Кроме того, ответ должен содержать заголовок, который начинается с верхнего регистра, и это именно то, что мы пытаемся сопоставить, используя метод assertSeeText.

И это пример функционального теста. Давайте продолжим и запустим следующую команду в корне вашего приложения для запуска всех тестов.

Это должно запускать все тесты в вашем приложении. Вы должны увидеть стандартный вывод PHPUnit, который отображает статус тестов и утверждений в вашем приложении.

И на этом мы заканчиваем эту статью.

Заключение

Сегодня мы изучили детали тестирования в Laravel, который уже поддерживает PHPUnit в своем ядре. Статья началась с базового введения в модульное и функциональное тестирование, и по мере продвижения мы изучили особенности тестирования в контексте Laravel.

В ходе этого процесса мы создали несколько примеров, которые продемонстрировали, как можно создать модульные и функциональные тестовые кейсы с помощью команды artisan.

Если вы только начинаете работу с Laravel или хотите расширить свои знания, создать сайт или приложение, у нас есть множество вещей, которые вы можете изучать на Envato Market.

Не стесняйтесь выражать свои мысли, используя приведенный ниже канал!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.