SlideShare ist ein Scribd-Unternehmen logo
1 von 34
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

Weitere ähnliche Inhalte

Was ist angesagt?

Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
Albina Tiupa
 

Was ist angesagt? (20)

Codeception Introduction
Codeception IntroductionCodeception Introduction
Codeception Introduction
 
Оценка качества автотестов
Оценка качества автотестовОценка качества автотестов
Оценка качества автотестов
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
Selenium, а давай подождем?
Selenium, а давай подождем?Selenium, а давай подождем?
Selenium, а давай подождем?
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Зачем нужен EmberJS, если мне хвататет jQuery
Зачем нужен EmberJS, если мне хвататет jQueryЗачем нужен EmberJS, если мне хвататет jQuery
Зачем нужен EmberJS, если мне хвататет jQuery
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST APIАвтоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST API
 
Speeding up UI tests, profiling of UI tests
Speeding up UI tests, profiling of UI testsSpeeding up UI tests, profiling of UI tests
Speeding up UI tests, profiling of UI tests
 
Page object with selenide
Page object with selenidePage object with selenide
Page object with selenide
 
Причины и способы имитации back-end'а
Причины и способы имитации back-end'аПричины и способы имитации back-end'а
Причины и способы имитации back-end'а
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
 
Как улучшить тесты на Selenium с помощью "визуального тестирования"?
Как улучшить тесты на Selenium с помощью "визуального тестирования"?Как улучшить тесты на Selenium с помощью "визуального тестирования"?
Как улучшить тесты на Selenium с помощью "визуального тестирования"?
 
Инструменты и лайфхаки тестирования REST API
Инструменты и лайфхаки тестирования REST APIИнструменты и лайфхаки тестирования REST API
Инструменты и лайфхаки тестирования REST API
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
 
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
 
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Микросервисы для автоматизации тестирования - опыт "Одноклассников"Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
 

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

Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
Drupal code sprint для новичков
Drupal code sprint для новичковDrupal code sprint для новичков
Drupal code sprint для новичков
Ovadiah Myrgorod
 
Изоморфные React-приложения производительность и масштабирование / Денис Изма...
Изоморфные React-приложения производительность и масштабирование / Денис Изма...Изоморфные React-приложения производительность и масштабирование / Денис Изма...
Изоморфные React-приложения производительность и масштабирование / Денис Изма...
Ontico
 
CodeFest 2012. Корсаков С. — Cucumber. Некоторые советы по приготовлению
CodeFest 2012. Корсаков С. — Cucumber. Некоторые советы по приготовлениюCodeFest 2012. Корсаков С. — Cucumber. Некоторые советы по приготовлению
CodeFest 2012. Корсаков С. — Cucumber. Некоторые советы по приготовлению
CodeFest
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
 
Непрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
Непрерывная интеграция шаг к непрерывному деплою. Родионов ИгорьНепрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
Непрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
PVasili
 

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

Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in rails
 
Plugin for plugin, or extending android new build system
Plugin for plugin, or extending android new build systemPlugin for plugin, or extending android new build system
Plugin for plugin, or extending android new build system
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Drupal code sprint для новичков
Drupal code sprint для новичковDrupal code sprint для новичков
Drupal code sprint для новичков
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
 
Изоморфные React-приложения производительность и масштабирование / Денис Изма...
Изоморфные React-приложения производительность и масштабирование / Денис Изма...Изоморфные React-приложения производительность и масштабирование / Денис Изма...
Изоморфные React-приложения производительность и масштабирование / Денис Изма...
 
CodeFest 2012. Корсаков С. — Cucumber. Некоторые советы по приготовлению
CodeFest 2012. Корсаков С. — Cucumber. Некоторые советы по приготовлениюCodeFest 2012. Корсаков С. — Cucumber. Некоторые советы по приготовлению
CodeFest 2012. Корсаков С. — Cucumber. Некоторые советы по приготовлению
 
Изоморфные React-приложения: производительность и масштабирование
Изоморфные React-приложения: производительность и масштабированиеИзоморфные React-приложения: производительность и масштабирование
Изоморфные React-приложения: производительность и масштабирование
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
 
Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
 
Непрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
Непрерывная интеграция шаг к непрерывному деплою. Родионов ИгорьНепрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
Непрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
 
Изоморфные react-приложения
Изоморфные react-приложенияИзоморфные react-приложения
Изоморфные react-приложения
 

Mehr von CodeFest

Mehr von CodeFest (20)

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

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  p0deje@gmail.com
  • 4. 1. В началe 2. Front-end фреймворк 3. Back-end фреймворк 4. page-object 5. DRY 6. CI и CD с помощью Jenkins 7. Параллельные тесты 8. Дополнения
  • 6.
  • 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"
  • 15.
  • 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