Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHP Application E2E with Capybara

2,525 views

Published on

社内勉強会で Capybara 勉強会を開催したときの資料です.
詳細はブログに書いています.

社内勉強会で "PHP Application E2E with Capybara" という話をした - kakakakakku blog
http://kakakakakku.hatenablog.com/entry/2016/01/09/142221

Published in: Technology
  • Be the first to comment

PHP Application E2E with Capybara

  1. 1. PHP Application E2E with Capybara 2016-01-08 社内勉強会 @kakakakakku
  2. 2. What is Capybara?
  3. 3. http://jnicklas.github.io/capybara/ https://github.com/jnicklas/capybara/
  4. 4. Capybara is … • E2E テストフレームワーク • Ruby 製 • Capybara DSL で自然言語のように書ける • Driver を選べる • Rails だとデファクトスタンダード? • Rails 専用ではなく汎用的に使える
  5. 5. Drivers • RackTest • Selenium • ブラウザ(xvfb を使うなら Headless にできる) • Capybara-webkit • Poltergeist • Headless で比較的安定していて人気がある
  6. 6. CI で E2E をテストするなら Headless である必要がある
  7. 7. Capybara 構成イメージ { ドライバ } Cucumber RSpec Test::Unit MiniTest::Spec RackTest Selenium Capybara-webkit Poltergeist { テストフレームワーク } Capybara
  8. 8. Capybara で今回試した構成 { ドライバ } Cucumber RSpec Test::Unit MiniTest::Spec RackTest Selenium Capybara-webkit Poltergeist Capybara { テストフレームワーク }
  9. 9. Capybara DSL
  10. 10. Capybara DSL Sample 1 # Navigating visit('/projects') # Clicking links and buttons click_link('Link Text') click_button('Save') # Interacting with forms fill_in('First Name', :with => 'John') choose('A Radio Button') check('A Checkbox')
  11. 11. Capybara DSL Sample 2 # Querying expect(page).to have_selector('table tr') expect(page).to have_selector(:xpath, '//table/tr') # Scripting page.execute_script("$('body').empty()") # Debugging save_and_open_page page.save_screenshot('screenshot.png')
  12. 12. 現状ある E2E の課題感
  13. 13. 課題感 • Selenium のメンテナンスが大変 • XML ツライ • 実行時間が長時間化している • 非 Headless だと CI できない • CircleCI や Jenkins で実行したい! • データ投入済の環境だとデータパターンが困難
  14. 14. PHP Application E2E with Capybara
  15. 15. PHP だってできる…はず!
  16. 16. • Capybara (RSpec + Poltergeist) • ActiveRecord と ActiveSupport も使う • テストコードを Ruby っぽくシンプルに書ける • factory_girl でテストごとに Fixture を投入する • Fixture の投入はできる • ただし運用面で困ってる点がある…(後述) 試してみた
  17. 17. ディレクトリ構造 app integrations ├── Gemfile ├── Gemfile.lock ├── database.yml └── spec ├── factories │ └── users.rb ├── login.rb ├── models │ └── user.rb ├── support │ └── macros.rb └── spec_helper.rb アプリケーションの ルートディレクトリ直下に `integrations` を用意した
  18. 18. Gemfile source 'https://rubygems.org' gem 'rspec' gem 'capybara' gem 'poltergeist' gem 'mysql2' gem 'activerecord' gem 'activesupport' gem 'factory_girl' gem 'pry' gem 'awesome_print' gem 'launchy'
  19. 19. DEMO PHP + Capybara + Poltergeist
  20. 20. DEMO • シナリオ • ログイン • 検索 • 購入 • などなど…
  21. 21. DEMO • 関連機能 • スクリーンキャプチャを撮る • page.save_screenshot • Headless だけどブラウザを開く • save_and_open_page • JS コードを動かす
  22. 22. 困ってる
  23. 23. • PHP (FuelPHP) だと難しいかも? • E2E 専用環境があっても運用できなそう • 複数の feature があるとデプロイどうするの? • feature によってスキーマも違う場合がある • factory_girl で Fixture を投入できるけど1環境 • factory_girl 使わないとパターンを再現できない 困ってる
  24. 24. • Rails なら問題なし • bundle exec rake spec • RAILS_ENV=test • WEBrick スゴイ • PHP だと… • Nginx + php-fpm の環境がないとダメ… 困ってる
  25. 25. 【緩募】 アドバイス

×