% OSS普及協議会Ruby勉強会3 % Tokushima.rb % 2015-09-11
このスライドは公開されています。
このスライドのリポジトリはhttps://github.com/tokushimarb/20150911-e2e-test-slideにあります。 また、本講座で開発する E2E テストは、https://github.com/tokushimarb/20150911-e2e-testにあります。
間違いなどを見つけた場合は
- メールで連絡
- Issueで報告
- Pull Requestで修正案を提出
などしていただけるとありがたいです (※下に行くほど嬉しいです)
- 氏名: [中野英雄](https://github.com/sunny4381)
- 勤務先: [株式会社ウェブチップス](http://www.web-tips.co.jp/)
- 本講座でのE2Eテスト
- 環境構築
- E2E テストプロジェクトの作成
- E2E テスト書いてみる
- 応用問題
- 質疑応答
E2E とは「End-to-End」の略で、E2Eテストとは、システム全体が正しく動作することを確認するテストのこと。
参考:
- [e2e - TDDの導入とエンドツーエンドテスト自動化の実践まとめ - Qiita](http://qiita.com/bouzuao/items/8e9493d1cb7781b08f2f)
- [Run SAP】Run SAP方法論によく出てくる E2E(End-to-End)って何? - SAP技術ブログ](http://solution.realtech.jp/blog/2011/04/run-sap.html)
- [エンドツーエンド原理 - Wikipedia](https://ja.wikipedia.org/wiki/エンドツーエンド原理)
次のツールを使います。
- [Selenium](http://www.seleniumhq.org): Web ブラウザーをプログラムから操作できるサービス
- [Capybara](https://github.com/jnicklas/capybara): Web アプリケーション テストフレームワーク
テストするアプリケーション:
- [20150821-oss-twcopy](https://github.com/kaosf/20150821-oss-twcopy): 第2回で開発した Web アプリケーションをテスト
- [Selenium](http://www.seleniumhq.org)は、Windows/Mac Host 側で動作させます。
- [20150821-oss-twcopy](https://github.com/kaosf/20150821-oss-twcopy) は、Vagrant 側で動作させます。
- E2E テストも、Vagrant 側で動作させます。
- E2E テストは、Windows/Mac Host 側で動作している Selenium と通信し、Selenium は 20150821-oss-twcopy にアクセスします。
- Java を Host にインストール(Selenium の動作に必要です)
- Selenium と Firefox(か Google Chrome)をインストール
- Selenium を起動
Selenium の動作に Java が必要です。 Java がインストールされていない人は、
Java をhttps://java.com/ja/download/からダウンロードしてインストールします。
apt-get
(Debian/Ubuntu)か yum
(CentOS/RHEL)か dnf
(Fedora) でインストールします。
http://www.seleniumhq.org/download/ から、selenium-server-standalone-2.47.1.jar
をダウンロード。
- Firefox をインストールしている人: 次に進んでください。
- Google Chrome をインストールしている人: Google Chrome Driver が必要です。 http://chromedriver.storage.googleapis.com/index.html?path=2.16/ からダウンロードします。
- どちらもインストールしていない人、Firefox をインストールしましょう。 https://www.mozilla.org/ja/firefox/new/ からダウンロードしてインストールします。
コマンドプロンプトやシェルから次のコマンドを実行します。
java -jar selenium-server-standalone-2.47.1.jar
Windows の人:
java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone-2.47.1.jar
Mac/Linux の人:
java -Dwebdriver.chrome.driver=chromedriver -jar selenium-server-standalone-2.47.1.jar
起動に成功すると、次のようなメッセージが表示されます。
09:37:11.066 INFO - Launching a standalone Selenium Server
09:37:11.124 INFO - Java: Oracle Corporation 25.25-b02
09:37:11.124 INFO - OS: Mac OS X 10.10.5 x86_64
09:37:11.151 INFO - v2.47.1, with Core v2.47.1. Built from revision 411b314
09:37:11.248 INFO - Driver provider org.openqa.selenium.ie.InternetExplorerDriver registration is skipped:
registration capabilities Capabilities [{ensureCleanSession=true, browserName=internet explorer, version=, platform=WINDOWS}] does not match the current platform MAC
09:37:11.249 INFO - Driver provider org.openqa.selenium.edge.EdgeDriver registration is skipped:
registration capabilities Capabilities [{browserName=MicrosoftEdge, version=, platform=WINDOWS}] does not match the current platform MAC
09:37:11.249 INFO - Driver class not found: com.opera.core.systems.OperaDriver
09:37:11.249 INFO - Driver provider com.opera.core.systems.OperaDriver is not registered
09:37:11.385 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
09:37:11.385 INFO - Selenium Server is up and running
終了するには Ctrl+C
を押します。
Vagrant Box を起動していない人は起動しましょう。
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ruby-vagrant'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: 20150821-oss-twcopy_default_1440809901768_54170
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
...
Vagrant Box に SSH で接続し、 第2回で開発した20150821-oss-twcopyを実行します。
$ cd $第2回で開発したアプリケーションディレクトリ
$ bin/rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 4.2.3 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-08-29 10:07:57] INFO WEBrick 1.3.1
[2015-08-29 10:07:57] INFO ruby 2.2.2 (2015-04-13) [x86_64-linux]
[2015-08-29 10:07:57] INFO WEBrick::HTTPServer#start: pid=6738 port=3000
第2回の講座を中途で挫折した人? 第2回で開発した20150821-oss-twcopyを GitHub から取得し、 起動します。
おそらく git がインストールされていないので、次のコマンドで git をインストールします。
$ sudo yum install git
Windows や Mac で、よくあるテキストエディタ風に操作できる nano
というテキストエディタがあります。
次のコマンドでインストールできます。
$ sudo yum install nano
以降の説明で vi
を使用している箇所は、nano
に読み替えてください。
GitHub から第2回で開発した20150821-oss-twcopyを取得します。
$ git clone https://github.com/kaosf/20150821-oss-twcopy.git
bundle install
を実行します。
$ cd 20150821-oss-twcopy
$ bundle install
Fetching gem metadata from https://rubygems.org/............
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies...
Using rake 10.4.2
Using i18n 0.7.0
...
データベースを作成後、Web アプリケーションを実行します。
$ rake db:migrate
$ bin/rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 4.2.3 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-08-29 10:07:57] INFO WEBrick 1.3.1
[2015-08-29 10:07:57] INFO ruby 2.2.2 (2015-04-13) [x86_64-linux]
[2015-08-29 10:07:57] INFO WEBrick::HTTPServer#start: pid=6738 port=3000
Gemfile を開き therubyracer
のコメントを解除し、bundle install
を実行してみてください。
vi Gemfile
# gem 'therubyracer', platforms: :ruby
↓
gem 'therubyracer', platforms: :ruby
$ bundle install
...
$ bin/rails s -b 0.0.0.0
起動した Web アプリケーションへ Host 側からアクセスしてみましょう。
http://localhost:3000/
正常に Web アプリケーションが表示されれば、E2Eテストの準備が完了です。
もう一枚コンソールを開いて Vagrant Box に SSH で接続してみます。 そして、次コマンドを実行し、テストプロジェクトディレクトリを作成してください。
$ mkdir e2e-test
$ cd e2e-test
$ bundle init
Writing new Gemfile to /home/vagrant/e2e-test/Gemfile
bundle init
を実行すると、雛形となる Gemfile
が作成されます。
Gemfile
に必要な gem を追加します。
$ vi Gemfile
# A sample Gemfile
source "https://rubygems.org"
# gem "rails"
gem 'rspec'
gem 'capybara'
gem 'selenium-webdriver'
ファイルを保存して bundle install
を実行します。
$ bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/..
Resolving dependencies...
Using mime-types 2.6.1
Using mini_portile 0.6.2
...
Installing websocket 1.2.2
Installing selenium-webdriver 2.47.1
Using bundler 1.10.5
Bundle complete! 3 Gemfile dependencies, 20 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
次のコマンドを実行し、rspec を実行できるようにします。
$ rspec --init
spec/spec_helper.rb
を編集し、Capybara と Selenium を組み込みます。
spec/spec_helper.rb
をテキストエディタで開き、次の行を先頭に追加してください。
require 'capybara'
require 'selenium-webdriver'
selenium_config = {}
selenium_config[:browser] = :remote
selenium_config[:url] = "http://10.0.2.2:4444/wd/hub"
Capybara.register_driver :remote_firefox do |app|
Capybara::Selenium::Driver.new(app, selenium_config)
end
Capybara.register_driver :remote_chrome do |app|
selenium_config[:desired_capabilities] = :chrome
Capybara::Selenium::Driver.new(app, selenium_config)
end
Capybara.app_host = "http://localhost:3000"
Capybara.default_max_wait_time = 5
# Firefox を使用する人は remote_filefox を、
# Google Chrome を使用する人は remote_chrome を有効にします
Capybara.default_driver = :remote_firefox
# Capybara.default_driver = :remote_chrome
spec/spec_helper.rb
の末尾あたりに次の行を追加します。
# Seed global randomization in this process using the `--seed` CLI option.
# Setting this allows you to use `--seed` to deterministically reproduce
# test failures related to randomization by passing the same `--seed` value
# as the one that triggered the failure.
Kernel.srand config.seed
=end
# 次の行を追加
config.include Capybara::DSL
end
ここまでの内容は、GitHub にあります。
$ git clone https://github.com/tokushimarb/20150911-e2e-test
$ cd 20150911-e2e-test
まずは、プログラムでサーバーにアクセスしてみましょう。
テキストエディタでテストファイル(ここでは first_e2e_spec.rb
)を作成します。
$ vi spec/first_e2e_spec.rb
テストファイルを次のように編集します。
require 'spec_helper.rb'
RSpec.describe "first e2e test", type: :feature do
it "sign in" do
visit "/"
end
end
rspec
コマンドを実行すると、テストが開始します。
$ rspec
.
Finished in 5.11 seconds (files took 0.29045 seconds to load)
1 example, 0 failures
環境や設定などが正しければ、 自動でブラウザが起動して、Web アプリケーションが表示され、自動でブラウザが終了します。
ここまでの内容は、GitHub にあります。
ダウンロードしていない人は、次のコマンドでダウンロードできます。
$ git clone https://github.com/tokushimarb/20150911-e2e-test
$ cd 20150911-e2e-test
ここまでの内容はブランチ "1st-test" にあるので、 次のコマンドで branch を切り替えます。
$ git checkout 1st-test
ユーザーを作ってみましょう。 さっきの続きに次のように書きます。
RSpec.describe "first e2e test", type: :feature do
it "sign in" do
visit "/"
# ここから下を追加する
click_link "Sign up"
fill_in "user_email", with: "[email protected]"
fill_in "user_password", with: "password"
fill_in "user_password_confirmation", with: "password"
fill_in "user_name", with: "test"
click_button "Sign up"
end
end
rspec
コマンドを実行してください。
$ rspec
.
Finished in 6.04 seconds (files took 0.28139 seconds to load)
1 example, 0 failures
今度も、自動でブラウザが起動して、Web アプリケーションが表示され、自動でブラウザが終了しました。 ※あまりにも早くて分からなかったですか?
-
ブラウザが自動で起動し、"/" にアクセスします。
visit "/"
-
画面上部の "Sign up" リンクをクリックし、ユーザー登録ページに遷移します。
click_link "Sign up"
-
ユーザー登録ページには、4 つの入力欄があります。 4 つの入力欄の上から順に、
with
で指定した文字列を入力します。fill_in "user_email", with: "[email protected]" fill_in "user_password", with: "password" fill_in "user_password_confirmation", with: "password" fill_in "user_name", with: "test"
-
画面下部の "Sign up" ボタンをクリックし、登録処理が実行します。
click_button "Sign up"
ここまでの内容は、GitHub にあります。
ダウンロードしていない人は、次のコマンドでダウンロードできます。
$ git clone https://github.com/tokushimarb/20150911-e2e-test
$ cd 20150911-e2e-test
ここまでの内容はブランチ "2nd-test" にあるので、 次のコマンドで branch を切り替えます。
$ git checkout 2nd-test
ユーザーを登録しただけで、登録に成功したかどうか検証していません。 ユーザー登録に成功したことを検証してみます。
検証処理を実装する前に、ユーザーの登録に成功すると、どんな画面が表示されるかみてみます。
ユーザー登録に成功すると、画面上部のメッセージボックスに、登録成功メッセージ "Welcome! You have signed up successfully." が表示されます。 このメッセージは、次のような HTML で表示されています。
<div class="alert fade in alert-success ">
<button class="close" data-dismiss="alert">×</button>
Welcome! You have signed up successfully.
</div>
画面左のサイドバーには、登録したユーザーの名前が表示されています。 この部分の HTML は次のようになっています。
<div class="well sidebar-nav">
<h3>Sidebar</h3>
<dl>
<dt>Your name</dt>
<dd>test</dd>
<dt>Your icon</dt>
<dd><img class="img-circle" width="128" height="128" src="/icons/original/missing.png" alt="Missing"></dd>
</dl>
<ul class="nav nav-list">
<li class="nav-header">Sidebar</li>
<li><a href="/path1">Link1</a></li>
<li><a href="/path2">Link2</a></li>
<li><a href="/path3">Link3</a></li>
</ul>
</div>
メッセージボックスに登録成功メッセージが、 サイドバーに登録したユーザー名が表示されていることを検証してみます。 次のコードを追加してください。
RSpec.describe "first e2e test", type: :feature do
it "sign in" do
visit "/"
click_link "Sign up"
fill_in "user_email", with: "[email protected]"
fill_in "user_password", with: "password"
fill_in "user_password_confirmation", with: "password"
fill_in "user_name", with: "test"
click_button "Sign up"
# ここから下を追加する
# メッセージボックスに、登録成功メッセージが表示されていることを検証する
within "div.alert-success" do
expect(page).to have_content("Welcome! You have signed up successfully.")
end
# サイドバーに、ユーザー名 "test" が表示されていることを検証する
within "div.sidebar-nav" do
expect(page).to have_content("test")
end
end
end
test
というユーザーが登録されているので、テストを再実行しても登録に失敗しますので、データベースを削除します。
Web アプリケーションを実行しているターミナルを表示し、キーボードから Ctrl+C
を入力し Web アプリケーションを停止します。
^C[2015-08-29 21:47:16] INFO going to shutdown ...
[2015-08-29 21:47:16] INFO WEBrick::HTTPServer#start done.
Exiting
rake db:drop
でデータベースを削除し、rake db:migrate
でデータベースを作成後、Web アプリケーションを実行します。
$ rake db:drop
$ rake db:migrate
$ bin/rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 4.2.3 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-08-29 21:48:34] INFO WEBrick 1.3.1
[2015-08-29 21:48:34] INFO ruby 2.2.2 (2015-04-13) [x86_64-linux]
[2015-08-29 21:48:34] INFO WEBrick::HTTPServer#start: pid=4693 port=3000
rspec
コマンドを実行してください。
$ rspec
.
Finished in 6.63 seconds (files took 0.26859 seconds to load)
1 example, 0 failures
0 failures
と表示されているので、テストに成功したことがわかります。
-
class
alert-success
を持つ<div>
タグ内に、"Welcome! You have signed up successfully." があることを検証します。within "div.alert-success" do expect(page).to have_content("Welcome! You have signed up successfully.") end
メッセージボックスに "Welcome! You have signed up successfully." が表示されていることを検証しています。
-
class
sidebar-nav
を持つ<div>
タグ内に、"test" があることを検証します。within "div.sidebar-nav" do expect(page).to have_content("test") end
サイドバーに登録したユーザー名が表示されていることを検証しています。
ここまでの内容は、GitHub にあります。
ダウンロードしていない人は、次のコマンドでダウンロードできます。
$ git clone https://github.com/tokushimarb/20150911-e2e-test
$ cd 20150911-e2e-test
ここまでの内容はブランチ "3rd-test" にあるので、 次のコマンドで branch を切り替えます。
$ git checkout 3rd-test
- ブラウザでアクセスし、どんな画面が表示されるかを確認。
- その際、どんなタグのどんなクラスを持つかを確認。
- ブラウザ操作を、プログラムとして作成し、表示されているタグを検証。
次のような E2E テストで作成してみてください。
- ユーザー登録の際、パスワードが 8 桁より短いとエラーが表示されます。 エラーになるかどうか検証してください。
- ツイートを投稿してみて、本当に投稿されたかどうか検証してみてください。
- もう一人別のユーザーを登録し、フォローして、本当にフォローされたかどうか検証してみてください。
- など。
-
Tokuhima.rb は、毎月、徳島マルシェの開催される最終日曜日の 10:00 〜 16:00 に、ねすとラボ でゆる〜く開催しています。
-
オープンソースカンファレンス徳島(OSC徳島)が、11月14日(土曜日)にとくぎんトモニプラザで開催されます。