PHP Application E2E with Capybara

Preview:

Citation preview

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

What is Capybara?

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

Capybara is …

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

• Ruby 製

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

• Driver を選べる

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

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

Drivers

• RackTest

• Selenium

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

• Capybara-webkit

• Poltergeist

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

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

である必要がある

Capybara 構成イメージ

{ ドライバ }

Cucumber

RSpec

Test::Unit

MiniTest::Spec

RackTest

Selenium

Capybara-webkit

Poltergeist

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

Capybara

Capybara で今回試した構成

{ ドライバ }

Cucumber

RSpec

Test::Unit

MiniTest::Spec

RackTest

Selenium

Capybara-webkit

Poltergeist

Capybara

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

Capybara DSL

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

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

現状ある E2E の課題感

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

• XML ツライ

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

• 非 Headless だと CI できない

• CircleCI や Jenkins で実行したい!

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

PHP Application E2E with Capybara

PHP だってできる…はず!

• Capybara (RSpec + Poltergeist)

• ActiveRecord と ActiveSupport も使う

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

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

• Fixture の投入はできる

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

試してみた

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

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

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'

DEMO PHP + Capybara + Poltergeist

DEMO

• シナリオ

• ログイン

• 検索

• 購入

• などなど…

DEMO

• 関連機能

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

• page.save_screenshot

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

• save_and_open_page

• JS コードを動かす

困ってる

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

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

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

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

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

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

困ってる

• Rails なら問題なし

• bundle exec rake spec

• RAILS_ENV=test

• WEBrick スゴイ

• PHP だと…

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

困ってる

【緩募】 アドバイス