どのフェーズの企業でも使える!!seleniumとtest-unitでwebの自動化テスト。


はじめに

どのフェーズの企業でも簡単にステージングや本番で試せるテストを
書けるseleniumをご紹介します!!

テストを自動化するメリット

iosやandroid等のネイティブアプリはリリースススパンが決まっているので、
ある程度時間かけて手動でテストしても問題なかったりするのですが、webは毎日デブロイしている企業が多いと思います。

毎日ギリギリまでテストしている企業の方も多いと思うんですが、seleniumを使うと、
極端な話ですが、2時間かけてやっていたテストが3分で終わります。

ちなみに学習コストも低いです。1日で覚えて3日である程度書き上げました。

さらに、test-unitを使うと、テストの何処で間違えたのか表示してくれたり、特定のテストを引数にすればそのテストケースだけ実行できます。

railsでTDD開発をしているような感覚でステージングテストを行うことが可能になります。

環境

・selenium(selenium-webdriver,chrome-driverもろもろ)
・ruby2.4.0(2.2以降からtest-unitが入っています!入っていない場合は入れてください!)
・mac ( 2016late )

環境構築の仕方は、後日追記します。
すぐ終わりますので、是非やってみてください。

基本的な使い方


# coding: utf-8
require 'selenium-webdriver'
#2.4.0で動かす場合は下記のライブラリrequireしなくて大丈夫です!
require 'test/unit'

# クラス名を決める。キャメルケース
# Test::Unit::TestCaseを継承
class なんちゃらTest < Test::Unit::TestCase
  # この中にテストを記述する

# クラス変数にすると、同一の変数をメソッドを超えて使えます。
@@email = "[email protected]"

  # testからテストメソッドは始める。スネークケース
  def test_login_chrome
    #code
  end

  def test_item_register_chrome
    #code
  end
end

インスタンスを作成する


# chromeのブラウザを自動で作成する
chrome = Selenium::WebDriver.for :chrome

# ブラウザを閉じる
chrome.quit()

# firefoxのブラウザを自動で作成する
firefox = Selenium::WebDriver.for :firefox

# ブラウザを閉じる
# firefoxの場合はchromeと違いquitで閉じないと開きっぱになるので注意。
firefox.quit()

要素を指定する


# browserは作成したインスタンス
the_element = browser.find_element(:id, "なまえ")
the_element = browser.find_element(:class, "なまえ")

# li要素やaタグなど、同じIDで複数指定されていて特定の要素を指定できない場合は、cssかxpathで選択する。
# ブラウザの拡張機能から、copy→selectorでcssで指定する事ができる。
the_element = browser.find_element(:css, "#から始まるなまえ")

# こちらはcopy→xpath
the_element = browser.find_element(:xpath, "//*から始まるなまえ")

指定した要素に対して、アクションを出す


# 入力フォームの中身を一回消す
the_element.clear()

# 文字列を入力。メアド、パスワード、テキストなど
the_element.send_keys("")

# 入力フォームをsubmitする
the_element.submit()

# ボタンをクリックする。
the_element.click()

# 指定した要素の内容を変数に入れる。
the_element_text = the_element.text()

他にも便利なメソッドがあります


# 期待値と実際の内容があっているか確認する
# expectedは予想した文字列。urlやECなら出品した商品名など
assert_equal(expected, actual)

# 逆に期待値と実際の内容が同一ではないことを確認する
assert_not_equal(expected, actual)

# ブラウザの遷移等で、時間を置く必要がある場合。
# chromeは氣にしなくて大丈夫だけど、特にfirefoxはレスポンスが遅いので、遷移後のurlを取りたくても、前のurlをとったりする場合がある。
# 秒数は""で囲まないように。
sleep(秒数)


# jsのalertの処理
# いま表示されているalertを指定する。
alert = browser.switch_to.alert

#要素を取得
actual_alert_msg = alert.text

#alertを承諾する
alert.accept()

リファクタリングしていて作成した凡用メソッド


  def find_and_fillout(browser, strategy, element, text)

    # フォームを指定し、cookie等の関係で入力されているテキストを削除(clear)して、テキストを入力
    something = browser.find_element(strategy, element)
    something.clear
    something.send_keys(text)

  end

  # ブラウザの現在の場所と正しいURLが一致しているか確認するメソッドです。
  def assert_url(browser, expected_url)

    # 現在のURL
    actual_url = browser.current_url

    # 遷移後のURLと期待しているURLが同じなことを確認
    assert_equal(expected_url, actual_url)

  end

  # 使い方

  # redirect後のurlが合っているか確認
  asset_url(chrome, @@expected_item_register_url

  # emailを入力する
  find_and_fillout(chrome, :id, "なまえ", @@email)

さいごに

ご不明な点や、もっと良い書き方があったら是非おしえていただきたいです!