2013年(11)
分类: Python/Ruby
2013-07-04 16:38:49
#2012-02-07 磁针石
#承接软件自动化实施与培训 验证码破解 软件破解 脚本开发 测试和python培训等
#gtalk: ouyangchongwu#gmail.com qq 37391319 博客:testing.blog.chinaunix.net
#版权所有,转载刊登请来函联系
#python qq group: 深圳自动化测试python群:113938272
#武冈深圳qq群:66250781 都梁深圳湖南户外群:49494279
#参考资料:快速入门
Robot Framework是一个通用的关键字驱动自动化测试框架。测试用例以HTML,纯文本或TSV(制表符分隔的一系列值)文件存储。通过测试库中实现的关键字驱动被测软件。Robot Framework灵活且易于扩展。它非常适合测试有不同接口的复杂软件:用户接口、命令行,Web服务,专有的编程接口等。
Robot Framework是开源软件,安装包和源代码等文档可通过获取。本指南旨在介Robot Framework的基本概念。更详细的技术说明,请参阅Robot Framework用户指南。
1.2
安装之前先要安装Python。如果使用Java编写的测试库,Jython中必须安装。使用这个快速入门指南,Python已经足够了。
有三种不同的方式安装Robot Framework,详细的安装步骤参见。安装包可从下载。
1, Windows平台的二进制安装。双击安装程序,下一步就可以了。
2, 每个平台上Robot Framework都可以从源代码安装。解压源文件并运行命令python setup.py install。
3, 如果有Python包管理系统,Robot Framework可以通过easy_install robotframework安装。在Windows中,您还需要手动运行robot_postinstall.py脚本。
安装框架后,有必要把含有启动脚本的目录加入PATH环境变量。在类UNIX系统上,这会自动完成。但Windows必须在控制面板>系统>高级>环境变量加入如:\ Python27\ Scripts中到PATH。
检验安装:
# pybot --version
Robot Framework 2.6.3 (Python 2.7.2 on linux2)Robot Framework 2.6.3 (Python 2.7.2 on win32)
1.3本快速入门指南,也可以作为一个可执行的演示。如果你是在线阅读本指南,你需要先下载robotframework-quickstart-
pybot quickstart.html
文件中的测试就会执行,并产生了以下报告:
report.html
测试结果摘要
log.html
详细的测试结果
Output.xml
portable XML格式的测试结果,方便与其他工具集成Pybot有很多命令选项可以用来控制执行测试和产生输出,可以通过 –help来查看。例如,以下命令更改日志文件的名称和顶层测试套件的名称:
pybot --log mylog.html --name My_Fine_Tests quickstart.html
1.1本指南中的示例应用程序是一个经典的登录例子的变种:它是一个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
>
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
>
SUCCESS
应用程序使用一个简单的数据库文件来保持用户状态。文件位于操作系统的临时目录。比如C:\Documents and Settings\andrewx\Local Settings\Temp,/tmp等。
2.1
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使用关键字驱动的办法,支持自然语言的方式编写测试,捕获的动作的实质和预期结果。测试用例由关键字(通常在第二列)及其可能的参数组成。
2.2测试用例也可以只使用没有参数的高级关键字。这种风格可以使用自由的文本,适合与非技术性的客户等沟通。Robot Framework不强制以任何特定的风格编写测试用例。例如它可以使用given-when-then的行为驱动开发(BDD behavior-driven development):
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 |
这种格式适合用于验收测试驱动开发(ATDD)。在ATDD中,验收测试在实际的产品功能之前书写并和需求一致。
2.3常常几个测试用例,非常类似,只是输入或输出数据不同。在这种情况数据驱动的测试情况下,如以下六个测试,允许不同的测试数据,不重复的工作流程。
Test Case |
|
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} |
在这些测试中,每个测试用例只有一个关键字,它是试图根据给定的密码创建用户并检查预期的创建失败的错误消息。因为只对标题行的第一个单元进行处理,可以用有意义的列标题描述数据。还要注意,错误消息中使用了变量。
测试用例由关键字创建。关键字有三个来源:总是可用的内置关键字,来自导入测试库的库关键字和用户在创建测试用例时使用表格语法创建的用户关键字。
3.1一些通用的关键字,如获取时间(Get Time)和应该等于(Should Be Equal)。这些关键字来自内建测试库。通过它的文档,你可以看到一个完整可用关键字列表。
3.2所有最低级的关键字在测试库中定义,这些测试库使用标准编程语言实现。Robot Framework带有一些库,包括OperatingSystem:支持常见的操作系统功能,截图库。除了这些标准库,还有其他开源项目,如SeleniumLibrary。如果没有合适的可用的库也很容易实现自己的库,参见。
使用测试库的关键字之前需要导入,它必须考虑到使用。本文件中的测试需要导入标准OperatingSystem的库中的关键字(如Remove File)以及从自定义库LoginLibrary(如Attempt to login with credentials)。
Setting |
Value |
Library |
OperatingSystem |
Library |
testlibs/LoginLibrary.py |
Robot Framework最强大的功能之一是能够方便地从其他关键字创建新的更高级别的关键字。创建用户定义的关键字(简称为用户关键字)的语法类似于创建测试用例。前面测试用例用到的高级别的关键字如下:
.
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 |
用户关键字可以包括其他用户定关键字,内置关键字,或库关键字。正如你从这个例子可以看到,用户关键字可以带参数。他们也可以返回值,甚至包含FOR循环。用户关键字可以生成可重用的通用动作序列。用户关键字提高测试的可读性,并在不同情况下使用适当的抽象层次。
4.1测试中需要改变的数据最好的定义为变量。变量定义的语法很简单:
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} |
CONTENT} Password must be a combination of lowercase and uppercase letters and numbers |
变量也可以从命令行给出,以适应不同的环境。例如这个演示可以这样执行:
pybot --variable USERNAME:johndoe --variable PASSWORD:J0hnD0e quickstart.html
除了用户定义的变量,也有一些内置的变量总是可用的。这些变量包括上述表中使用的:$ {TEMPDIR}和${/}在。
变量可用于在测试数据中很多地方。他们多作为关键字的参数。关键字的返回值也可以赋给变量,以便以后使用。
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中测试用例的集合被称为test suites。每个包含测试用例的文件形成了一个test suites。运行这个演示时,您在控制台会看到test suite Quickstart。“Quickstart”是从文件名得到的,在报告和日志中也可见。
通过把测试用例文件放在目录中,并把目录放到其他目录中,可以实现层次化组织测试用例。所有目录自动根据目录名创建更高层次的test suites。由于test suites仅仅是文件和目录,很容易放置在版本控制系统中。
你可以把目录当做test suite来执行:
pybot .
5.2 和 Teardown如果你想在每个测试执行之前和之后执行某些操作,可以使用Test Setup和Test Teardown:
Setting |
Value |
Test Setup |
Clear Login Database |
Test Teardown |
|
同样,你可以使用Suite Setup 和Suite Teardown来指定整形整个test suite之前和之后要执行的操作。
5.3
Robot Framework允许给测试用例的设置标签。通过Default Tags或Force Tags可以所有的测试用例打上标签。也可以给单个测试用例打上标签。
Setting |
Value |
Value |
Force Tags |
quickstart |
|
Default Tags |
example |
smoke |
在测试报告中你可以看到测试及其标签以及基于标签的统计。标签有很多其他用途,最重要的是选择执行测试:
pybot --include smoke quickstart.html
pybot --exclude database quickstart.html
Robot Framework提供了简单的Python 和 Java创建测试库的API。用户指南包含实例和详细说明。
以下是本指南中使用的LoginLibrary测试库的源代码。你可以看到,例如,关键字“create_user”是怎样映射为方法。
import os
import sys
import subprocess
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):
if not sys.executable:
raise RuntimeError("Could not find Jython installation")
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()