Robot Framework 快速入门_中文版

  1. 云栖社区>
  2. 博客>
  3. 正文

Robot Framework 快速入门_中文版

方倍工作室 2012-05-10 18:09:00 浏览626
展开阅读全文

目录

介绍

概述

安装

运行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上找到.

  1. 有用于windows平台的二进制安装包。双击安装包按照提示安装即可。
  2. 在所有平台上Robot Framework 都可以从源码安装。想要安装源码,解压源码发行包运行命令python setup.py install  。
  3. 如果Python包管理系统Easy Install 可以使用, Robot Framework 可以通过命令easy_install robotframework 安装。在windows下你可以手动运行robot_postinstall.py 脚本。

框架安装好后,将包含有启动脚本的安装目录添加到PATH环境变量中。在UNIX-like 系统中应该可以自动完成,但在windows系统必须从 Control Panel > System > Advanced > EnvironmentVariables 添加如下例子. 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 Time 和 Should Be Equal 总是可用的。技术上来说这些关键词来自于BuiltIn 测试库,你可以通过它的文档查看到所有可用的关键词的列表。

库关键词

所有最底层的关键词都是在测试库中定义的,它们通过使用标准编程语言实现。 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包括有具有例子的详细说明。

下面是本文中LoginLibrary 的源码。可以看到关键词Create 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()

 

网友评论

登录后评论
0/500
评论
方倍工作室
+ 关注