Robot Framework
快速入门
Copyright © Nokia Siemens Networks 2008
Licensed under the Apache License, Version 2.0
目录
Robot Framework 快速入门...
介绍...
概述...
安装...
运行demo.
介绍样例应用程序...
测试用例...
第一个测试用例...
高级别测试用例...
数据驱动测试用例...
关键词keywords
内置关键词...
库关键词...
用户定义关键词...
变量...
定义变量...
使用变量...
组织测试用例...
测试套件...
启动和卸载...
使用标签...
创建测试库...
介绍
概述
Robot Framework 是一个关键词驱动的自动测试框架。测试用例位于
HTML或者TSV(以tab分隔值)文件,使用在测试库中实现的关键词来在测试中运行程序。因为Robot Framework 是灵活和可扩展的,所以它很合适用于测试具有多种接口的复杂软件:用户接口,命令行,web service,编程接口等。
Robot Framework 是开源软件和安装包,源码和相关文档可通过
http://robotframework.org获得。本篇指南计划介绍
Robot Framework 的基本概念。如果需要详细的技术描述,请查阅
Robot Framework User Guide.
安装
安装
Robot Framework 的前提是Python被安装。另外,需要使用用Java编写的测试库,
Jython 必须被安装。对使用本篇快速入门来说
Pyhon已经足够了。
共有三种不同的安装
Robot Framework 的方法,从而可以选择最合适你的方式。详细安装说明可以在
project web pages上找到
.
- 有用于windows平台的二进制安装包。双击安装包按照提示安装即可。
- 在所有平台上Robot Framework 都可以从源码安装。想要安装源码,解压源码发行包运行命令python setup.py install 。
- 如果Python包管理系统Easy Install 可以使用, Robot Framework 可以通过命令 easy_install robotframework 安装。在windows下你可以手动运行 robot_postinstall.py 脚本。
框架安装好后,将包含有启动脚本的安装目录添加到
PATH环境变量中。在UNIX-like 系统中应该可以自动完成,但在windows系统必须从 Control Panel > System > Advanced > Environment Variables 添加如下例子
. C:/Python25/Scripts to PATH.
安装成功后可以用命令
pybot –version测试,应该输出如下:
$ pybot --version
Robot Framework 2.0.3 (Python 2.5.2 on linux2)
运行demo
本篇快速入门指南使用一个可执行的
demo。为了运行它启动一个命令shell,cd到本文件目录,在命令行输入下面的命令:
pybot quickstart.html
在本文件内的测试将被执行并产生如下报告
:
report.html
测试结果概述
log.html
测试结果细节
output.xml
以轻型
XML保存的测试结果,便于与其他工具集成
在浏览器中打开
report.html (此链接只有在本指南被执行后才能工作
), 然后打开此链接查看结果。report.html 文件链接着 log.html 文件。
有一些命令行选项可以用来控制测试执行和产生的结果。完整列表可以使用pybot –help 来显示。例如如下命令修改了日志文件和顶层测试套件的名字:
pybot --log mylog.html --name My_Fine_Tests quickstart.html
注意
使用
jybot启动脚本执行本快速入门指南不能与Jython 2.2工作。使用Jython2.5执行需要使用-Dsys.executable 选项设置可执行文件。
介绍样例应用程序
本篇指南的样例应用程序是一个经典登陆样例的变种
: 它是一个使用Python编写的基于命令行的认证服务器。 样例应用允许用户做三件事情:
- 使用有效的密码创建一个用户。
- 使用有效的用户名和密码登陆。
- 修改已存在账户的密码。
应用程序在
sut目录下,可以使用命令python sut/login.py 来执行。尝试使用不存在的用户账户或者错误密码登录将会长生同样的错误信息
:
> python sut/login.py login nobody P4ssw0rd
Access Denied
在使用有效的密码创建一个用户账户后成功登录
:
> python sut/login.py create fred P4ssw0rd
SUCCESS
> python sut/login.py login fred P4ssw0rd
Logged In
一个有效的密码必须满足两个要求
: 它必须是7-12 字符长, 它必须包含大写或者小写字母和数字,但是不能包含特殊字符。尝试使用非法的密码创建用户会失败:
> python sut/login.py create fred short
Creating user failed: Password must be 7-12 characters long
> python sut/login.py create fred invalid
Creating user failed: Password must be a combination of lowercase and
uppercase letters and numbers
使用非法信任状修改密码会产生和使用非法信任状登录一样的错误。新密码的有效性将会被验证,如果不合法如下错误信息会被显示
:
> python sut/login.py change-password fred wrong NewP4ss
Changing password failed: Access Denied
> python sut/login.py change-password fred P4ssw0rd short
Changing password failed: Password must be 7-12 characters long
> python sut/login.py change-password fred P4ssw0rd NewP4ss
SUCCESS
本应用程序使用一个简单的数据库文件来追踪用户的状态。文件在操作西洞庭的临时文件目录。
测试用例
第一个测试用例
Robot Framework 测试用例使用一种简单表格语法。下表含有两个样例:
· 用户可以创建账户并登入
· 用户使用错误密码无法登入
Test Case
|
Action
|
Argument
|
Argument
|
User can create an account and log in
|
Create Valid User
|
fred
|
P4ssw0rd
|
Attempt to Login with Credentials
|
fred
|
P4ssw0rd
|
|
Status Should Be
|
Logged In
|
||
User cannot log in with bad password
|
Create Valid User
|
betty
|
P4ssw0rd
|
Attempt to Login with Credentials
|
betty
|
wrong
|
|
Status Should Be
|
Access Denied
|
注意 这些测试比起自动测试用例更像用英语手工写的测试。
Robot Framework 使用关键词驱动的方式,支持用自然语言来编写可以抓住动作和期望值的本质的测试。测试用例由关键词(通常在第二列)和它们可能的参数组成。
高级别测试用例
测试用例也可以通过使用不携带参数的高级别关键词来创建。这种风格允许使用完全的自由文本以便于进行交流,即使是和非技术人员或者其他利益相关者。
T Robot Framework 不强制使用任何风格来编写测试用例,它可以用于行为驱动开发
behavior-driven development (BDD)推荐的
given-when-then 格式的样例,如下所示。
Test Case
|
Steps
|
User can change password
|
Given a user has a valid account
|
when she changes her password
|
|
then she can log in with the new password
|
|
and she cannot use the old password anymore
|
这种测试用例或者用户故事风格的测试用例的类型很适合用于
acceptance test-driven development (ATDD). 在 ATDD 中接收测试在实现实际产品特性前编写并且他们反映了需求。
数据驱动测试用例
通常部分测试用例除了部分不同的输入或者输出数据外都
.在这些情况下数据驱动,如下面六个测试用例,允许在不复制工作流的情况下改变测试数据 。
Test Case
|
Action
|
Password
|
Expected error message
|
Too short password
|
Creating user with invalid password should fail
|
abCD5
|
${PWD INVALID LENGTH}
|
Too long password
|
Creating user with invalid password should fail
|
abCD567890123
|
${PWD INVALID LENGTH}
|
Password without lowercase letters
|
Creating user with invalid password should fail
|
123DEFG
|
${PWD INVALID CONTENT}
|
Password without capital letters
|
Creating user with invalid password should fail
|
abcd56789
|
${PWD INVALID CONTENT}
|
Password without numbers
|
Creating user with invalid password should fail
|
AbCdEfGh
|
${PWD INVALID CONTENT}
|
Password with special characters
|
Creating user with invalid password should fail
|
abCD56+
|
${PWD INVALID CONTENT}
|
在这些测试中每个测试用例只有一个关键词,它用于用给定的密码创建用户并检查创建过程失败返回的错误信息。注意错误信息使用
variables 变量指定。
关键词keywords
测试用例使用关键词创建,关键词可以从三种来源得到:总是可用的
built-in keywords 内置关键词,从导入的测试库中得到的
library keywords 库关键词和使用同样表格语法创建的用于创造测试用例的
user keywords 用户关键词。
内置关键词
一些常见有用的关键词如
Get TimeBuiltIn 测试库,你可以通过它的文档查看到所有可用的关键词的列表。 和
Should Be Equal 总是可用的。技术上来说这些关键词来自于
库关键词
所有最底层的关键词都是在测试库中定义的,它们通过使用标准编程语言实现。
Robot Framework 本身具有部分库,包括用于支持常见的操作系统函数的
OperatingSystem 库,和用于捕捉屏幕焦点的
Screenshot 库。在这些标准库之外,还有其他的库分布在不同的开源项目中,例如
SeleniumLibrary 用于
Web 测试。当 没有合适的库可用时实现自己的库
implement your own libraries也是很容易的。
想要使用一个测试库提供的关键词,这个库必须被启用。本文件中的测试需要从标准
OperatingSystem 库 (例如,Remove File)和用户自定义LoginLibrary库(例如Attempt to login with credentials)中定义的关键词。这两个库都是使用下面叫做setting 表的表格导入。
Setting
|
Value
|
Library
|
OperatingSystem
|
Library
|
testlibs/LoginLibrary.py
|
Meta: Version
|
1.
0
|
用户定义关键词
Robot Framework 最有用的特性之一就是很容易的从其他关键词中创建新的高级别关键词。创建用户定义关键词,简称用户关键词,的语法和创建测试用例的语法很相似。前面测试用例用到的所有高级别关键词都是在下面
keyword 表中定义的。
Keyword
|
Action
|
Argument
|
Argument
|
Clear login database
|
Remove file
|
${DATABASE FILE}
|
|
Create valid user
|
[Arguments]
|
${username}
|
${password}
|
Create user
|
${username}
|
${password}
|
|
Status should be
|
SUCCESS
|
||
Creating user with invalid password should fail
|
[Arguments]
|
${password}
|
${error}
|
Create user
|
example
|
${password}
|
|
Status should be
|
Creating user failed: ${error}
|
||
Login
|
[Arguments]
|
${username}
|
${password}
|
Attempt to login with credentials
|
${username}
|
${password}
|
|
Status should be
|
Logged In
|
||
# Used by BDD test cases (this is a comment)
|
|||
Given a user has a valid account
|
Create valid user
|
${USERNAME}
|
${PASSWORD}
|
When she changes her password
|
Change password
|
${USERNAME}
|
${PASSWORD}
|
...
|
${NEW PASSWORD}
|
||
Status should be
|
SUCCESS
|
||
Then she can log in with the new password
|
Login
|
${USERNAME}
|
${NEW PASSWORD}
|
And she cannot use the old password anymore
|
Attempt to login with credentials
|
${USERNAME}
|
${PASSWORD}
|
Status should be
|
Access Denied
|
用户定一个经常可以包含从其他用户定义关键词,内置关键词或者库关键词定义的动作。如在本例中所示,用户定义关键词可以携带参数。它们可以返回值设置包括
FOR循环。现在重要的是用户定义关键词使测试创建者能够为常用的动作序列创建可重用的步骤。用户定义关键词还可以帮助测试作者在不同的环境下尽可能保持测试测试可读性和使用恰当的抽象级别。
变量
定义变量
变量是
Robot Framework 的组成部分。通常在测试中的可能变化的数据最好定义为变量。定义变量的语法非常简单,如下表所示:
Variable
|
Value
|
${USERNAME}
|
janedoe
|
${PASSWORD}
|
J4n3D0e
|
${NEW PASSWORD}
|
e0D3n4J
|
${DATABASE FILE}
|
${TEMPDIR}${/}robotframework-quickstart-db.txt
|
${PWD INVALID LENGTH}
|
Password must be 7-12 characters long
|
${PWD INVALID CONTENT}
|
Password must be a combination of lowercase and uppercase letters and numbers
|
变量也可以从命令行给定,以便于测试需要在不同的环境中执行。例如本
demo可以像下面一样执行:
pybot --variable USERNAME:johndoe --variable PASSWORD:J0hnD0e quickstart.html
除了用户定义变量之外,还有一些内置变量也很有用。这些变量包括在上表中使用的${TEMPDIR} 和 ${/} 。
使用变量
变量可以在测试数据的大部分地方使用。如下面的测试用例所示它们最常用作关键词的参数。关键词的返回值也可以复制给变量以便在后面使用。例如下面的
Database Should Contain${database} 变量,然后使用内置关键词Should Contain 验证内容。库和用户定义关键词口可以返回值。 用户关键词设置数据库内容给
Test Case
|
Action
|
Argument
|
Argument
|
Argument
|
User status is stored in database
|
[Tags]
|
variables
|
database
|
|
Create Valid User
|
${USERNAME}
|
${PASSWORD}
|
||
Database Should Contain
|
${USERNAME}
|
${PASSWORD}
|
Inactive
|
|
Login
|
${USERNAME}
|
${PASSWORD}
|
||
Database Should Contain
|
${USERNAME}
|
${PASSWORD}
|
Active
|
Keyword
|
Action
|
Argument
|
Argument
|
Argument
|
Database Should Contain
|
[Arguments]
|
${username}
|
${password}
|
${status}
|
${database} =
|
Get File
|
${DATABASE FILE}
|
||
Should Contain
|
${database}
|
${username}/t${password}/t${status}
|
组织测试用例
测试套件
在
Robot Framework中测试用例的集合叫做测试套件。每个包含测试用例的输入文件组成一个测试套件。当运行本demo时,可以在控制台输出上看见测试套件Quickstart 。这个名字来自于文件名并且在报告和日志都可见。
可以通过将测试用例文件放置在目录中并将这些目录放在其他目录中来组织测试用例的层次。所有这些目录自动创建以目录名命名的高层次测试套件。因为测试套件知识文件和目录,它们很容易放置到任何版本管理系统中。
你可以通过在本指南的目录下运行如下命令来测试运行一个目录作为一个测试套件
:
pybot .
启动和卸载
如果你希望让一系列动作在每个测试执行之前或之后发生,使用
Test Setup 和
Test Teardown 设置如下:
Setting
|
Value
|
Test Setup
|
Clear Login Database
|
Test Teardown
|
同样你也可以使用
Suite Setup 和
Suite Teardown 设置来指定在整个测试套件执行之前和之后执行的动作。
使用标签
Robot Framework 允许为测试用例设置标签以便给他们自由的元数据。
allows setting tags for test cases to give them free metadata. 标签可以使用如下表中Default Tags 和 Force Tags settings为一个文件中的所有测试用例设置。也可以像前面User status is stored in database 测试中那样为单独的测试用例设置标签。
Setting
|
Value
|
Value
|
Force Tags
|
quickstart
|
|
Default Tags
|
example
|
smoke
|
当你在一个测试执行后查看报告时,可以发现测试与标签相关联并且按照标签同级生成。标签还可用于很多其他目的,其中一个很重要的就是用于选择想要执行什么测试。你可以尝试下面的命令:
pybot --include smoke quickstart.html
pybot --exclude database quickstart.html
创建测试库
Robot Framework 为创建测试库提供了一个简单的
API,包括Python 和 Java。
user guide包括有具有例子的详细说明。
下面是本文中
LoginLibrarycreate_user 的实际实现。 的源码。可以看到关键词
Create User 是如何映射到方法
import
os
import
sys
class
LoginLibrary:
def __init__(self):
self._sut_path = os.path.join(os.path.dirname(__file__),
'..', 'sut', 'login.py')
self._status = ''
def create_user(self, username, password):
self._run_command('create', username, password)
def change_password(self, username, old_pwd, new_pwd):
self._run_command('change-password', username, old_pwd, new_pwd)
def attempt_to_login_with_credentials(self, username, password):
self._run_command('login', username, password)
def status_should_be(self, expected_status):
if expected_status != self._status:
raise AssertionError("Expected status to be '%s' but was '%s'"
% (expected_status, self._status))
def _run_command(self, command, *args):
command = '"%s" %s %s' % (self._sut_path, command, ' '.join(args))
process = os.popen(command)
self._status = process.read().strip()
process.close()
Generated by
reStructuredText. Syntax highlighting by
Pygments.
Generated on: 2009-01-13 16:13 UTC.