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 [email protected]
toptal
1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения
В начале
В начале
class PublicControllerTest < ActionController::TestCase # Replace this with your real tests. test “the truth” do assert true endend
1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения
Front-end фреймворк
RSpecЮнит-тестыRack-testMock-объекты
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. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения
Back-end фреймворк
http://watirmelon.com/2011/12/03/a-tale-of-three-ruby-automated-testing-apis-redux/
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. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты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. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты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. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения
CI и CD
Specs (Юнит-тесты)
Features (Функциональные тесты)
Deploy
1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения
Параллельные тесты
Selenium Grid 2Для запуска/управления браузером
parallel_testsДля распределения процессов, фич и БД
Параллельные тесты
Около 700 сценариев
1. Одним процессом: 5 часов 10 минут2. Четыре процесса (Core Quad): 1 час 45 минут
1. В началe2. Front-end фреймворк3. Back-end фреймворк4. page-object5. DRY6. CI и CD с помощью Jenkins7. Параллельные тесты8. Дополнения
Дополнения
1. Адекватное тестирование емейловhttps://github.com/p0deje/action_mailer_cache_delivery
2. Автоматическая валидация страниц на соответствиестандартам W3C
3. Хелперы, конфигурации и пр.https://github.com/p0deje/CodeFest-2012