Robot Framework 使用总结
最近项目上使用了RF快速实现了一些验收测试的自动化case,感觉不错,很好用,下面就记录一下使用RF实现自动化的过程。
什么是RF?
RF是一种测试框架,帮助测试人员在其框架下快速实现验收测试的自动化。提供很多的扩展库供你使用,在没有任何一种语言编程基础的情况下也能实现一些自动化测试用例。
说白了,任何一种框架的作用就是帮你完成一些基础的工作,使你更加关注于要测试的业务逻辑,而不是关心技术细节,这些技术细节包括用例如何运行、如何组织、日志怎么记录,怎么展现,如何与CI集成等等。
使用RF框架与Jenkins CI工具结合,可以很容易的实现测试的远程部署、运行与结果展现。比起重写造轮子,自己写一套系统,这种方式还是快得多,最适合刚刚起步的项目。
RF能做什么?
RF能做什么取决于使用什么样的扩展框架,RF提供的默认内置库与外部扩展库,当然也可以自己写扩展库来定制功能。基本提供的库已经可以满足一般的测试需求了,包括对手机端、网页端的自动化测试,还有API接口的测试。
编写RF文件
RF文件通常以robot为后缀名,并且提供了很多的编辑工具,方便的进行robot文件的编辑。我使用的是pycharm的RF插件进行编辑,因为需要使用python写大量的扩展库,所以在pycharm里面统一进行robot与py文件的编辑,还是很方便的。或者使用官方的RIDE也是很好的选择,纯图形化界面,方便团队没有开发经验的人参与其中。
RF文件的结构
先看一个RF文件示例: 
如上所示,一个RF文件通常包括三个节点:
Settings节点:
1. 设置此test suite的setup与tearndown操作
2. 此test suite 中每个test case的setup与tearndown操作
3. 指定测试模板test template
4. 指定此test suite引用的资源文件的位置
5. 使用Library关键字引用RF标准库,或者自定义库:

Test Cases节点:
1. 可以定义一个普通的测试用例
2. 也可以调用模板,并给模板传入它所需要的参数
3. 测试用例里面所调用的关键词可能来自下面三个地方:
* 当前test suite文件的keywords节点中定义的keyword
* Setttings节点指定的资源文件中所定义的keyword
* 内建的BuiltIn库中定义的keywordKeywords节点:
1. keyword可以理解为一个公用的方法,供test case使用
2. keyword可以传入参数,返回结果
3. RF也提供很多逻辑判断IF,循环FOR等关键词
Resource资源文件的结构
其实resource文件与普通robot文件没多大区别,只不过它是被导入的库文件,通常用来定义一些公用的变量和keywords:

编写自己的Library文件
RF运行使用很多语言编写自己的Library文件,这里选择python编写,首先看一下对已存在的库文件的扩展
对selenium2library库文件的扩展:
# 导入Selenium2Library模块
from Selenium2Library import Selenium2Library模块
from selenium.common.exceptions import StaleElementReferenceException
import time def _get_table_field_value(element, field):
return element.find_element_by_xpath("./td[@field='" + field + "']").text.strip() # 继承Selenium2Library
class CustomSeleniumLibrary(Selenium2Library):
def get_table_row_count(self, table_locator):
attempts = 0
while True:
try:
table = self._table_element_finder.find(self._current_browser(), table_locator)
return len(table.find_elements_by_xpath("./tbody/tr"))
except StaleElementReferenceException:
time.sleep(1)
if attempts >= 1:
raise AssertionError("Cell in table %s could not be found." % table_locator)
else:
pass
attempts += 1 def get_user_search_results(self, table_locator, row_index):
table = self._table_element_finder.find(self._current_browser(), table_locator)
ret = []
if table is not None:
rows = table.find_elements_by_xpath("./tbody/tr")
if len(rows) <= 0:
return None
row_index = int(row_index)
if len(rows)-1 < row_index:
raise AssertionError("The row index '%s' is large than row length '%s'." % (row_index, len(rows)))
for row in rows:
dic = {
'userId': _get_table_field_value(row, 'userId'),
'nickName': _get_table_field_value(row, 'nickName'),
'realName': _get_table_field_value(row, 'realName'),
'mobile': _get_table_field_value(row, 'mobile'),
'idNo': _get_table_field_value(row, 'idNo'),
'userType': _get_table_field_value(row, 'userType'),
'verifyUserStatus': _get_table_field_value(row, 'verifyUserStatus'),
'operator': _get_table_field_value(row, 'operater'),
'operateTime': _get_table_field_value(row, 'operateTime'),
}
ret.append(dic)
return ret[row_index]
else:
return None ...
创建全新的库文件:
# -*- coding: utf-8 -*- from libs.DB_utils.utils import *
from libs.request_utils import utils
from libs.request_utils import flow_task_manage
from libs.global_enum import *
from libs.model import user_search_result
from robot.libraries.BuiltIn import BuiltIn
import time class VerifyLibrary(object): def __init__(self, base_URL, username, dubbo_web_base_URL=None):
self.base_URL = base_URL
self.username = username
self.request_utils = utils.RequestUtil(base_URL, username)
self.flow_task_request_utils = flow_task_manage.FlowTaskManage(base_URL, username)
self.built_in = BuiltIn()
if dubbo_web_base_URL is not None:
self.dubbo_web_request_utils = utils.RequestUtil(dubbo_web_base_URL) def update_verify_user_role(self, email, dept_id, role_id, amount_limit=5000):
real_name = get_verify_user_name_by_email(email)
verify_user_id = get_verify_user_id_by_email(email)
self.request_utils.login()
response = self.request_utils.update_verify_user(real_name, verify_user_id, amount_limit, dept_id, role_id)
return response.json()
注意VerifyLibrary的构造函数,需要最少传入两个参数,这是在robot文件引用此库文件的时候传入的: 
RF框架与Jenkins CI集成
使用Jenkins来运行RF写的test case很简单,首先需要在Jenkins上安装RF扩展插件:

