目录
一、测试环境
| Python | 3.7.2 |
| jsonpath | 0.82 |
| jsonschema | 3.2.0 |
| numpy | 1.21.6 |
| Pillow | 9.1.1 |
| PyMySQL | 1.0.2 |
| PyYAML | 6.0 |
| requests | 2.26.0 |
| robotframework | 4.1 |
| robotframework-requests | 0.9.3 |
| robotframework-ride | 1.7.4.2 |
| sqlparse | 0.4.2 |
| urllib3 | 1.26.9 |
| wxPython | 4.0.7 |
二、基本操作
>>>在RF中导入自定义库
要在RF中使用自己编写的小工具需要导入Library,如下图所示。
Mytools.py,AssertByDataBase.py均是自定义库

当然也可以导入变量,选择导入Variables,然后选择.py文件路径即可。

变量可以写在类中或者直接定义
# Variables.py
class BaseConfig:
"""基础环境变量"""
baseurl = "http://10.168.2.204:9095/api"
# 用于获取Token,以及测试全过程中登录使用的用户名、密码,密码需要经过Base64加密处理
login_username = "admin"
login_password = "e10adc3949ba59abbe56e057f20f883e"
# 默认的请求头
headers = {
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/95.0.4638.69 Safari/537.36"}
login_api = "/login"
在RF中使用变量
comment 使用BaseConfig类中的变量baseurl
log ${BaseConfig.baseurl}
comment 使用变量login_api
log ${login_api}
三、代码分层管理
这里记录的是我在工作中使用的分层管理方法,朋友们有更好的方法可以在评论区分享给我学习。(目前未实现数据驱动因此只分了3层,等我研究研究RF如何实现数据驱动再更新)
第一层:公共层
在该层级使用RobotFrameWork-requests模块提供的关键字进行封装,根据项目需要哪些方法就封装哪些方法。

>>>封装http请求
HttpRequest.txt中封装了get,post,delete,put方法用于发送对应的http请求(方法名后加u是为了防止与RobotFrameWork-requests提供的原关键字冲突),封装时根据项目需求可以直接进行响应状态码断言。
getu
[Arguments] ${interface} ${data}=
${token} get_token
&{headers} MyTools.Get Headers ${token}
Create Session addr ${BaseConfig.baseurl} headers=${headers} timeout=5000
${url} Catenate SEPARATOR= ${interface} ? ${data}
${res} GET On Session addr ${url}
Return From Keyword ${res}
>>>管理token
get_headers函数返回一个符合应用场景的headers用于http请求,首先在Variables.BaseConfig中定义一个默认的请求头,可以包含Contain-type,User-Agent等信息,当用户提供Token数据时将Token加入请求头,否则返回一个默认的请求头(根据不同项目的设计,有些登录接口一般不需要Token值)
get_token关键字直接使用post方法请求登录接口获取token值,获取到的token值可以作为参数传递给get_headers从而将Token加入请求头中
def get_headers(token=False):
"""
HTTP请求头,默认包含了Content-Type、User-Agent,若项目有其他需要可自行编辑headers中的内容。
:param token:类型为String或bool,若为 String则将其值作为HTTP请求头的Token值,否则返回默认的请求头内容。
:return: 用户定义的请求头内容。
"""
# 默认的HTTP请求头
headers = Variables.BaseConfig.headers
# 判断用户是否提供Token
if token:
# 将用户提供的Token加入HTTP请求头
headers["Token"] = token
# 返回最终的HTTP请求头
return headers
get_token
log 尝试获取TOKEN
${data} Create Dictionary username=${BaseConfig.login_username} password=${BaseConfig.login_password}
${headers} MyTools.Get Headers
Create Session addr ${BaseConfig.baseurl}
${res} POST On Session addr ${UserApi.apilogin} json=${data} headers=${headers}
${res_data} Get From Dictionary ${res.json()} data
${token} Get From Dictionary ${res_data} token
Return From Keyword ${token}
>>> 其他在RF中使用的自定义库
RF框架对For循环真的太不友好了,因此遇到一些复杂的逻辑还是习惯使用python封装成关键字,再去RF中调用,我会将这些关键字存放在common/Mytools.py中,例如数据库操作以及一些数据操作等。
第二层:请求层
在该层级中针对不同接口的特点发送HTTP请求,其封装目的是为了在用例层中调用,输入测试用例参数后返回请求结果并在第三层用于断言。(目前在该层出现大量重复性代码,正在考虑如何进一步封装)

第三层:用例层
在该层级中主要实现一下目标:
>>>初始化测试用例数据
大部分的接口都需要输入一定的参数,在此处初始化测试用例数据
使用正确的用户名密码进行登录
[Documentation] 用户名 = admin
... 密码 = 123456 \ (base64转码后为 :e10adc3949ba59abbe56e057f20f883e)
comment *****初始化测试用例******
${username} Set Variable admin
${password} Set Variable e10adc3949ba59abbe56e057f20f883e
>>>执行测试用例
通过请求层封装的关键字执行输入测试数据、执行测试用例并获取返回结果
comment *****执行测试用例********
${res} login ${username} ${password}
>>>测试结果断言
根据测试用例执行返回结果 与 预期结果进行比较 进行断言
Comment *****测试结果断言********
${res_data} Get From Dictionary ${res} data
${res_data_user} Get From Dictionary ${res_data} user
${req_username} Get From Dictionary ${res_data_user} username
${name} Get From Dictionary ${res_data_user} name
Should Be Equal ${req_username} ${username}
Should Be Equal ${name} 管理员
常用的断言关键字有:
| Should Be Equal | 参数1 == 参数2 |
| Should Be Equal As String | str(参数1) == str(参数2) |
| Should Contain | 参数1 in 参数2 |
当然还可以使用python自行编写关键字设定断言逻辑,使用assert进行断言,若断言失败则返回AssertionError。
本文详细介绍了如何在Robot Framework(RF)中导入自定义库,如Mytools.py和AssertByDataBase.py,以及如何通过代码分层管理实现http请求封装、token管理,并展示了用例层的测试流程,包括数据初始化、请求执行和结果断言。

283

被折叠的 条评论
为什么被折叠?



