Test Automation Frameworkfor
ATDD
Originally Developed in
Nokia Networks
OSS (Apache License 2.0)
Keyword driven
powered
http://robotframework.org/
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
Python https://www.python.org/downloads/
$ pipinstall robotframework
$ pip install robotframework-selenium2library
※ WebDriver http://www.seleniumhq.org/projects/webdriver/
also supported:
PyPy, Jython, IronPython
Installation in seconds
14.
*** settings ***
LibrarySelenium2Library
*** 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.
*** settings ***
LibrarySelenium2Library
*** 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.
*** settings ***
LibrarySelenium2Library
*** 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.
*** settings ***
LibrarySelenium2Library
*** 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.
*** settings ***
LibrarySelenium2Library
*** 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.
*** settings ***
LibrarySelenium2Library
*** 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.
*** settings ***
LibrarySelenium2Library
*** 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.
*** settings ***
LibrarySelenium2Library
*** 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.
*** settings ***
LibrarySelenium2Library
*** 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.
Setup/Teardown
*** settings ***
LibrarySelenium2Library
*** 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
*** settings ***
LibrarySelenium2Library
*** 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.
test suite
test suite
testsuite
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
*** 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.
from robotpageobjects importPage
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}
System Under Test
Interface
TestLibrary
Robot Framework
Test cases / User Keywords Text Files
Python + Robot Framework
Python package
Test tools:
WebDriver,
DB driver, etc.
42.
def should_be_prime(x):
"""Fails ifx 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
Tweaking internal states
Loginstate: session cookies
Internal DB status: SQL fixtures
Config/server status: commands via ssh
47.
Be a goodtest 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)