从零学习基于Python的RobotFramework自动化
一、 Python基础
1) 版本差异
版本 |
编码 |
语法 |
其他 |
2.X |
ASCII |
try: raise TypeError, 类型错误" except TypeError, err: print err.message |
…… |
3.X |
UTF-8 |
try: raise TypeError("类型错误") except TypeError as err: print(err) |
去除不等于<> 去除long类型 新增bytes类型 |
2) 输入输出
text = input('Enter any content : ') #输入 print("Your input content is : %s" % text) #输出
=============== C:\Python37\python.exe E: /TestScript.py ====================== Enter any content : who am I. Your input content is : who am I.
____________________________________________________________________________________________
3) 分支循环
for i in range(10): #range(start, stop[, step]) if i % 2 == 0: print(i, end=' ')
=============== C:\Python37\python.exe E: /TestScript.py ====================== 0 2 4 6 8
____________________________________________________________________________________________
4) 数据类型
a = 123 #整型 int() b = '123' #字符串 str() c = [1, 2, 3] #列表 list() d = (1, 2, 3) #元组 tuple() e = {1, 2, 3} #集合 set() f = {'aa': 1, 'bb': 2} #字典 dict()
注意:
- 字符串、列表、元组均可以通过索引获取值,以及截取部分。例如:a[0] >>> 1,b[1:-]>>> '2'。
- 整型、字符串、元组数据不可变; 集合是无序唯一的; 字典中key必须唯一且与value成对。
____________________________________________________________________________________________
5) 函数方法
class Operation(): #类定义 def add(self, a, b): #方法定义 return a + b #返回结果 opt = Operation() #实例化类 print(opt.add(3, 5)) #调用类方法 =============== C:\Python37\python.exe E: /TestScript.py ====================== 8
____________________________________________________________________________________________
6) 模块导入
from robot.api import logger import configparser
____________________________________________________________________________________________
7) 异常报错
² KeyboardInterrupt Ctrl+C被按下
² AttributeError 试图访问对象没有的属性(比如foo没有属性x,却试图访问foo.x)
² IOError 输入/输出异常(一般是无法打开文件)
² ImportError 无法引入模块或包(一般是名称或路径错误,或者是无此第三方包)
² IndentationError 语法错误(一般是代码没有正确对齐)
² SyntaxError 代码非法,代码不能编译(一般是语法错误,写错了)
² NameError 使用一个还未被赋予对象的变量
² IndexError 下标索引超出序列边界,(比如f只有3个元素,却试图访问f[5])
² TypeError 传入对象类型与要求的不符合
² KeyError 试图访问字典里不存在的键
² ValueError 传入一个调用者不期望的值
二、 RobotFramework基础
1) 版本差异
版本 |
安装 |
支持 |
运行 |
其他 |
1.5.X之前 |
wxPython2.8.x |
Pyhton2.x |
pybat |
…… |
1.7.X之后 |
wxPython4.0.x |
Pyhton2.x |
robot |
新增debug模式 |
2) 输入输出
Import Library Dialogs ${username} = Get Value From User Input user name default Log ${username} ======================================================= 20190724 12:37:36.010 : INFO : ${username} = zhangsir 20190724 12:37:36.010 : INFO : zhangsir
_________________________________________________________________________________
3) 分支循环
FOR ${i} IN RANGE 5 Run Keyword If ${i}%2==0 Log ${i}
END ======================================================= 20190724 12:51:55.658 : INFO : 0 20190724 12:51:55.658 : INFO : 2 20190724 12:51:55.658 : INFO : 4
________________________________________________________________________________
4) 数据类型
${a}= Set Variable ${123} ${b}= Set Variable 123 @{c}= Create List 1 2 3 &{d}= Create Dictionary aa=1 bb=2 cc=3 ======================================================= 20190724 13:44:11.701 : INFO : ${a} = 123 20190724 13:44:11.717 : INFO : ${b} = 123 20190724 13:44:11.717 : INFO : @{c} = [ 1 | 2 | 3 ] 20190724 13:44:11.717 : INFO : &{d} = { aa=1 | bb=2 | cc=3 } 20190724 13:44:11.717 : INFO : 123 20190724 13:44:11.717 : INFO : 123 20190724 13:44:11.717 : INFO : ['1', '2', '3'] 20190724 13:44:11.717 : INFO : {'aa': '1', 'bb': '2', 'cc': '3'}
________________________________________________________________________________
5) 函数方法
*** Keywords *** Library MyLibrary
*** Keywords *** Query Redis String [Arguments] ${key} ${db}=8 ${conn} Connected To Redis ${db} ${result} Get From Redis ${conn} ${key} [Return] ${result}
________________________________________________________________________________
6) 模块导入
Import Library MyLibrary
Import Resource BasicResource.robot
Import Variables ${adultCode}
________________________________________________________________________________
7) 异常报错
======================================================= 20190724 14:08:07.692 : INFO : 123 20190724 14:08:07.692 : FAIL : Replacing variables from setting 'Variables' failed: Variable '${test}' not found. Did you mean: ${TEST_TAGS} ${TEST_NAME} 20190724 14:08:07.692 : DEBUG : Traceback (most recent call last): None
三、 RobotFramework常用关键字
1) Evaluate关键字
以Python模式计算指定的表达式并返回结果。
-
- ${random} = Evaluate random.randint(0, sys.maxint) modules=random, sys
2) Should系列关键字
用于判断校验测试结果。
-
-
Should Be Empty:如果指定对象不为空则失败(反之Should Not …)。
-
Should Be Equal:如果指定对象不相等则失败(反之Should Not …)。
-
Should Be True:如果指定条件不成立则失败(反之Should Not …)。
-
Should Contain:如果指定对象不包含则失败(反之Should Not …)。
-
……
-
3) Convert系列关键字
用于数据的类型转换。
-
-
Convert To Integer:将指定项转换为整数。
-
Convert To Number:将指定项转换为浮点数。
-
Convert To String:将指定项转换为unicode字符串。
-
……
-
4) Run Keyword系列关键字
根据判断条件的真假执行关键字
-
-
Run Keyword If:如果条件为真,则使用指定的参数运行指定的关键字。
-
Run Keyword Unless:如果条件为假,则使用指定的参数运行指定的关键字。
-
Run Keyword:使用指定的参数执行指定的关键字。
-
Run Keywords:按顺序执行所有指定的关键字(使用AND连接)。
- ……
-
5) Get系列关键字
根据关键字作用获取值。
-
-
Get Count:返回item1中出现item2的次数。
-
Get Length:返回指定项的长度。
-
Get Time:返回指定格式时间。
-
……
-
6) Set系列关键字
设置参数或变量。
-
-
Set Variable:设置变量。
-
Set Variable If:根据指定条件设置变量。
-
Set Log Level:设置日志登记。
-
……
-
7) 其他关键字
-
-
Sleep:强制休眠指定时间(秒)。
-
Catenate:连接多个字符串(默认有空格)。
-
Call Method:使用提供的参数调用指定对象的方法。
-
Exit For Loop If:如果条件为真,则结束FOR循环。
-
四、 RobotFramework安装
1) 安装Python3.x
首先运行python-3.7.3-amd64.exe,勾选“Add Path…”,最好选择自定义安装在根目录。
然后打开DOS命令窗口,分别输入python --version和pip –version,显示对应判断则安装成功。
2) 安装相关模块
pip install redis
pip install pysolr
pip install pymysql
pip install robotframework
pip install robotframework-ride
pip install robotframework-requests # 用于接口测试
pip install robotframework-databaselibrary # 用于数据库测试
3) 自定义库管理
把自定义文件包放到Python目录下Lib/site-packages即可。
4) 常见错误处理
- 运行RF3.X报错,提示信息“python2.x调用失败”?
这是由于你之前安装过RF2.X,切换到RF3.X后数据文件未清除导致。
请在系统盘搜索librarykeywords.db文件并删除(AppData\Roaming\RobotFramework\ride),重启RIDE。
- 运行RF3.X报错,提示信息“找不到pybat”?
这是因为RF3.X去除了pybat模式,合并到了robot模式。请更改执行模式为robot,并更改用例文件格式为.robot。
五、 日期时间处理
1) 日期格式
l 常见形式: 2019-07-20 18:45:18(格式化"%Y-%m-%d %H:%M:%S")
l Solr库: 2019-07-20T18:45:18Z(格式化"%Y-%m-%dT%H:%M:%SZ")
l Redis库: Jul 7, 2019 6:45:18 PM(格式化"%b %d, %Y %I:%M:%S %p")
l MySQL库: datetime.datetime(2019, 7, 20, 18, 45, 18)
l 含毫秒: 2019-07-20 18:45:18.000(格式化"%Y-%m-%d %H:%M:%S.%f")
l 时间戳: 1564453476000
l 其他: 20190720184518(格式化"%Y%m%d%H%M%S")
2) 处理方法
※ Convert Date:转换日期格式,可指定输入输出格式(epoch表示时间戳)。
参数:
date: 日期字符串
result_format: 返回的日期格式,
exclude_millis: 是否舍去毫秒
date_format: 格式化的日期格式
示例:
| Convert Date | 2014-05-28 12:05:03.111 | result_format=epoch | #返回'1401267903.111' |
| Convert Date | Jul 7, 2019 6:45:18 PM | date_format=%b %d, %Y %I:%M:%S %p | #返回'2014-05-28 12:05:03'|
※ Get Current Date:获取当前日期时间,可指定输出格式。
参数:
time_zone:获取此时区的当前时间(目前仅支持本地和UTC)
increment:设置返回日期时间增量,可为负数
result_format:返回日期的格式。
exclude_millis:是否舍去毫秒
示例:
| Get Current Date | result_format=%Y-%m-%d | #返回当天日期 |
六、 JSON处理
1) 标准格式
{
"key1": {
"key2": 123,
"key3": "123",
"key4": [1, 2, 3],
"key5": {"key": "value"}
},
"key6": true,
"key7": null
}
2) 处理方法
※ Get Json Value:获取JSON中指定目标节点值。
参数:
json_string:JSON文档
json_pointer:JSON节点
示例:
| ${result}= | Get Json Value | {"foo": {"bar": [1,2,3]}} | /foo/bar |
| Should Be Equal | ${result} | [1, 2, 3] |
※ Set Json Value:设置JSON中指定目标节点值。
参数:
json_string:JSON文档
json_pointer:JSON节点
json_value:JSON值
示例:
| ${result}= | Set Json Value | {"foo": {"bar": [1,2,3]}} | /foo | 123 |
| Should Be Equal | ${result} | {"foo": 123} |
七、 Jenkins集成