Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Taming robotframework

2,217 views

Published on

This is an introductory slide on Robot Framework. Modified for upload. Original version was presented at DevLove Kansai 2016/07/22: Taming E2E tests.

Published in: Software

Taming robotframework

  1. 1. Taming Robot Framework Yasushi Masuda
  2. 2. Yasushi Masuda ( @whosaysni ) MonotaRO Co., LTD. 株式会社モノタロウ IT部門 Pythonista since 2001 (2.0〜) • elaphe (barcode library) • oikami.py (老神.py) • PyCon JP founder Japanese Translation works ←new!
  3. 3. Robot Framework
  4. 4. Test Automation Framework for ATDD Originally Developed in Nokia Networks OSS (Apache License 2.0) Keyword driven powered http://robotframework.org/
  5. 5. What's good • Text-based (VCS friendly, End-user friendly) • Any language is allowed 日本語もOK • Simple suite structure - file/directory • Quick - no test compilation • Batteries included - BuiltIn library/keywords • Powerful external libraries (Selenium2, DB, Appium, etc..) • Runs anywhere on Python, extendable with Python
  6. 6. ATDD? Keywords?
  7. 7. Acceptance Test - from user's point of view - prior to coding - what would be checked by a test
  8. 8. Requirements System Analysis Software Design Module Design Acceptance Test System Test Integration Test Unit Test Coding
  9. 9. • ウェブサイトで、利用者がアンケー トに回答したり、自分の診断結果を 表示したりしたい。 • ログインしてなかったら、ユーザ ーIDとパスワードでログイン。 • ログインしたら、メニューのペー ジがあって、アンケートに回答す るページと、診断結果の表示ペー ジに飛ぶ。 • アンケートに回答してなかっ たら、診断結果のページには 行けない。 • アンケートに回答していたら 、アンケートのページには行 けない。 • 未ログインでアクセスするとログインペ ージに移動すること • ログイン済でアクセスするとメニューペ ージに移動すること • ログインページにユーザID欄とパスワー ド欄、ログインボタンがあること • 正しいユーザIDとパスワードを入力して ログインボタンを押すとログインしてメ ニューのページに移動すること • ユーザIDやパスワードが正しくないか、 空欄のときは「ユーザIDかパスワードが 正しくありません」と表示すること • アンケート未回答のとき、メニューには アンケートへのリンクが表示され、診断 結果のリンクが表示されないこと • アンケート回答済のとき、メニューにア ンケートへのリンクが表示されず、診断 結果へのリンクが表示されること
  10. 10. Keywords combination of actions
  11. 11. • 正しいユーザIDとパスワ ードを入力してログイン ボタンを押すとログイン してメニューのページに 移動すること • ユーザIDやパスワードが 正しくないか、空欄のと きは「ユーザIDかパスワ ードが正しくありません 」と表示すること • ログイン成功のテスト • ユーザIDに「${正しいID}」を入力する • パスワードに「${正しいパスワード}」を入 力する • ログインボタンをクリックする • 遷移先が「${メニューのページ}」か検証す る • ログイン失敗のテスト • ユーザIDに「${正しいID}」を入力する • パスワードに「${不正なパスワード}」を入 力する • ログインボタンをクリックする • 遷移先が「${ログインページ}」か検証する • 画面に「ユーザIDかパスワードが正しくあ りません」と表示されているか検証する
  12. 12. in an example
  13. 13. Python https://www.python.org/downloads/ $ pip install robotframework $ pip install robotframework-selenium2library ※ WebDriver http://www.seleniumhq.org/projects/webdriver/ also supported: PyPy, Jython, IronPython Installation in seconds
  14. 14. *** settings *** Library Selenium2Library *** test cases *** My First Test Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 Go To http://192.168.240.86:8000/ Title Should Be Login Page Should Contain Please Log In. Capture Page Screenshot Screenshot.png Close All Browsers minimal test case
  15. 15. *** settings *** Library Selenium2Library *** test cases *** My First Test Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 Go To http://192.168.240.86:8000/ Title Should Be Login Page Should Contain Please Log In. Capture Page Screenshot Screenshot.png Close All Browsers sections
  16. 16. *** settings *** Library Selenium2Library *** test cases *** My First Test Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 Go To http://192.168.240.86:8000/ Title Should Be Login Page Should Contain Please Log In. Capture Page Screenshot Screenshot.png Close All Browsers header test case(s)
  17. 17. *** settings *** Library Selenium2Library *** test cases *** My First Test Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 Go To http://192.168.240.86:8000/ Title Should Be Login Page Should Contain Please Log In. Capture Page Screenshot Screenshot.png Close All Browsers Name Actions
  18. 18. *** settings *** Library Selenium2Library *** test cases *** My First Test Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 Go To http://192.168.240.86:8000/ Title Should Be Login Page Should Contain Please Log In. Capture Page Screenshot Screenshot.png Close All Browsers Keyword Arguments
  19. 19. *** settings *** Library Selenium2Library *** test cases *** My First Test Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 Go To http://192.168.240.86:8000/ Title Should Be Login Page Should Contain Please Log In. Capture Page Screenshot Screenshot.png Close All Browsers variables
  20. 20. *** settings *** Library Selenium2Library *** variables *** ${SITE_ROOT} = http://192.168.240.86:8000/ *** test cases *** My First Test Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 Go To ${SITE_ROOT} Title Should Be Login Page Should Contain Please Log In. Capture Page Screenshot Screenshot.png Close All Browsers
  21. 21. *** settings *** Library Selenium2Library *** variables *** ${SITE_ROOT} = http://192.168.240.86:8000/ *** test cases *** My First Test Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 Go To ${SITE_ROOT} Title Should Be Login Page Should Contain Please Log In. Capture Page Screenshot Screenshot.png Close All Browsers Reuse actions by user-defined keywords
  22. 22. *** settings *** Library Selenium2Library *** variables *** ${SITE_ROOT} = http://192.168.240.86:8000/ *** test cases *** My First Test ブラウザウィンドウを準備する Go To ${SITE_ROOT} Title Should Be Login Page Should Contain Please Log In. Capture Page Screenshot Screenshot.png Close All Browsers *** keywords *** ブラウザウィンドウを準備する Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 日本語 OK! User Keyword
  23. 23. Setup/Teardown *** settings *** Library Selenium2Library *** variables *** ${SITE_ROOT} = http://192.168.240.86:8000/ *** test cases *** My First Test [Setup] ブラウザウィンドウを準備する Go To ${SITE_ROOT} Title Should Be Login Page Should Contain Please Log In. [Teardown] スクリーンショットを取ってブラウザを閉じる *** keywords *** ブラウザウィンドウを準備する Open Browser about: browser=chrome Set Window Position 100 100 Set Window Size 640 480 スクリーンショットを撮ってブラウザを閉じる Capture Page Screenshot Screenshot.png Close All Browsers
  24. 24. Structured tests
  25. 25. *** settings *** Library Selenium2Library *** variables *** ${SITE_ROOT} = http://192.168.240.86:8000/ *** test cases *** ログイン画面は「ログインしてください」と表示する トップページに行く 「ログインしてください」と表示する 正しいログイン情報でログインできる トップページに行く ログインフォームが表示されている ユーザID欄に「${VALID_ID}」を入力する パスワード欄に「${VALID_PW}」を入力する ログインボタンを押す メニュー画面に遷移する 不正なログイン情報でログインできない トップページに行く ログインフォームが表示されている ユーザID欄に「${VALID_ID}」を入力する パスワード欄に「${INVALID_PW}」を入力する ログインボタンを押す ログイン画面に遷移する 「IDまたはパスワードが違います」と表示する test case test case test case A file => A suite test suite
  26. 26. test suite test suite test suite test suite test suite test suite test suite test suite ─ tests ├ test_webui │ ├ test_login.robot │ ├ test_dashboard.robot │ └ test_logout.robot └ test_api ├ test_auth.robot └ test_stat.robot Bunch of files (suites) in a directory => suites Bunch of suite dirs => suite
  27. 27. *** settings *** Resources resources/common_resources.txt *** keywords *** ... *** variables *** ... × Test cases aren't allowed Resource files: Share keywords/variables among suites
  28. 28. *** settings *** Variables sut_variables.py ${HOME} VAR1 = [...] VAR2 = "..." def get_variables(*args): from os.path import abspath, join home = abspath(args[0]) return { 'DESKTOP': join(home, 'Desktop'), 'DOWNLOAD': join(home, 'Download') } Variable files: Defined in Python, allowing dynamic/parametric variable definitions
  29. 29. Running tests
  30. 30. $ robot mytest.robot ======================================================================= ======= Test Library ======================================================================= ======= My First Test | PASS | ------------------------------------------------------------------------------ Test Library | PASS | 1 critical test, 1 passed, 0 failed 1 test total, 1 passed, 0 failed ======================================================================= ======= Output: /path/to/test/output.xml Log: /path/to/test/log.html Report: /path/to/test/report.html
  31. 31. HTML report
  32. 32. Log
  33. 33. <?xml version="1.0" encoding="UTF-8"?> <robot generated="20160721 21:25:48.239" generator="Robot 3.0 (Python 2.7.10 on darwin)"> <suite source="/Users/ymasuda/Desktop/test_demo/10_login.robot" id="s1" name="10 Login"> <kw type="setup" name="Open Browser" library="Selenium2Library"> <doc>Opens a new browser instance to given URL.</doc> <arguments> <arg>about:</arg> <arg>browser=chrome</arg> </arguments> <msg timestamp="20160721 21:25:48.346" level="INFO"> Opening browser 'chrome' to base url 'about:' </msg> <status status="PASS" endtime="20160721 21:25:50.512" starttime="20160721 21:25:48.346"></status> </kw> <test id="s1-t1" name="ログイン前に管理ページに行くとログインにリダイレクトする"> <kw type="setup" name="テストケース準備"> <kw name="Delete All Cookies" library="Selenium2Library"> ... XML Output: Individual test/suite results, keywords as well
  34. 34. robot test suite HTML output Log XML Output Custom Report CI Screenshots Xunit Output Build Tools XSLT Drone, Jenkins, etc.
  35. 35. Advanced Features
  36. 36. Template: Data-driven tests Gherkin style: Behaviour-driven tests Page Object Pattern
  37. 37. *** test cases *** 不正なデータのときエラーメッセージを出す [template] ログインに失敗してエラーメッセージを表示する ${EMPTY} ${EMPTY} ユーザーIDを入力してください ${EMPTY} BADPASS ユーザーIDを入力してください TESTUSER ${EMPTY} パスワードを入力してください TESTUSER BADPASS IDまたはパスワードが違います TEST BADPASS IDは半角英数で入力してください T01234567890123456 BADPASS ユーザIDが長すぎます *** keywords *** ログインに失敗してエラーメッセージを表示する [arguments] ${user_id} ${password} ${err_msg} 「${user_id}」と「${password}」でログインする ログイン画面から遷移しない エラーメッセージに「${err_msg}」と表示する Templates
  38. 38. *** test cases *** Login success for valid user/password Given user is looged out Given at login page When enter "${VALID_ID" in ID, "${VALID_PW}" in Password And click login button Then user is redirected to menu page Gherkin Gherkin prefixes are ignored automatically
  39. 39. from robotpageobjects import Page class LoginPage(Page): selectors = { 'user id': 'id=user_id', 'password': 'id=passwd' } def login(self, uid, pw): self.input_text('user id', uid) self.input_text('password', pw) self.click_button(...) Page Object Pattern (robotframework-pageobject by NCBI) *** settings *** Library mysite.LoginPage *** test cases *** Test Login Page Go To Login Page Login Page Url Should Be /login Login ${VALID_ID} ${VALID_PW}
  40. 40. Ecosystem
  41. 41. System Under Test Interface Test Library Robot Framework Test cases / User Keywords Text Files Python + Robot Framework Python package Test tools: WebDriver, DB driver, etc.
  42. 42. def should_be_prime(x): """Fails if x is not a prime""" try: ix = int(x) except: raise ValueError('Not a number.') asserts.true(is_prime(x), 'Not a prime.') *** settings *** Library MyLibrary *** test cases *** Number should be prime Should Be Prime 41 Define new keyword in a library
  43. 43. Built-in libraries OS(child process), XML, Telnet, Dialog External libraries Database, MongoDB, ElasticSearch... SSH, HTTP, FTP, SUDS, MQTT... Swing, Calabash, Appium, Django... Serial ← New!
  44. 44. Beyond E2E
  45. 45. Requirements System Analysis Software Design Module Design Acceptance Test System Test Integration Test Unit Test Coding Extending coverages
  46. 46. Tweaking internal states Login state: session cookies Internal DB status: SQL fixtures Config/server status: commands via ssh
  47. 47. Be a good test trainer • Start with minimal essential E2E • Add regression for every failure detection • Reorganize test keywords/structures (reuse, modular, configurable) • Run test as many time as possible (culture, process, automation)
  48. 48. Docs
  49. 49. Online Docs robotframework.org http://robotframework.org/#documentation 日本語ドキュメント集(和訳) http://robotframework-ja.readthedocs.io/ Books "Robot Framework Test Automation" https://www.amazon.co.jp/dp/B00G8YAWH8 ML robotframework-users@googlegroup (英語) rfw-users-jp@googlegroup (日本語)
  50. 50. Thanks!

×