WebのテストをPythonでやって
エビデンス取得作業から開放?
〜Selenium風味〜
#nds47 @civic
お前だれよ
• @civic
• NDS管理者
• Python, Java
今日話す内容
今日話す内容
• Pythonがメインではありません
• E2Eテストについて
• Seleniumについて
• デモ
突然ですが
NDSの発表者は講師ではない
発表者である私自身も使い始めようと調べて
いる段階ですので、今わかっている内容につ
いて報告するという体で
講師じゃなくても学習中の身で
発表できるのがNDS
講師じゃなくても
学習中の身で
発表できるのが
NDS
E2E (End to End) テスト
E2Eテスト
• End to Endテスト
• テスト対象となるシステムを使ってテスト
• Webシステムの場合・ブラウザを使って...
• UI
• Webのネットワーク接続
• サーバーサイドの処理
• データベース
E2Eテスト
• 単体テストで確認した項目を再び全部テストするわけ
ではない
• 詳細な点は単体テストで確認しているので、全体的
なシナリオにそって動作するかを確認する
• テストが大変で、時間もかかるためできるかぎり量
を減らしたい
→詳細な内容は単体テスト・結合テストで網羅する
エビデンス
• テストがちゃんと実施されたという証拠(エビデンス)
• 例
• 画面のスクリーンショット(ちゃんと正常に出力さ
れてます)
• データベースのダンプ(処理前・処理後)
• 操作してスクリーンショットをとってExcelに貼り付け
るだけの仕事...
エビデンス
「Xのテスト実施しました!」
「わかった。よくやった」
・・・
「不具合だ!Xが怪しい!テストしたのか!」
「しました!」
「ほんとか!」
「ホントです!」つエビデンス
「よし!通れ!」
不具合はあったが、Xについてテストは
きちんとおこなわれていた証明になった
Seleniumについて
Selenium
• E2Eテストを自動化するツール
• 結構古い歴史(2004〜)
• Selenium 2.0で大きく変わった
• WebDriver
• 昔:ページ内JavaScriptでブラウザを操作
Java他→JSコードに変換→ページに埋め込み
• 今:ブラウザの機能でブラウザを操作
各種言語でブラウザの拡張機能を操作
WebDriver
Selenium WebDriverでWebアプリのテストが変わる(前編)
http://www.atmarkit.co.jp/ait/articles/1210/05/news104.html
WebDriverによって
• WebDriverによって
• ブラウザを操作するのは各ブラウザごとに用意され
た拡張機能で行う(Chromeはブラウザ本体)
• WebDriverへの指示をクライアントライブラリから送
る(HTTP)
• クライアントライブラリとしては、HTTPを送るだけ
だから様々な言語で用意可能
• Selenium Serverを経由することで離れた場所でも操
作できる→SauceLabsなどのサービス
デモ
REPLでブラウザを操作
環境構築
• クライアントライブラリにPythonを使用
• Seleniumモジュールのインストール
$ pip install selenium
•ipython というREPL環境で試してみます
REPLで確認
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.google.com")
q = driver.find_element_by_name('q')
q.send_keys("長岡IT開発者勉強会")
q.submit()
driver.screenshot()
driver.quit()
デモ
pythonのunittestでテストコード記述
テストプログラム化
• Pythonのテストコードとして記述
• 標準テストライブラリunittestを使用する例
(特にSelenium用に特化しなくてよい)
class MyTest(unittest.TestCase):
def test_mytest(self):
driver = webdriver.Firefox()
driver.get("www.google.com")
....
テストメソッド-前半
テストメソッド-後半
要点をかいつまんで
• エレメントの取得 find_element〜
driver.find_element_by_name('q')
• キー入力
element.send_keys('cheese!')
• スクリーンショット取得
driver.get_screenshot_as_file("filename")
• 待機
ui.WebDriverWait(driver, 10).until(...)
テストコードの記述の仕方については、
ダラダラと書いてしまったが、メンテしやす
く読みやすいコードにすべき
→ ページオブジェクトパターン
http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-design-pattern
SauceLabsを使った
クロスブラウザでのテスト
SauceLabs
• ブラウザの実行環境を提供してくれるサービス
• Selenium対応 Remote WebDriver
デモ
SauceLabsでリモートのブラウザでテスト
Remote WebDriver
• Remote WebDriverを使うだけでテストコードは同じ
まとめ
まとめ
• Seleniumを使えばブラウザの操作を自動化できる
• 各種言語(Pythonふくむ)でテストコードを書ける
• E2Eのテストの書き方は工夫が必要
• すべてを網羅するテストはユニットテストの方で
• テストをがんばりすぎない

#nds47 WebのテストをPythonでやってエビデンス取得作業から開放?