Test automation based on Ruby stack

Boilerplate can be found at Gitlab

So, first things first, please clone the repository. It includes all required tools, you can start writing tests at once. But, if you’re greedy for details, read on.

Dockerfile

I was not a fan of Docker technologies. I guess it’s because all my development was around Ruby language (standard MRI). And I had all versions installed on my computer. But, then my friend asked me to help him with some PHP. After 20 minutes of trying to install the correct version of the language and all libraries, I took Docker and configured everything there. From that point all my projects support Docker.

It’s all for Docker. Ping me if you know how to improve.

Ruby stack. Gems.

It’s time to speak about our ruby business. Here the list of libraries and their assignments:

  1. capybara — what we call «sugar» or DSL over different drivers, like Selenium. Without capybara you can’t write something like visit ‘moduscreate.com’. But, if you wish you can write your own layer; it should be an interesting adventure.
  2. cucumber — all things around BDD, like Gherkin language support e.t.c.
  3. webdrivers — webdrivers gem will download the last version of chrome/firefox/edge driver if a certain version was not defined. In my case it didn’t play well with Alpine. After this article definitely i will sit and find out what’s the problem.
  4. rspec — well known library for every ruby developer. Added to here in order to have these nice readable expectations.
  5. byebug — it’s a debugger. Developing new tests I prefer to run browser in normal mode, stop tests when a certain page is opened and play with elements on the page.
  6. site_prism — library which provides easy integration with the Page Object pattern. Using site_prism makes your tests easy to change, and decouples logic of tests from page

All required configurations for these libraries are in the features/support directory.

Gitlab CI

Next stop is Gitlab CI. Well as i said this boilerplate is quite opinionated. Last 4 years I have landed all my projects on Gitlab. And they were first (compared to Github) with CI/CD system. Even now when we have Github Actions I think Gitlab CI has far more features. But, I understand maybe it’s because Github Actions still is young.

So, as in case with Dockerfile I will explain all lines. Let’s dive in .gitlab-ci.yml.

How can I use Gitlab CI, if I don’t even have a deploy process?  Or you have another repository which is not connected with e2e tests. Here two examples:

  1. If you don’t have a deployment process, you can configure the schedule for your e2e tests repository. For example every 2  hours.
  2. If you have a deployment process. It’s even cooler, you may trigger your e2e tests repository example (read more about multi-project pipelines):

Where are the tests?

So, all preparations are made. Now we can check out some examples in the features directory. There I test moduscreate.com to have some cool vacancies (we always have them). And sometimes there are test automations engineers vacancies.

How to use it?

Please check Readme at corresponding repository. Shortly speaking you can launch tests on Docker or on your host machine. Running tests locally you can view all actions visually in the browser, it helps to debug existing or create new tests.

Last words

I made this article because I use this boilerplate and wanted to share my thoughts. If you are a junior, you may find this template as a good starting point. You may hear “ruby is dead” i’ve been hearing this for the last 4-5 years. It’s not important which language you use, more important how good you are with it. Ok, I don’t know why I’m delaying you. Fork and try it out.

Структура клиентского кода в Rails приложениях

У меня есть идея о том как распределять js/coffee файлы в Rails приложениях, тех что не SPA. Правда пока не пробовал его в бою) но тем не менее мне, он кажется перспективным.

Основной посыл в том чтобы браузер загружал и использовал только те скрипты, которые используются в рамках одного action. Точнее даже так один action — один js файл.
Читать далее «Структура клиентского кода в Rails приложениях»

Алгоритм действий, гем Workflow

Гем Workflow (Процесс) добавляет в объект способность хранить очерёдность состояний и возможных действий.

Процесс имеет разные состояния (State). В единицу времени только одно состояние может быть активно. Состояния могут переходить (Transition) от одного к другому. Чтобы совершить переход, должно произойти какое-то событие (Event). При активации события, можно исполнить произволное дополнительное действие (Action). Другими словами каждое состояние содержит произволное количество событий, запуск события ведёт к другому состоянию, и возможному запуску какого-то действия связанного с этим событием. Кроме того можно отследить вход и выход из состояния, поймать ошибку при переходе.

Читать далее «Алгоритм действий, гем Workflow»

Использование FriendlyID и Rails 5

Простая инструкция для внедрения ЧПУ или любого рода слагов в проект на Ruby on Rails.

