mashletov
@mashletov
Math.random()

Несколько простых вопросов по тестированию. Кто поможет?

Сел писать свой первый тест (хлоп-хлоп). Помогите разобраться на cферическом примере.
Допустим, есть у меня сайт — таблица пользователей, форма создания/редактирования и просмотр.
Сущности: resource-контроллер UserController, модель User, вьюхи index/create/edit/show.
Все это готово и работает.

То есть, по идее, мне надо убедиться, что:
  • открывается главная страница
  • пользователи добавляются
  • редактируются
  • просматриваются

Я создал UserTest в папке tests, добавил первую проверку testIndex(), и у меня возникла сразу куча вопросов:
  1. Все эти пункты можно выполнить с помощью $this->visit('/users') / see / dontSee / press.
    Это, я так понимаю, функциональное тестирование. Достаточно ли его будет в этой ситуации?
  2. index еще можно протестировать создав new UserController и вызвав метод index с разными фильтрами (Request) и проверив на ошибки. Тоже самое с моделью, можно сделать: попробовать save с разными параметрами, вместо заполнения формы.Это уже будет Юнит-тест? Нужно ли это если есть п.1 или избыточно?
  3. Все тесты: и юнит, и функциональные могут находиться в одном файле UserTest?
    Или надо их как-то разделять и по запускать по их типу? Надо ли было делить на что-то типа UserControllerTest, UserModelTest, UserFuncTest?
  4. Если я с помощью visit добавляю нового пользователя - как откатить изменения или удалить?
  • Вопрос задан
  • 2080 просмотров
Решения вопроса 2
zoonman
@zoonman
⋆⋆⋆⋆⋆
Итак, для начала следует разобраться в разнице между юнит-тестированием, интеграционным тестированием, функциональным тестированием и тестом на регрессии.

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

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

Функциональное тестирование проверяет соотвествие требованиям проекта. Например, при нажатии кнопки Удалить появляется окно подтверждение с текстом "Вы уверены", затем при нажатии кнопки "Да", запись удаляется из БД и пользователю выводится сообщение "Запись успешно удалена!".

Тест на регрессию - это повторная проверка работы конкретного участка кода. Как правило это участок кода, который не был покрыт тестами ранее.

PHPUnit изначально предназначен для юнит-тестирования, однако это не мешает вам использовать его для других видов тестирования. Есть даже коннекторы к WebDriver.

Тестирование контроллеров и моделей по отдельности - это юнит-тесты.
Тестирование связки контроллер-модель - это интеграционное тестирование.
Тестрование работы сайта целиком с помощью того же Selenium и т.п. - это функциональное тестирование.
Ответ написан
latteo
@latteo
Мне очень помогло вот это видео - https://www.youtube.com/watch?v=8u6_hctdhqI Хотя, стоит заметить, что до него я потратил десятки часов на чтение статей ;)

Хорошей практикой считается создавать suite под разные виды тестов: unit, интеграционные (функциональные), UI
Все они служат для повышение качества софта.

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

То что вы описали $this->visit('/users') / see / dontSee / press. ближе всего к UI тестам. Это проверка софта с точки зрения пользователя. Очень часто они написаны даже не разработчиком, а QA. Если для их выполнения настроить Selenium, то можно приятно удивить клиента :)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы