Upload
civicpg
View
381
Download
0
Embed Size (px)
Citation preview
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 webdriverdriver = 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 のテストの書き方は工夫が必要• すべてを網羅するテストはユニットテストの方で• テストをがんばりすぎない