机器人框架概述
机器人框架是一个通用的开源的自动化测试框架 验收测试和验收测试驱动开发(ATDD)。它具有易于使用的表格的测试数据 语法采用关键字驱动 测试方法。其检测能力可以通过测试库 用Python或java实现的扩展,用户可以使用相同的语法,用于创建测试用例 现有创造新的更高层次的 关键词。
机器人框架的操作系统和应用程序的独立。核心 框架实现Python跑也Jython(JVM)和IronPython(.net)。框架周围有由不同的 通用试题库和工具,开发了一个丰富的生态系统作为单独的项目。
关于机器人的结构和生态系统的更多信息,参见http://robotframework.org。在那里你可以找到更多的资料, 演示项目清单及其他可用的测试库,工具等。
演示中的应用
本指南的示例应用程序是一个经典的登录 例子的变化,它是一个命令行的Python写的认证服务器。 应用允许用户做三:
一个有效的密码创建一个帐户。
使用有效的用户名和密码。
更改现有帐户的密码。
应用程序本身是login.py 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
应用程序使用一个简单的数据库文件来跟踪用户的状态。 文件位于操作系统相关的临时。
执行本指南
这些指示说明如何运行这个引导自己。如果你不 感兴趣,你也可以查看结果在线
装置
推荐的方法安装在机器人的框架Python使用PIP。一旦你有这些条件 安装,你可以简单地运行:
pip安装robotframework
看到机器人安装框架指令在一般的安装选择安装 方法和更多信息。
这个演示是用关于标记语言与机器人 框架试验数据的代码块。这种格式需要安装额外的 执行测试Docutils模块
安装docutils PIP
注意到机器人框架3是第一个机器人框架支持 Python 3版本。看到上述安装说明信息 Python Python 2 vs 3。
执行
之后,你还需要演示本身的安装。这是最简单的 下载一定发布或抓住最新的内容提取 包的地方,但也可能是克隆工程库。
安装到位后,所有其他的条件,你可以在命令行运行 演示用机器人命令:
robot QuickStart.rst
如果你使用机器人框架2.9以上,取而代之的是机器人你 需要使用命令PyBot:
pybot quickstart.rst
你也可以用不同的命令行选项配置执行:
robot --log custom_log.html --name Custom_Name QuickStart.rst
一个列表中的可用选项运行机器人帮助。
查看结果
运行演示产生以下三个结果文件。这些文件是 与预执行文件放到网上,但执行演示创建本地 。
report.html
高水平的测试报告。
log.html
详细的测试执行日志。
output.xml
在机器可读的XML格式的结果。
测试用例
工作流测试
机器人框架的测试用例是使用一个简单的语法创建表格。对于 例子,桌子下面有两试验:
用户可以创建一个帐户并登录
用户无法登录和密码错误
*** Test Cases ***
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
注意,这些测试的念想手动测试用英语写的相当 比喜欢自动化测试用例。机器人框架使用关键字驱动的方法,支持 写作测试,捕捉动作 与自然语言中的期望的本质。
测试用例是由关键词及其可能的争论。的 语法要求关键字和参数,以及设置及其 值,相隔至少两个空格或制表符。这是 一般推荐使用四个空格来分隔更加明确, 和在某些情况下调整参数或其他值可以使数据更容易 来。关于语法的更多细节见机器人框架用户 指南。
高水平的测试
测试用例也可以只使用高级别的关键字,不 位置参数创建。这种方式允许使用完全免费的文本, 适合通信甚至非技术客户或其他项目利益相关者 。这一点尤其重要,当使用 验收测试驱动开发(ATDD)方法或其变体和创造 测试法还要求。
机器人框架不写测试用例执行任何特定的风格。 共同的风格鉴于当时的格式的推广行为驱动开发(BDD):
*** Test Cases ***
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
鉴于一个用户有一个有效的帐户什么 时候她改变她的密码然后她可以用新密码登录和她不能使用旧密码了
数据驱动测试
经常会有多个测试用例很相似但稍有不同的输入或输出数据 。在这些情况下数据驱动测试允许不同的测试数据不重复的工作流。机器人 框架[模板]设置一个测试用例为转向数据驱动的测试 在关键字template是用在测试用例 体定义的数据执行:
*** Test Cases ***Invalid password[Template] Creating user with invalid password should fail
abCD5 ${PWD INVALID LENGTH}
abCD567890123 ${PWD INVALID LENGTH}
123DEFG ${PWD INVALID CONTENT}
abcd56789 ${PWD INVALID CONTENT}
AbCdEfGh ${PWD INVALID CONTENT}
abCD56+ ${PWD INVALID CONTENT}
除了使用[模板]与单独的测试设置,它会 可以使用测试模板设置在设置表像设置和拆解在本指南定义。在我们的例子中, 将会创建单独的分别命名为试验 太短太长的密码和其他无效的情况下。这会让那些 测试到一个单独的文件,虽然,因为否则会 通用模板也可应用于该文件中的其他测试。
还要注意,在上面的例子中的错误消息指定使用变量。
关键词
测试用例是从关键词可以来自两个来源。库关键词字来自进口的测试库,和所谓的用户关键词可以使用相同的表格的语法,用于创建测试用例创建 。
库关键词
所有的最低水平的关键词是在测试库,使用标准的编程语言实现的 定义,通常Python或java。机器人框架 配备一把试题库可分为标准 图书馆,外部库和自定义库。标准库分布的核心框架,包括通用库等操作系统,截图和内置这是因为,特别 关键词可自动。外部的库,如selenium2libraryWeb测试,必须单独安装。如果有 测试库是不够的,很容易创建自定义的测试库。
能够使用的试题库提供的关键字,这是必须要考虑的 使用。本指南中的测试需要关键词的标准操作系统库关键词(例如删除文件)和一个定制的loginlibrary(例如尝试登录凭据)。这些都是进口的 库关键词在设置表:
*** Settings ***
Library OperatingSystem
Library lib/LoginLibrary.py
用户关键词
一个机器人框架最强大的功能是很容易 创造新的更高层次的关键词从其他关键词的能力。语法创建 这些所谓的用户定义的关键词,或用户关键词的简称,是 相似的语法,用于创建测试用例。所有的 上级关键词在以前的测试用例都需要在这 关键词表创建:
*** Keywords ***
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 # Keywords below used by higher level tests. Notice how given/when/then/and
# prefixes can be dropped. And this is a comment. A user has a valid account
Create valid user ${USERNAME} ${PASSWORD} She changes her password
Change password ${USERNAME} ${PASSWORD} ${NEW PASSWORD}
Status should be SUCCESS She can log in with the new password
Login ${USERNAME} ${NEW PASSWORD} She cannot use the old password anymore
Attempt to login with credentials ${USERNAME} ${PASSWORD}
Status should be Access Denied
用户定义的关键词可以包括由其他用户或 库关键词定义的行为。正如你可以看到从这个例子中,用户定义的关键词可以 带参数。他们也可以返回值,甚至包含环。对于 现在,重要的是要了解用户自定义关键词使测试 创造者创造共同的行动序列的可重复使用的步骤。用户定义的 关键词也可以帮助测试者保持尽可能 可读性测试在不同的情况下使用适当的抽象层次。
变量
定义变量
变量是机器人框架中不可或缺的一部分。通常使用的任何数据 测试是随时变化的最好定义为变量。对于 变量定义的语法很简单,在这个变量表见:
*** Variables ***
${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
除了用户定义的变量,有一些内置的变量, 总是可用。这些变量包括$ { TempDir }和$ {/}这 使用上面的例子。
使用变量
变量可用于测试数据中的大部分地方。他们是最常见的 作为关键词下面的测试用例的争论说明。值从 返回关键词也可以被赋值给变量和以后使用。 例如数据库应包含 用户关键词集 数据库内容{ }元数据库变量并验证的内容 使用内置关键词应包含。库关键词和用户的关键词可以 返回值。
*** Test Cases ***
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 *** Keywords ***
Database Should Contain
[Arguments] ${username} ${password} ${status}
${database} = Get File ${DATABASE FILE}
Should Contain ${database} ${username}\t${password}\t${status}\n
测试套件
测试用例的集合被称为机器人框架的测试套件。每一 输入文件包含测试用例的测试套件的形式。什么 时候执行此 指南,你看测试套件快速启动在控制台输出。这个名字是 得到文件名也是可见的报告和日志。
它是可能的组织测试用例的测试用例 分层放置文件到目录,这些目录到其他的目录。所有的 这些目录自动创建高水平的测试套件,让他们 名称目录名称。由于测试套件只是文件和目录, 他们平凡的放置在任何版本控制。
设置和拆解
如果你想要某些关键词是每个测试之前或之后执行, 使用测试设置和测试拆卸在设置表的设置。 同样可以使用套件设置和套件拆卸设置 指定要之前或之后执行关键词整个测试套件。
个人测试还可以用有一个自定义安装或拆卸[设置]和[关闭]在测试用例表。这种工作方式相同[模板]使用前数据驱动测试。
在本演示中我们要确保数据库之前执行 开始,每个测试也事后清理清理:
*** Settings ***
Suite Setup Clear Login Database
Test Teardown Clear Login Database
使用标签
机器人框架允许为测试用例设置标签,给他们*的元数据。 标签可以设置案件在所有测试文件力的标签和 默认标签在下面的表格中设置一样。它也可以定义为一个单一的标签 测试的情况下使用标签设置像早些时候 用户 状态存储在数据库中测试
*** Settings ***
Force Tags quickstart
Default Tags example smoke
当你看后执行测试报告,您可以看到测试 指定标签与他们也有 统计生成基于标签。标签也可以用于许多其他用途,其中最重要的是 可能选择什么样的测试执行。你可以试试, 例如,如下:
robot --include smoke QuickStart.rst
robot --exclude database QuickStart.rst
创建测试库
机器人框架提供了使用 python或java创建测试库的一个简单的API,和远程库接口允许使用其他 编程语言。机器人框架用户指南包含详细的 描述库的API。
作为一个例子,我们可以看一看loginlibrary在这 演示测试库。库关键词位于*/ loginlibrary.py,和它的源代码 也是复制下面。看代码就可以看到,例如,如何 关键词创建用户映射到实际的实施方法create_user。
import os.path
import subprocess
import sys classLoginLibrary(object): def__init__(self):
self._sut_path = os.path.join(os.path.dirname(__file__),
'..', 'sut', 'login.py')
self._status =''defcreate_user(self, username, password):
self._run_command('create', username, password) defchange_password(self, username, old_pwd, new_pwd):
self._run_command('change-password', username, old_pwd, new_pwd) defattempt_to_login_with_credentials(self, username, password):
self._run_command('login', username, password) defstatus_should_be(self, expected_status):
if expected_status !=self._status:
raiseAssertionError(Expected status to be '%s' but was '%s'.% (expected_status, self._status)) def_run_command(self, command, *args):
command = [sys.executable, self._sut_path, command] +list(args)
process = subprocess.Popen(command, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
self._status = process.communicate()[0].strip()