В примере будут использованы гемы FriendlyID и Babosa (для поддержки кириллицы).
Читать далее «Использование FriendlyID и Rails 5»

Декораторы в rails

Продолжая топик о презентерах.

У постов есть статус, в простом варианте true\false, если в шаблоне выводить просто @post.status, то ничего хорошего из этого не выйдет. Хочется например как-то так:

Логичное продолжение — перенос этой логики в helper.

Основным недостатком хелперов является “загрязнение” глобальной области видимости. Кстати, в данном конкретном случае с post, такой вариант возможно и выгоден, если все модели содержат поле статус, и должны выводить подобное сообщение.

Но с декораторами можно перенести логику шаблона в отдельный модуль (инкапсулировать). Rails по умолчанию не создаёт папки decorators, надо это сделать в папке app. А в папке decorators файл post_decorator.rb

Декоратор должен содержать конструктор в который передаётся объект который надо декорировать.
Читать далее «Декораторы в rails»

Презентер в rails

По мотивам Ruby on Rails — Presenters & decorators

Презентер

С прогрессом проекта шаблоны становятся сложнее, там появляется нетривиальная логика. И конечно же контроллеры тоже разрастаются. Существует такой паттерн проектирования приложений — presenter (презентер). Это модуль который знает о модели и шаблоне.

Пример простого контроллера и шаблона, до внедрения презентера.

Контроллер

Модель

Шаблон

Внедрение презентера простое в папку App — добавьте папку presenters/post , файл index_presenter.rb

Содержимое презентера предельно простое:

Обновлённый контроллер

Обновлённый шаблон

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

rubynotes

База

  • Базовые типы данных в ruby: Fixnum, Bignum, Float, Array, String, Hash.
  • В руби всё объекты, например число 1 — это объект класса Fixnum (проверка 1.class).
  • Каждый объект имеет уникальный object_id, например 1.object_id.
  • Каждый класс имеет набор методов, например 1.to_f. Существуют методы классы и методы объекта.
  • Применяя * к строке, например «John» * 5 , вы на строке «John» используете метод *, с аргументом 5. Иначе говоря «John» * 5 == «John».*(5)
  • Если вызвать у объекта несуществующий метод, то получим ошибку #, а вот у строки такой метод есть 40.to_s.reverse
  • Скобки при вызове метода необязательны.
  • Метод gsub проходит по всей строке и заменяет одну подстроку, на другую — ‘I\’m a senior developer’.gsub(‘senior’, ‘junior’).
  • Есть ряд методов которые вызываются без объекта, например puts, но объект просто опущен, так как используется корневой объект Kernel.
  • Методы с ! на конце меняют оргинальный объект, а методы с ? на конце — это так называемые предикаты, которые по соглашению возвращают булевое значение.
  • Хэши posts = {:title => ‘Заголовок’, ‘content’ => ‘Содержание статьи’ } эквивалент posts = {title: ‘Заголовок’, ‘content’ => ‘Содержание статьи’}. Краткая запись title: ‘Заголовок’, доступна только тогда когда ключом является символ , доступ к элементам хэша

Читать далее «rubynotes»

Docker геттинг стартед

Немного Docker в вашу копилку. На работе и в быту начал немного применять этот инструмент, и хочется в записках разобраться.

Установка довольно проста, только как оказалось 32-х разрядные системы не поддерживаются. Для Mac или Windows необходимо просто скачать и установить Docker Toolbox. После установки проверьте в консоли

Читать далее «Docker геттинг стартед»

Links to like

LinksToLike — это один из проектов над которыми я недавно работал. В качестве хобби-проектов или коммерческих, но не попадающих в мой основной профессиональный профиль. О паре проектов я хочу рассказать.
Читать далее «Links to like»

SSRS — Stupid simple rails server

В этом рассказе я собираюсь записать себе на память (а может и кому-то пригодится) процесс установки и деплоя rails приложения на сервер. Или даже не так, рассказ о том как настроить сервер за 10 минут пренебрегая всеми правилами безопасности. На самом деле если хочется быстрее сервер и меньше возни, то удобнее конечно взять Heroku. Или говорят Docker тоже в этом плане удобен. Так что будем считать что этот текст вот совсем для новичков.

В качестве сервера Debian 8 64 bit, приложение на Rails 5 и база данных конечно Postgres.
Читать далее «SSRS — Stupid simple rails server»