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. Дополнения
В начале
В начале


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"
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

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

  • 1.
    Full-stacked Ruby (onRails) testing ТЕСТИРОВАНИЕ RUBY (ON RAILS) ПРИЛОЖЕНИЙ: СТЕК, ПРАКТИКИ, ШАБЛОНЫ
  • 2.
    О себе Алексей Родионов  Freelance  www.TopTal.com  Watir-WebDriver, Page-Object, Ruby On Rails, NativeDriver  Mozilla WebQA  @p0deje  https://github.com/p0deje  p0deje@gmail.com
  • 3.
  • 4.
    1. В началe 2.Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 5.
  • 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: Endactive 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: Endedjob 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. Дополнения
  • 17.
  • 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)
  • 25.
  • 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 Grid2 Для запуска/управления браузером 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