Laravel + тестирование: как сэкономить время на валидации запросов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

При разработке API на Laravel часто возникает необходимость тестировать валидацию входящих данных. Один из способов — вручную писать тесты с различными вариантами входных параметров. Однако этот процесс может быть трудоемким и рутинным.

Чтобы упростить задачу, я разработал пакет laravel-request-testdata, который автоматически создает тестовые данные на основе правил валидации Laravel Request.

Ссылка на репозиторий - https://github.com/prog-time/laravel-request-testdata

Кому будет полезен этот пакет?

  • Разработчикам, которые хотят автоматизировать тестирование валидации запросов.

  • Тем, кто пишет много API-тестов и хочет минимизировать рутинные задачи.

  • Всем, кто хочет быстро получать корректные тестовые данные без необходимости вручную прописывать каждый вариант входных данных.

Как работает модуль?

Рассмотрим стандартный Laravel Request с простыми правилами:

class SimpleRequest extends FormRequest
{
  public function rules(): array
  {
    'name' => 'required|string',
    'email' => 'required|email',
  }
}

Теперь используем laravel-request-testdata для получения тестовых данных:

use App\Http\Requests\SimpleRequest;
use ProgTime\RequestTestData\RequestDataGenerator;

$request = new SimpleRequest();
$testData = RequestDataGenerator::generate($request);

Выходные данные могут выглядеть так:

[
  'name' => 'May Walker',
  'email' => 'ola.lagua@example.com',
]

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

При таком подходе вам нужно меньше следить за актуальностью тестов при редактирование правил валидации + это избавляет вас от необходимости вручную прописывать тестовые данные.

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

Разные форматы правил валидации

Данный модуль может обрабатывать правила валидации в разном формате.

Правила в формате массива

Вы можете описать правила в виде строки, как это было сделано в предыдущих примерах, а можете передать массив со списком параметром:

[
  'name' => ['required', 'string', 'min:3', 'max:50'],
  'age' => ['nullable', 'integer', 'min:18'],
  'password' => ['required', 'string', 'min:8'],
]

Использование сложных условий

По мимо типичных правил валидации, модуль также понимает такие правила, как: in, exists, unique и так далее.

[
  'status' => 'required|string|in:pending,approved,rejected',
  'category_id' => 'required|exists:categories,id',
  'email' => 'required|email|unique:users,email',
]

Использование класса Rule для описания правил

В некоторых Request классах правила валидации описываются в формате Rule конструкций. Это может быть Rule::unique для проверки на уникальность или Rule::in для проверки на соответствие конкретным значениям.

[
    'email' => ['required', 'email', Rule::unique('users')],
    'role' => ['required', Rule::in(['admin', 'user', 'moderator'])],
]

Генерация тестовых файлов для проверки валидации

Что касается валидации загружаемых файлов, то тут всё немного сложнее. На данный момент мой модуль может сгенерировать файлы таких типов, как: yml, xml, svg, sql, png, log, json, jpg, html, gif и csv.

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

Но для данной проблемы есть обходной вариант, который мы рассмотрим ниже.

Указание своих тестовых данных

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

Для этого необходимо в Request классе создать метод requestTestData(). Данный метод должен возвращать параметры запроса с заполненными тестовыми данными.

public function requestTestData(): array
{
    $faker = \Faker\Factory::create();
    return [
        'email' => $faker->email(),
        'age' => 25,
    ];
}

Через метод requestTestData() вы также можете передавать тестовые файлы в форматах, которые на данный момент не поддерживаются моим модулем.

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

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

Я надеюсь вам понравилось моё решение. Я буду очень благодарен если вы поддержите данный модуль звёздочкой на GitHub и напишите свой комментарий под данным постом.

Спасибо за то что дочитали данный пост до конца!

Источник: https://habr.com/ru/articles/887244/


Интересные статьи

Интересные статьи

RuStore и российский разработчик системного и инфраструктурного программного обеспечения «НТЦ ИТ РОСА» подписали соглашение о сотрудничестве. Пользователи ОС «РОСА Мобайл» получат доступ к каталогу пр...
Итак после первых плагинов для ВордПресс и джумла пришла пора сделать что-то похожее в Битрикс.Наш путь познания разных движков для сайтов проходит под идеей принести новый функционал, а именно принят...
Представьте себе вот такую картину: вы сидите дома, и вокруг вас мирно мурлыкают котики. Но вдруг, что-то пошло не по плану: один начал ловить лазерный указатель, другой карабкается на шторы, третий —...
Управление большим числом изменяемых шаблонов бизнес-процессов — непростая задача. А необходимость поддержки актуальных версий шаблонов на нескольких копиях проекта добавляет еще больше сложностей. Де...
Часто от программистов PHP можно услышать: «О нет! Только не „Битрикс“!». Многие специалисты не хотят связываться фреймворком, считают его некрасивым и неудобным. Однако вакансий ...