SlideShare a Scribd company logo
Full-stacked Ruby (on Rails) testing
ТЕСТИРОВАНИЕ RUBY (ON RAILS) ПРИЛОЖЕНИЙ:
СТЕК, ПРАКТИКИ, ШАБЛОНЫ
О себе

Алексей Родионов

   Freelance
   www.TopTal.com

 Watir-WebDriver, Page-Object, Ruby On
Rails, NativeDriver
 Mozilla WebQA

   @p0deje
   https://github.com/p0deje
   p0deje@gmail.com
toptal
1. В началe
2. Front-end фреймворк
3. Back-end фреймворк
4. page-object
5. DRY
6. CI и CD с помощью Jenkins
7. Параллельные тесты
8. Дополнения
В начале
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, практики, шаблоны
В начале


class PublicControllerTest < ActionController::TestCase
 # Replace this with your real tests.
 test “the truth” do
  assert true
 end
end
1. В началe
2. Front-end фреймворк
3. Back-end фреймворк
4. page-object
5. DRY
6. CI и CD с помощью Jenkins
7. Параллельные тесты
8. Дополнения
Front-end фреймворк

RSpec
 Юнит-тесты
 Rack-test
 Mock-объекты

Cucumber
 Функциональные тесты
 WebDriver
 “Живые” данные
Front-end фреймворк

Простой сценарий

Scenario: Applying to job
 Given a new job is approved
 And I am logged in as developer user
 When I click “Jobs” link
 And I open this job
 And I apply to job
 Then I should see successfully apply to job message
Front-end фреймворк

     Сценарий посложней
Scenario Outline: Job termination
 Given a new job is <job_status>
 And I am logged in as <role> user
 When I open “<tab>” tab
 And I open this job
 And I <action> job
 Then I should see <message>
 Examples:
  | role | tab    | job_status | action | message                          |
  | company | Jobs | created | remove | successful job deletion message              |
  | company | Jobs | approved | cancel | successful job deletion message             |
  | company | Jobs | active | end | notice message “The job was updated successfully.” |
  | admin | All Jobs | created | remove | successful job deletion message         |
  | admin | All Jobs | approved | cancel | successful job deletion message         |
  | admin | All Jobs | active | end | notice message “The job was updated successfully.” |
Front-end фреймворк


