RF《Quick Start Guide》操作总结
这篇文章之所以会给整理出来,是因为学了一个季度的RF后,再去看官网的这个文档,感触破多,最大的感触还是觉得自己走了不少弯路,还有些是学习方法上的弯路。在未查看这类官网文档之前,更多的是看其他各种人的博客,看齐涛的修炼宝典(无任何恶意,仅表明适合刚入门的测试人员)的方式来学习RF,学的很多知识点都零散且不同的博客对同一个问题还有不同的个人看法。于是后期便开始查看官网文档,学习了Quick Start Guide 文档后,对于一个已入门3个月的测试来说,还是有些收获(可能以前也是自己学的肤浅,呵呵)。下面就从Quick Start Guide中挑选出部分重要的知识点。
首先在官网下载Quick Start Guide的相关文档(官网:https://github.com/robotframework/QuickStartGuide/blob/master/QuickStart.rst),这个文档使用了一个经典的登录应用程序,实际上就一个用python语言写的基于命令的代码。分2个模块:一个模块是服务器端的代码login.py.里面主要有2个类构成UserDataBase和User,User类主要是针对User的属性username,password,status的校验管理。比如密码长度必须是6-12位且由大小写+数字组成。而UserDataBase主要是完成User与数据库(robotframework-quickstart-db.txt)的交互。比如把符合一定规则的用户注册信息保存在数据库中。部分代码如下所示,详细的代码参见:QuickStartGuide-master\sut\login.py
class User(object):
@property
def password(self):
return self._password @password.setter
def password(self, password):
self._validate_password(password)
self._password = password def _validate_password(self, password):
if not (7 <= len(password) <= 12):
raise ValueError('Password must be 7-12 characters long')
if not self._validate_password_chars(password):
raise ValueError('Password must be a combination of lowercase '
'and uppercase letters and numbers') def _validate_password_chars(self, password):
has_lower = has_upper = has_number = False
for char in password:
if char.islower():
has_lower = True
elif char.isupper():
has_upper = True
elif char.isdigit():
has_number = True
else:
return False
return has_lower and has_upper and has_number
class UserDataBase(object):
def create_user(self, username, password):
try:
user = User(username, password)
except ValueError as err:
return 'Creating user failed: %s' % err
self.users[user.username] = user
return 'SUCCESS' def login(self, username, password):
if self._is_valid_user(username, password):
self.users[username].status = 'Active'
return 'Logged In'
return 'Access Denied' def _is_valid_user(self, username, password):
return (username in self.users and
self.users[username].password == password) def change_password(self, username, old_pwd, new_pwd):
try:
if not self._is_valid_user(username, old_pwd):
raise ValueError('Access Denied')
self.users[username].password = new_pwd
except ValueError as err:
return 'Changing password failed: %s' % err
else:
return 'SUCCESS'
还有一个模块,是封装关键字给RF直接调用的,然后在文件里面又调用了服务器模块login.py来与服务进行交互。部分代码如下,详细代码见:QuickStartGuide-master\lib\LoginLibrary.py
class LoginLibrary(object): 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))
由此可见,这个demo提供以下四个功能:
- 使用有效的密码创建一个用户。create_user(username, password)
- 使用有效的用户名和密码登陆。attempt_to_login_with_credentials( username, password)
- 修改已存在账户的密码。change_password(username, old_pwd, new_pwd)
- 判断用户的当前状态. status_should_be(expected_status)
Demo在RF内,首先可以创建一个suit级别的文件,然后导入operatingSystem库(Remove File关键字使用到的库文件)和用户自定义LoginLibrary库(测试服务器模块login.py),拷贝sut到D:\python27下,再拷贝LoginLibrary.py到D:\python27\Lib文件夹下,搭建完后,架构如图所示:
阶段一:简单的测试用例:就用LoginLibrary内提供的关键字进行以下测试.
这个测试用例的第二步和第三步就直接使用了LoginLibrary内提供的关键字进行测试
阶段二:用户关键字定义
上图的第一步create valid user 就属于用户自定义的关键字,这个自定义的关键字主要实现了,创建用户,然后判断当前用户状态为success,则就能表现创建的确实为合法的用户。
阶段三:数据驱动测试用例
以前没看文档之前,看官网介绍,就是介绍RF支持关键字驱动也支持数据驱动,一直误以为意思是指把测试数据全部写在excel内,然后RF去读取再实现,之前也有尝试过,但是里面的逻辑较为复杂,也一直是一知半解。后面学习完文档后,终于意会到RF所指的数据驱动是个神马意思了。
Demo里面创建一个测试用例,创建用户时,使用不合法的密码。Demo先把这段逻辑抽成一个用户关键字。实现如下:
该用户自定义关键字的入参为password和error,然后创建一个测试用例:引用之前创建的用户自定义关键字
end~直接在表格写入参即可。这类测试用例,最常用于一些无状态的接口测试项目中。
阶段四:高级别测试用例
之所以称为高级别的测试用例,其实我一直还不明白是为什么,就因为可用于编写测试驱动开发的用例么?没想通??这种测试用例主要由不携带实际参数的用户自定义关键字组成。用户自定义关键字有四个,如下所示:
自定义关键字的变量都直接写好在RF内
然后使用given-when-then格式创建测试用例:
这类测试用例主要用于测试驱动开发的场景下.
在demo里面使用了db文件,这个文件作用就是充当数据库,存储用户的一些信息。Demo里面有提到在每次运行测试用例之前删除这个文件,然后还有就是查询文件里的一些信息。
运行完后,这个文件是这样的:
这个文档基本的内容应该就是上面所描述的,从这次文档的学习,总结下自己学到的知识点:
- RF内的数据驱动的含义
- 高级关键字的使用场景
- 系统保留常量和特殊字符常量
- Python语言
- 阅读英文文档能力
最后,奉上英文和中文翻译的原文链接(当然最好还是养成阅读英文文档的习惯比较好)。
英文:https://github.com/robotframework/QuickStartGuide/blob/master/QuickStart.rst
中文翻译版:
http://www.cnblogs.com/txw1958/archive/2012/05/10/2494805.html
RF《Quick Start Guide》操作总结的更多相关文章
- QUICK START GUIDE
QUICK START GUIDE This page is a guide aimed at helping anyone set up a cheap radio scanner based on ...
- Akka Stream文档翻译:Quick Start Guide: Reactive Tweets
Quick Start Guide: Reactive Tweets 快速入门指南: Reactive Tweets (reactive tweets 大概可以理解为“响应式推文”,在此可以测试下GF ...
- RobotFramework 官方demo Quick Start Guide rst配置文件分析
RobotFramework官方demo Quick Start Guide rst配置文件分析 by:授客 QQ:1033553122 博客:http://blog.sina.com.c ...
- RobotFramework RobotFramework官方demo Quick Start Guide浅析
RobotFramework官方demo Quick Start Guide浅析 by:授客 QQ:1033553122 博客:http://blog.sina.com.cn/ishouk ...
- SlickUpload Quick Start Guide
Quick Start Guide The SlickUpload quick start demonstrates how to install SlickUpload in a new or ex ...
- pax3 quick start guide
pax3 quick start guide 外观图: 配置:1 * pax3 主机:2 * 吸嘴(一个平的,一个凸的):2 * 底盖(一个烟草的,一个烟膏的):3 * 过滤片:1 * USB充:1 ...
- quick start guide for XMEGA ADC
This is the quick start guide for the Analog to Digital Converter (ADC), with step-by-step instructi ...
- The Pragmatic Programmer Quick Reference Guide
1.关心你的技艺 Care About Your Craft 如果不在乎能否漂亮地开发出软件,你又为何要耗费生命去开发软件呢? 2.思考!你的工作 Think! About Your Work 关掉自 ...
- Robot Framework:RF中对时间操作的datetime库常用关键字
[转自:http://blog.csdn.net/r455678/article/details/52993765] 1.对固定日期进行操作,增加或减去单位时间或者时间段 2.对两个时间段进行操作 3 ...
随机推荐
- GO语言练习:channel 工程实例
1.工程代码 2.编译及运行 1.工程目录结构 $ tree cgss cgss ├── cgss.go └── src ├── cg │ ├── centerclient.go │ ├── ...
- supervisor、pm2、forever坐下来聊聊
supervisor 是开发环境用.或者用nodemon,node-dev 代替了supervisor 和 nodemon,它和coffeescript兼容最好. forever 管理多个站点,每个站 ...
- iOS音频AAC视频H264编码 推流最佳方案
iOS音频AAC视频H264编码 推流最佳方案 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1 功能概况 * 实现音视频的数据的采集 * 实现音视频数据的编码,视频编码成 ...
- [LintCode] Roman to Integer 罗马数字转化成整数
Given a roman numeral, convert it to an integer. The answer is guaranteed to be within the range fro ...
- HTML第二节课
表单 <form id="" name="" method="post/get" action=""> &l ...
- c#面向对象基础 重写、虚方法、抽象类
虚方法 抽象类与抽象方法 1.书写规范: 在类前面加上abstract关键字,就成为了抽象类:在一个方法前面加上abstract关键字,就成为了抽象方法(抽象方法不能有实现方法,直接在后面加分号) 例 ...
- 温故而知新 OOP
设计原则1: 找出应用中可能需要发生改变的地方,把它们独立出来,不要和那些不需要变化的代码混在一起换句话说,如果每次新的需求一来,都会使某方面的代码发生变化,此时你就可以确定,这部分代码属于不稳定代码 ...
- NY-字符串替换
描述编写一个程序实现将字符串中的所有"you"替换成"we" 输入 输入包含多行数据 每行数据是一个字符串,长度不超过1000 数据以EOF结束 输出 对于输入 ...
- c语言.大数的输出
转化成字符串,再用for循环输出: #include <stdio.h>#include <string.h>int main(){ char s[32]; int d, ...
- 8th 本周工作量及进度统计
本周PSP: C(类别) C(内容) S(开始时间) ST(结束时间) I(中断时间) T(实际时间) 活动 本周站立会议 -- -- -- 340 撰写博客 构建之法有感 22:10 23:44 3 ...