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

33
Web ののののの Python のののの ののののののののののののの ? の Selenium ののの #nds47 @civic

Upload: civicpg

Post on 13-Apr-2017

381 views

Category:

Engineering


0 download

TRANSCRIPT

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

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

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

お前だれよ• @civic • NDS 管理者• Python, Java

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

今日話す内容

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

今日話す内容• Python がメインではありません

• E2E テストについて• Selenium について• デモ

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

突然ですが

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

NDS の発表者は講師ではない

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

発表者である私自身も使い始めようと調べている段階ですので、今わかっている内容について報告するという体で

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

講師じゃなくても学習中の身で発表できるのが NDS

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

講師じゃなくても学習中の身で発表できるのがNDS

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

E2E (End to End) テスト

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

E2E テスト• End to End テスト

• テスト対象となるシステムを使ってテスト• Web システムの場合・ブラウザを使って ...

• UI• Web のネットワーク接続• サーバーサイドの処理• データベース

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

E2E テスト• 単体テストで確認した項目を再び全部テストするわけ

ではない• 詳細な点は単体テストで確認しているので、全体的な

シナリオにそって動作するかを確認する• テストが大変で、時間もかかるためできるかぎり量

を減らしたい→詳細な内容は単体テスト・結合テストで網羅する

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

エビデンス• テストがちゃんと実施されたという証拠(エビデンス)• 例

• 画面のスクリーンショット(ちゃんと正常に出力されてます)

• データベースのダンプ(処理前・処理後)• 操作してスクリーンショットをとって Excel に貼り付

けるだけの仕事 ...

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

エビデンス「 X のテスト実施しました!」「わかった。よくやった」・・・「不具合だ! X が怪しい!テストしたのか!」「しました!」「ほんとか!」「ホントです!」つエビデンス「よし!通れ!」

不具合はあったが、 X についてテストはきちんとおこなわれていた証明になった

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

Selenium について

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

Selenium• E2E テストを自動化するツール• 結構古い歴史 (2004 〜 )• Selenium 2.0 で大きく変わった

• WebDriver• 昔:ページ内 JavaScript でブラウザを操作

Java 他→ JS コードに変換→ページに埋め込み• 今:ブラウザの機能でブラウザを操作

各種言語でブラウザの拡張機能を操作

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

WebDriver

Selenium WebDriver で Web アプリのテストが変わる(前編)http://www.atmarkit.co.jp/ait/articles/1210/05/news104.html

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

WebDriver によって• WebDriver によって

• ブラウザを操作するのは各ブラウザごとに用意された拡張機能で行う( Chrome はブラウザ本体)

• WebDriver への指示をクライアントライブラリから送る( HTTP)

• クライアントライブラリとしては、 HTTP を送るだけだから様々な言語で用意可能

• Selenium Server を経由することで離れた場所でも操作できる→ SauceLabs などのサービス

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

デモREPL でブラウザを操作

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

環境構築• クライアントライブラリに Python を使用• Selenium モジュールのインストール

$ pip install selenium

• ipython という REPL 環境で試してみます

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

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

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

デモpython の unittest でテストコード記述

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

テストプログラム化• Python のテストコードとして記述

• 標準テストライブラリ unittest を使用する例(特に Selenium 用に特化しなくてよい)

class MyTest(unittest.TestCase):

def test_mytest(self): driver = webdriver.Firefox() driver.get("www.google.com") ....

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

テストメソッド - 前半

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

テストメソッド - 後半

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

要点をかいつまんで• エレメントの取得 find_element 〜

driver.find_element_by_name('q')• キー入力

element.send_keys('cheese!')• スクリーンショット取得

driver.get_screenshot_as_file("filename")• 待機

ui.WebDriverWait(driver, 10).until(...)

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

テストコードの記述の仕方については、ダラダラと書いてしまったが、メンテしやすく読みやすいコードにすべき→ ページオブジェクトパターン

http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-design-pattern

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

SauceLabs を使ったクロスブラウザでのテスト

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

SauceLabs• ブラウザの実行環境を提供してくれるサービス• Selenium 対応  Remote WebDriver

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

デモSauceLabs でリモートのブラウザでテスト

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

Remote WebDriver• Remote WebDriver を使うだけでテストコードは同じ

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

まとめ

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

まとめ• Selenium を使えばブラウザの操作を自動化できる

• 各種言語( Pythonふくむ)でテストコードを書ける

• E2E のテストの書き方は工夫が必要• すべてを網羅するテストはユニットテストの方で• テストをがんばりすぎない