+ DRY
+ Живая документация
+ Сначала фича, потом разработка (недо-ATDD
+ Тесты от клиента?
Front-end фреймворк


Scenario: End active job
 Given a new job is active
 And I am logged in as company user
 When I open this job
 And I end job
 Then job status should be "On Notice"
Front-end фреймворк


Scenario: Ended job is active after page refresh
 Given a new job is active
 And I am logged in as company user
 When I open this job
 And I end job
 And I refresh page
 Then job status should be "On Notice"
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, практики, шаблоны
1. В началe
2. Front-end фреймворк
3. Back-end фреймворк
4. page-object
5. DRY
6. CI и CD с помощью Jenkins
7. Параллельные тесты
8. Дополнения
Back-end фреймворк




http://watirmelon.com/2011/12/03/a-tale-of-three-ruby-automated-testing-apis-re
Back-end фреймворк

Capybara
+ Легка в использовании (i.e. разработчики пишут тес
+ Интеграция с Rails
- Красивое, но не объектное API
Watir-WebDriver
+ Мощное DOM-like API
+ Никаких XPath, CSS
Back-end фреймворк
class HomePage < Page

 #
 # Clicks “Login” link.
 # @return [LoginPage]
 #
 def click_login_link
  menu_div.link(text: 'Login').click
  LoginPage.new
 end

 private

 def menu_div; browser.div(id: 'menu') end

end # HomePage
1. В началe
2. Front-end фреймворк
3. Back-end фреймворк
4. page-object
5. DRY
6. CI и CD с помощью Jenkins
7. Параллельные тесты
8. Дополнения
page-object
class HomePage < Page

 # Elements
 link :login_link, id: „login_link‟

end # HomePage

> page = HomePage.new
 # Click link
> page.login_link
 # Is link present on page?
> page.login_link?
 # Wait until link is shown, then click
> page.login_link_element.when_present.click

https://github.com/cheezy/page-object
1. В началe
2. Front-end фреймворк
3. Back-end фреймворк
4. page-object
5. DRY
6. CI и CD с помощью Jenkins
7. Параллельные тесты
8. Дополнения
DRY



1. Дробите страницы на блоки и выносите
  их в отдельные модули
DRY



2. Класс страницы должен уметь менять
  набор своих методов в зависмости от
  контекста (polymorphous page objects)
DRY




3. Создавайте свои DSL
DRY
class JobListPage < Page

 def jobs
  # ...
 end

 def job?(title)
  # ...
 end

 def job(title)
  # ...
 end

end # JobListPage
1. В началe
2. Front-end фреймворк
3. Back-end фреймворк
4. page-object
5. DRY
6. CI и CD с помощью Jenkins
7. Параллельные тесты
8. Дополнения
CI и CD

      Specs (Юнит-тесты)




Features (Функциональные тесты)




            Deploy
1. В началe
2. Front-end фреймворк
3. Back-end фреймворк
4. page-object
5. DRY
6. CI и CD с помощью Jenkins
7. Параллельные тесты
8. Дополнения
Параллельные тесты


Selenium Grid 2
Для запуска/управления браузером

parallel_tests
Для распределения процессов, фич и БД
Параллельные тесты


Около 700 сценариев

1. Одним процессом: 5 часов 10 минут
2. Четыре процесса (Core Quad): 1 час 45 минут
1. В началe
2. Front-end фреймворк
3. Back-end фреймворк
4. page-object
5. DRY
6. CI и CD с помощью Jenkins
7. Параллельные тесты
8. Дополнения
Дополнения


1. Адекватное тестирование емейлов
   https://github.com/p0deje/action_mailer_cache_delive

2. Автоматическая валидация страниц на соответстви
   стандартам W3C

3. Хелперы, конфигурации и пр.
   https://github.com/p0deje/CodeFest-2012
Вопросы?
                 @p0deje
https://github.com/p0deje/CodeFest-2012
Ad

Recommended

Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
lshevtsov
 
Автоматизируем тестирование UI с Ruby, Cucumber и Selenium
Автоматизируем тестирование UI с Ruby, Cucumber и Selenium
SQALab
 
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Andrey Rebrov
 
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"
Fwdays
 
Selenium 2.0: обзор новых возможностей
Selenium 2.0: обзор новых возможностей
Paul Stashevsky
 
"Web Vitals monitoring & optimizations", Erik Himiranov
"Web Vitals monitoring & optimizations", Erik Himiranov
Fwdays
 
Сергей Мелашич "Настройка SEO для одностраничных web-приложений на Angular"
Сергей Мелашич "Настройка SEO для одностраничных web-приложений на Angular"
Fwdays
 
Полуавтоматизация third-party API
Полуавтоматизация third-party API
SQALab
 
Codeception Introduction
Codeception Introduction
automated-testing.info
 
Оценка качества автотестов
Оценка качества автотестов
SQALab
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
CodeFest
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
Selenium, а давай подождем?
Selenium, а давай подождем?
SQALab
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Зачем нужен EmberJS, если мне хвататет jQuery
Зачем нужен EmberJS, если мне хвататет jQuery
Sergey Bolshchikov
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST API
Pavel Asanov
 
Speeding up UI tests, profiling of UI tests
Speeding up UI tests, profiling of UI tests
Anton Stepanenko
 
Page object with selenide
Page object with selenide
COMAQA.BY
 
Причины и способы имитации back-end'а
Причины и способы имитации back-end'а
Oksana Avchinnikova
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Fwdays
 
Как улучшить тесты на Selenium с помощью "визуального тестирования"?
Как улучшить тесты на Selenium с помощью "визуального тестирования"?
Oksana Avchinnikova
 
Инструменты и лайфхаки тестирования REST API
Инструменты и лайфхаки тестирования REST API
SQALab
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
CodeFest
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
WrikeTechClub
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
SQALab
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
SQALab
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practices
Aliaksandr Ikhelis
 

More Related Content

What's hot (20)

Codeception Introduction
Codeception Introduction
automated-testing.info
 
Оценка качества автотестов
Оценка качества автотестов
SQALab
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
CodeFest
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
Selenium, а давай подождем?
Selenium, а давай подождем?
SQALab
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Зачем нужен EmberJS, если мне хвататет jQuery
Зачем нужен EmberJS, если мне хвататет jQuery
Sergey Bolshchikov
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST API
Pavel Asanov
 
Speeding up UI tests, profiling of UI tests
Speeding up UI tests, profiling of UI tests
Anton Stepanenko
 
Page object with selenide
Page object with selenide
COMAQA.BY
 
Причины и способы имитации back-end'а
Причины и способы имитации back-end'а
Oksana Avchinnikova
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Fwdays
 
Как улучшить тесты на Selenium с помощью "визуального тестирования"?
Как улучшить тесты на Selenium с помощью "визуального тестирования"?
Oksana Avchinnikova
 
Инструменты и лайфхаки тестирования REST API
Инструменты и лайфхаки тестирования REST API
SQALab
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
CodeFest
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
WrikeTechClub
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
SQALab
 
Оценка качества автотестов
Оценка качества автотестов
SQALab
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
CodeFest
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
Selenium, а давай подождем?
Selenium, а давай подождем?
SQALab
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Зачем нужен EmberJS, если мне хвататет jQuery
Зачем нужен EmberJS, если мне хвататет jQuery
Sergey Bolshchikov
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST API
Pavel Asanov
 
Speeding up UI tests, profiling of UI tests
Speeding up UI tests, profiling of UI tests
Anton Stepanenko
 
Page object with selenide
Page object with selenide
COMAQA.BY
 
Причины и способы имитации back-end'а
Причины и способы имитации back-end'а
Oksana Avchinnikova
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Fwdays
 
Как улучшить тесты на Selenium с помощью "визуального тестирования"?
Как улучшить тесты на Selenium с помощью "визуального тестирования"?
Oksana Avchinnikova
 
Инструменты и лайфхаки тестирования REST API
Инструменты и лайфхаки тестирования REST API
SQALab
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
CodeFest
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
WrikeTechClub
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
SQALab
 

Similar to CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, практики, шаблоны (20)

Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
SQALab
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practices
Aliaksandr Ikhelis
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для Caché
InterSystems CEE
 
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard Lebedyuk
InterSystems
 
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
MoscowJS
 
Разработка веб-сервисов осень 2013 лекция 8
Разработка веб-сервисов осень 2013 лекция 8
Technopark
 
Little Service in 2h
Little Service in 2h
Alexei Yuzhakov
 
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Provectus
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
Krivoy Rog IT Community
 
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
jazzteam
 
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
solit
 
Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5
Dmitriy Krukov
 
Опыт реализации и поддержки больших проектов: координация команд, координация...
Опыт реализации и поддержки больших проектов: координация команд, координация...
DALEE digital agency
 
Путь к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификаций
Vagif Abilov
 
Эволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru Group
Эволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru Group
tfmailru
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработки
IT-Доминанта
 
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
CodeFest
 
терминология vol.2
терминология vol.2
SBTech
 
Тестирование высоконагруженных облачных веб-сервисов в Amazon - подводные кам...
Тестирование высоконагруженных облачных веб-сервисов в Amazon - подводные кам...
SQALab
 
Full Stack разработка на JavaScript
Full Stack разработка на JavaScript
Олег Шерыхалин
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
SQALab
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practices
Aliaksandr Ikhelis
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для Caché
InterSystems CEE
 
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard Lebedyuk
InterSystems
 
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
MoscowJS
 
Разработка веб-сервисов осень 2013 лекция 8
Разработка веб-сервисов осень 2013 лекция 8
Technopark
 
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Provectus
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
Krivoy Rog IT Community
 
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
jazzteam
 
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
solit
 
Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5
Dmitriy Krukov
 
Опыт реализации и поддержки больших проектов: координация команд, координация...
Опыт реализации и поддержки больших проектов: координация команд, координация...
DALEE digital agency
 
Путь к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификаций
Vagif Abilov
 
Эволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru Group
Эволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru Group
tfmailru
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработки
IT-Доминанта
 
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
CodeFest
 
терминология vol.2
терминология vol.2
SBTech
 
Тестирование высоконагруженных облачных веб-сервисов в Amazon - подводные кам...
Тестирование высоконагруженных облачных веб-сервисов в Amazon - подводные кам...
SQALab
 
Ad

More from CodeFest (20)

Alexander Graebe
Alexander Graebe
CodeFest
 
Никита Прокопов
Никита Прокопов
CodeFest
 
Денис Баталов
Денис Баталов
CodeFest
 
Елена Гальцина
Елена Гальцина
CodeFest
 
Александр Калашников
Александр Калашников
CodeFest
 
Ирина Иванова
Ирина Иванова
CodeFest
 
Marko Berković
Marko Berković
CodeFest
 
Денис Кортунов
Денис Кортунов
CodeFest
 
Александр Зимин
Александр Зимин
CodeFest
 
Сергей Крапивенский
Сергей Крапивенский
CodeFest
 
Сергей Игнатов
Сергей Игнатов
CodeFest
 
Николай Крапивный
Николай Крапивный
CodeFest
 
Alexander Graebe
Alexander Graebe
CodeFest
 
Вадим Смирнов
Вадим Смирнов
CodeFest
 
Константин Осипов
Константин Осипов
CodeFest
 
Raffaele Rialdi
Raffaele Rialdi
CodeFest
 
Максим Пугачев
Максим Пугачев
CodeFest
 
Rene Groeschke
Rene Groeschke
CodeFest
 
Иван Бондаренко
Иван Бондаренко
CodeFest
 
Mete Atamel
Mete Atamel
CodeFest
 
Alexander Graebe
Alexander Graebe
CodeFest
 
Никита Прокопов
Никита Прокопов
CodeFest
 
Денис Баталов
Денис Баталов
CodeFest
 
Елена Гальцина
Елена Гальцина
CodeFest
 
Александр Калашников
Александр Калашников
CodeFest
 
Ирина Иванова
Ирина Иванова
CodeFest
 
Marko Berković
Marko Berković
CodeFest
 
Денис Кортунов
Денис Кортунов
CodeFest
 
Александр Зимин
Александр Зимин
CodeFest
 
Сергей Крапивенский
Сергей Крапивенский
CodeFest
 
Сергей Игнатов
Сергей Игнатов
CodeFest
 
Николай Крапивный
Николай Крапивный
CodeFest
 
Alexander Graebe
Alexander Graebe
CodeFest
 
Вадим Смирнов
Вадим Смирнов
CodeFest
 
Константин Осипов
Константин Осипов
CodeFest
 
Raffaele Rialdi
Raffaele Rialdi
CodeFest
 
Максим Пугачев
Максим Пугачев
CodeFest
 
Rene Groeschke
Rene Groeschke
CodeFest
 
Иван Бондаренко
Иван Бондаренко
CodeFest
 
Mete Atamel
Mete Atamel
CodeFest
 
Ad

CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, практики, шаблоны

  • 1. Full-stacked Ruby (on Rails) testing ТЕСТИРОВАНИЕ RUBY (ON RAILS) ПРИЛОЖЕНИЙ: СТЕК, ПРАКТИКИ, ШАБЛОНЫ
  • 2. О себе Алексей Родионов  Freelance  www.TopTal.com  Watir-WebDriver, Page-Object, Ruby On Rails, NativeDriver  Mozilla WebQA  @p0deje  https://github.com/p0deje  [email protected]
  • 4. 1. В началe 2. Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 7. В начале class PublicControllerTest < ActionController::TestCase # Replace this with your real tests. test “the truth” do assert true end end
  • 8. 1. В началe 2. Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 9. Front-end фреймворк RSpec Юнит-тесты Rack-test Mock-объекты Cucumber Функциональные тесты WebDriver “Живые” данные
  • 10. Front-end фреймворк Простой сценарий Scenario: Applying to job Given a new job is approved And I am logged in as developer user When I click “Jobs” link And I open this job And I apply to job Then I should see successfully apply to job message
  • 11. Front-end фреймворк Сценарий посложней Scenario Outline: Job termination Given a new job is <job_status> And I am logged in as <role> user When I open “<tab>” tab And I open this job And I <action> job Then I should see <message> Examples: | role | tab | job_status | action | message | | company | Jobs | created | remove | successful job deletion message | | company | Jobs | approved | cancel | successful job deletion message | | company | Jobs | active | end | notice message “The job was updated successfully.” | | admin | All Jobs | created | remove | successful job deletion message | | admin | All Jobs | approved | cancel | successful job deletion message | | admin | All Jobs | active | end | notice message “The job was updated successfully.” |
  • 12. Front-end фреймворк + DRY + Живая документация + Сначала фича, потом разработка (недо-ATDD + Тесты от клиента?
  • 13. Front-end фреймворк Scenario: End active job Given a new job is active And I am logged in as company user When I open this job And I end job Then job status should be "On Notice"
  • 14. Front-end фреймворк Scenario: Ended job is active after page refresh Given a new job is active And I am logged in as company user When I open this job And I end job And I refresh page Then job status should be "On Notice"
  • 16. 1. В началe 2. Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 18. Back-end фреймворк Capybara + Легка в использовании (i.e. разработчики пишут тес + Интеграция с Rails - Красивое, но не объектное API Watir-WebDriver + Мощное DOM-like API + Никаких XPath, CSS
  • 19. Back-end фреймворк class HomePage < Page # # Clicks “Login” link. # @return [LoginPage] # def click_login_link menu_div.link(text: 'Login').click LoginPage.new end private def menu_div; browser.div(id: 'menu') end end # HomePage
  • 20. 1. В началe 2. Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 21. page-object class HomePage < Page # Elements link :login_link, id: „login_link‟ end # HomePage > page = HomePage.new # Click link > page.login_link # Is link present on page? > page.login_link? # Wait until link is shown, then click > page.login_link_element.when_present.click https://github.com/cheezy/page-object
  • 22. 1. В началe 2. Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 23. DRY 1. Дробите страницы на блоки и выносите их в отдельные модули
  • 24. DRY 2. Класс страницы должен уметь менять набор своих методов в зависмости от контекста (polymorphous page objects)
  • 26. DRY class JobListPage < Page def jobs # ... end def job?(title) # ... end def job(title) # ... end end # JobListPage
  • 27. 1. В началe 2. Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 28. CI и CD Specs (Юнит-тесты) Features (Функциональные тесты) Deploy
  • 29. 1. В началe 2. Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 30. Параллельные тесты Selenium Grid 2 Для запуска/управления браузером parallel_tests Для распределения процессов, фич и БД
  • 31. Параллельные тесты Около 700 сценариев 1. Одним процессом: 5 часов 10 минут 2. Четыре процесса (Core Quad): 1 час 45 минут
  • 32. 1. В началe 2. Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 33. Дополнения 1. Адекватное тестирование емейлов https://github.com/p0deje/action_mailer_cache_delive 2. Автоматическая валидация страниц на соответстви стандартам W3C 3. Хелперы, конфигурации и пр. https://github.com/p0deje/CodeFest-2012
  • 34. Вопросы? @p0deje https://github.com/p0deje/CodeFest-2012