25
PHP Application E2E with Capybara 2016-01-08 社内勉強会 @kakakakakku

PHP Application E2E with Capybara

Embed Size (px)

Citation preview

Page 1: PHP Application E2E with Capybara

PHP Application E2E with Capybara2016-01-08 社内勉強会 @kakakakakku

Page 2: PHP Application E2E with Capybara

What is Capybara?

Page 3: PHP Application E2E with Capybara

http://jnicklas.github.io/capybara/ https://github.com/jnicklas/capybara/

Page 4: PHP Application E2E with Capybara

Capybara is …

• E2E テストフレームワーク

• Ruby 製

• Capybara DSL で自然言語のように書ける

• Driver を選べる

• Rails だとデファクトスタンダード?

• Rails 専用ではなく汎用的に使える

Page 5: PHP Application E2E with Capybara

Drivers

• RackTest

• Selenium

• ブラウザ(xvfb を使うなら Headless にできる)

• Capybara-webkit

• Poltergeist

• Headless で比較的安定していて人気がある

Page 6: PHP Application E2E with Capybara

CI で E2E をテストするなら Headless

である必要がある

Page 7: PHP Application E2E with Capybara

Capybara 構成イメージ

{ ドライバ }

Cucumber

RSpec

Test::Unit

MiniTest::Spec

RackTest

Selenium

Capybara-webkit

Poltergeist

{ テストフレームワーク }

Capybara

Page 8: PHP Application E2E with Capybara

Capybara で今回試した構成

{ ドライバ }

Cucumber

RSpec

Test::Unit

MiniTest::Spec

RackTest

Selenium

Capybara-webkit

Poltergeist

Capybara

{ テストフレームワーク }

Page 9: PHP Application E2E with Capybara

Capybara DSL

Page 10: PHP Application E2E with Capybara

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')

Page 11: PHP Application E2E with Capybara

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')

Page 12: PHP Application E2E with Capybara

現状ある E2E の課題感

Page 13: PHP Application E2E with Capybara

課題感• Selenium のメンテナンスが大変

• XML ツライ

• 実行時間が長時間化している

• 非 Headless だと CI できない

• CircleCI や Jenkins で実行したい!

• データ投入済の環境だとデータパターンが困難

Page 14: PHP Application E2E with Capybara

PHP Application E2E with Capybara

Page 15: PHP Application E2E with Capybara

PHP だってできる…はず!

Page 16: PHP Application E2E with Capybara

• Capybara (RSpec + Poltergeist)

• ActiveRecord と ActiveSupport も使う

• テストコードを Ruby っぽくシンプルに書ける

• factory_girl でテストごとに Fixture を投入する

• Fixture の投入はできる

• ただし運用面で困ってる点がある…(後述)

試してみた

Page 17: PHP Application E2E with Capybara

ディレクトリ構造app integrations ├── Gemfile ├── Gemfile.lock ├── database.yml └── spec ├── factories │ └── users.rb ├── login.rb ├── models │ └── user.rb ├── support │ └── macros.rb └── spec_helper.rb

アプリケーションの ルートディレクトリ直下に `integrations` を用意した

Page 18: PHP Application E2E with Capybara

Gemfilesource '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'

Page 19: PHP Application E2E with Capybara

DEMO PHP + Capybara + Poltergeist

Page 20: PHP Application E2E with Capybara

DEMO

• シナリオ

• ログイン

• 検索

• 購入

• などなど…

Page 21: PHP Application E2E with Capybara

DEMO

• 関連機能

• スクリーンキャプチャを撮る

• page.save_screenshot

• Headless だけどブラウザを開く

• save_and_open_page

• JS コードを動かす

Page 22: PHP Application E2E with Capybara

困ってる

Page 23: PHP Application E2E with Capybara

• PHP (FuelPHP) だと難しいかも?

• E2E 専用環境があっても運用できなそう

• 複数の feature があるとデプロイどうするの?

• feature によってスキーマも違う場合がある

• factory_girl で Fixture を投入できるけど1環境

• factory_girl 使わないとパターンを再現できない

困ってる

Page 24: PHP Application E2E with Capybara

• Rails なら問題なし

• bundle exec rake spec

• RAILS_ENV=test

• WEBrick スゴイ

• PHP だと…

• Nginx + php-fpm の環境がないとダメ…

困ってる

Page 25: PHP Application E2E with Capybara

【緩募】 アドバイス