然后,使用pybot命令行去运行写好的RF测试用例:

最后执行完测试后,可以在jenkins上很好的解析出测试结果的走势与具体的每个build的测试结果:


Robot Framework 使用总结的更多相关文章
- Robot Framework用户手册 (版本:3.0)
版权信息:诺基亚网络和解决中心 本翻译尊重原协议,仅用于个人学习使用 1.开始: 1.1 介绍: Robot Framework是一个基于Python的,为终端测试和验收驱动开发(ATDD)的可扩展的 ...
- RIDE -- Robot Framework setup
RobotFramework 是一款基于python 的可以实现关键字驱动和数据驱动并能够生成比较漂亮的测试报告的一款测试框架 这里使用的环境是 python-2.7.10.amd64.msi RID ...
- Robot Framework自动化测试 ---视频与教程免费分享
当我第一次使用Robot Framework时,我是拒绝的.我跟老大说,我拒绝其实对于习惯了代码的自由,所以讨厌这种“填表格”式的脚本.老大说,Robot Framework使用简单,类库丰富,还可以 ...
- Robot Framework 的安装和配置(转载)
Robot Framework 的安装和配置 在使用 RF(Rebot framework)的时候需要 Python 或 Jython 环境,具体可根据自己的需求来确定.本文以在有 Python 的环 ...
- 解决从jenkins打开robot framework报告会提示‘Opening Robot Framework log failed ’的问题
最新的jenkins打开jenkins robot framework报告会提示如下 Verify that you have JavaScript enabled in your browser. ...
- 在centos7中安装Robot Framework
安装前景介绍: 最初,我们是在Windows环境下搭建Robot Framework来对我们的服务进行接口测试的(想知道如何在Windows下安装Robot Framework,可以参考我同事的博客h ...
- 移动端自动化环境搭建-Robot Framework的安装
A.安装依赖 RF框架,robotframework本身. B.安装过程 可以通过下载 exe 程序进行安装,Robot Framework 分别提供了,win-amd64.exe 和 win32.e ...
- robot framework 安装配置
robot framework 是一款专门用作自动化测试的框架,提供了丰富的内置库,与第三方库,也支持用户自己编写的库,robot framework +library 可以 用来做ui的自动化测试, ...
- Robot Framework入门学习1 安装部署详解
安装注意: 目前Robot framework-ride不支持python3,安装时请下载python2.7版本. Robot Framework安装时出现了一点小问题,网上没有找到直接的介绍,现将安 ...
- Robot Framework自动化测试(七)--- jybot模式
虽然,很久不用关于Robot Framework框架了,但我这里应该是除了@齐涛-道长之外分享Robot Framework 相关资料比较多的地方了.所以,常常被问到一些关于该框架的问题. 虽然,我一 ...
随机推荐
- mysql事务隔离级别测试
隔离性mysql提供了4种不同的隔离级别以支持多版本并发控制(MVCC)较低级别的隔离通常可以执行更高的并发,系统的开销也更低read uncommited(未提交读)read commited(提交 ...
- 利用全局变量$_SESSION和register_shutdown_function自定义会话处理
register_shutdown_function 可以注册一个自定义的函数,在程序运行结束之前 执行. 在做ecshop的二次开发过程中,虽然代码 太老太乱太冗余,但ec的会话处理的设计感觉还是不 ...
- (转)c#实现开机自启动
RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersio ...
- jQuery解析JSON出现SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data
SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data 我在使用$.parseJSON解析后 ...
- java - 只输出中文, 包含中文标点符号
在 Java 中直接使用Unicode 转码时会按照UTF-16LE 的方式拆分,并加上 BOM. 如果采用 UTF-16 拆分,在 Java 中默认采用带有 BOM 的 UTF-16BE 拆分. S ...
- 【树莓派】开机自启动脚本方法之一(.Desktop文件)
转载处: 又一个让树莓派开机运行Python脚本的方法 Linux 创建启动器(.Desktop文件) 首先,树莓派使用的是官方推荐的镜像:RASPBIAN: 在树莓派上常常会需要开机自启动pytho ...
- Python基础学习五 内置函数
1.函数补充: 1)函数返回值return可以有多个 2)补充示例: nums = [0,1,2,3,4,5,6,7,8] #如何将list里面的元素变为字符串类型 new_nums = [str(x ...
- Java虚拟机(一):JVM的运行机制
一.JVM启动流程 通过java +xxx(或javaw)启动java虚拟机 装载配置,会在当前路径中寻找jvm的config配置文件. 根据查找jvm.dll文件.这个文件就是java虚拟机的主要实 ...
- flask+jsonp跨域前后台交互(接口初体验)
1 # -*- coding: utf-8 -*- 2 from flask import Flask, jsonify 3 import psutil, time,json 4 5 app = Fl ...
- 轻量级的同步机制——volatile语义详解(可见性保证+禁止指令重排)
目录 1.关于volatile 2.语义一:内存可见性 2.1 一个例子 2.2 java的内存模型(JMM) 2.3 happens-before规则 2.4 volatile解决内存可见性问题的原 ...