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

Full-stacked Ruby (on Rails) testingТЕСТИРОВАНИЕ RUBY (ON RAILS) ПРИЛОЖЕНИЙ: СТЕК, ПРАКТИКИ, ШАБЛОНЫ

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

О себе

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

Freelance www.TopTal.com

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

@p0deje https://github.com/p0deje [email protected]

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

toptal

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

1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения

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

В начале

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

В начале

class PublicControllerTest < ActionController::TestCase # Replace this with your real tests. test “the truth” do assert true endend

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

1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения

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

Front-end фреймворк

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

CucumberФункциональные тестыWebDriver“Живые” данные

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

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

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

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.” |

Сценарий посложней

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

Front-end фреймворк

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

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

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"

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

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"

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

1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения

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

Back-end фреймворк

Capybara+ Легка в использовании (i.e. разработчики пишут тесты)+ Интеграция с Rails- Красивое, но не объектное API

Watir-WebDriver+ Мощное DOM-like API+ Никаких XPath, CSS

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

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

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

1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения

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

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

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

1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения

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

DRY

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

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

DRY

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

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

DRY

3. Создавайте свои DSL

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

DRY

class JobListPage < Page

def jobs # ... end

def job?(title) # ... end

def job(title) # ... end end # JobListPage

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

1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения

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

CI и CD

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

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

Deploy

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

1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения

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

Параллельные тесты

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

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

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

Параллельные тесты

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

1. Одним процессом: 5 часов 10 минут2. Четыре процесса (Core Quad): 1 час 45 минут

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

1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения

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

Дополнения

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

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

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

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

@p0dejehttps://github.com/p0deje/CodeFest-2012

Вопросы?


Recommended