Robot Framework 接口自动化测试 --- 从入门到架构设计
逐渐添加中.......
本文概要:
废话不多说,本文将包括以下内容:
1. 如何使用Robot Framework+RequestsLibrary发起最简单的http接口自动化 。
2. 如何不使用数据驱动的方式编写接口自动化用例,如何封装合适的关键字。
3. 如何使用数据驱动的方式编写自动化用例,各个数据源有哪些优缺点,数据的组装方式有哪些。
4. 断言如何封装才能做到框架编写者和框架使用者在难易度上的平衡。
5. 调用链自动化和单接口自动化分别适合怎样设计架构,如何做到事后分析更方便。
6. 怎么有效的利用Jenkins更合理的执行自动化。
7. 如何支持除了http接口外的其它接口类型,比如TCP,Websocket,CAN等等。
第一章:最简单,最基本的post请求
鉴于可能有朋友没有安装过Robot,我这里给一个简单的安装:
Robot安装:
首先安装python,最近版的或者次新版的都可以,目前建议3.8版本即可
其次分别在管理员权限的cmd下通过命令行分别执行以下命令,升级/安装对应的库:
python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install robotframework==3.1.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install robotframework-ride -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install robotframework-requests -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install robotframework-pabot -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install robotframework-databaselibrary -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install cx_oracle -i https://pypi.tuna.tsinghua.edu.cn/simple
都安装完了建议重启下电脑。
创建测试套,测试用例,引入Requests库:
在windows的“运行”中输入ride.py打开ride编辑器。
新建测试套:
测试套中引入RequestsLibrary:
这里注意大小写:
如果引入正确就是黑色的,如果是红色,说明引入有问题,需要去tools--view ride log去看原因:
在测试套上创建测试用例:
至此,准备工作已经完成。
创建session:
Ride下打开F5,选择RequestsLibrary,我们先看看如何创建一个Session:
我们主要看一下支持的参数:(参数和requests基本一致)
alias
用于识别会话的 Robot Framework 别名,简单说就是你给会话起了个名字
url
服务器的网址,会话这里一般包含请求地址和(端口号)即可
headers
默认请求,格式是字典,如果需要填写一般要填写请求类型
cookies
cookie,格式是字典,如果需要就添加
auth
HTTP 身份验证的用户名和密码,格式是列表(即[用户名, 密码]即可)
timeout
连接超时时间
proxies
映射协议或协议和主机到代理的 URL,格式是字典(例如 {'http':'foo.bar:3128',' http ://host.name':'foo.bar:4012'})
verify
是否验证 SSL 证书,如果需要,还要配置SSL证书路径
debug
启用会打印更多的信息
max_retries
每个连接应尝试的最大重试次数。默认情况下,它只会在连接错误的情况下重试 3次。如果设置为0,则不会重试。超过重试次数未连接成功,会抛出异常
disable_warnings
关闭请求的警告,建议打开
backoff_factor
在每次重试后引入更长的重试之间的延迟时间。例如。如果 backoff_factor 设置为 0.1,则尝试之间的睡眠时间将为:0.0、0.2、0.4,用来增加重试的成功率
retry_method_list
允许重试的大写 HTTP 方法列表。默认情况下,仅允许对被认为是幂等的 HTTP 请求方法进行重试(具有相同参数的多个请求以相同状态结束)。例如。设置为 ['POST', 'GET'] 以仅重试POST和GET类型的请求
retry_status_list
整数 HTTP 状态代码列表,如果返回,则尝试重试。例如。设置为 [502, 503] 以在返回这些状态时重试请求。max_retries 必须大于 0时才能使用此功能
其实写了这么多,只有别名和请求地址是必填的,根据需求填写
比如以下这个会话的建立,我们就只需要填写最基本的信息:
如何理解这个Session呢?其实,它提供了三个功能:
1. 为后面的请求提供了“容器”,之后多个请求都可以在这一个会话中发起
2. 保持状态,比如你创建了会话后,在会话上发起了login的接口请求并成功,后面所有在这个会话上的请求都是“已登录”状态的请求
3. 在会话中设置或获取的headers和cookies信息,在每次请求时都会使用,起到了“默认值”的效果
在已经创建的session上进行post请求:
同样的,我们先看看如何创建一个post请求:
创建post请求有两种,一种是直接请求,比如下面这种:
一种是在Session上进行请求:
这两个区别,打个比方,就像:
POST --- 用手捧水喝 (一次性)
Post on Session --- 用瓶子装水喝 (重复使用)
前者一般用于依赖请求的发起(比如通过查询接口查信息),后者一般用于接口请求需要重复发起的情况
我们也看一下Post on Session支持的参数:
alias
Session对象的别名(就是你上面创建的会话的别名)
uri
POST请求的地址
data
格式是字典,将被 urlencoded 并作为 POST 数据或二进制数据发送,一般作为原始正文内容发送,或作为大部分表单数据传递,如果files
也定义,文件描述符由 Get File For Streaming Upload 定义的路径进行检索
json
可以是字典或者json,其将被 json 编码并作为 POST 数据发送
params
要附加到 uri 的 url 参数(一般用不到)
headers
与请求一起使用的消息头,如果和Session的消息头的key重复了,会用新的value覆盖。如果是新增加的消息头内容,只在本次请求中生效
files
包含要 POST 到服务器的文件数据的文件名,格式是字典,需要Get File For Streaming Upload关键字配合
allow_redirects
布尔值。如果允许 POST/PUT/DELETE 重定向跟随,则设置为 True
timeout
连接超时时间
~~~~~~~~~~~~~~~~~~~~~~~~~~~~分隔符~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
提前更新点后期内容 ---- 通过Jpype调用jar包:
通过Jpype调用jar包:
我们虽然用python可以解决大部分接口测试问题,但是对接以java为基础的服务的时候,还是会遇到很多需要java逻辑处理数据的情况。对于这种需求,我们可以使用jpype调用对应的jar包的方法来解决:
安装流程:(以下以windows为例,Linux基本一致)
1. 在管理员权限下的cmd,使用 pip install JPype1 来安装jpype
2. 安装java的jre环境,这个大家都会
3. jpype需要VC环境,最方便的安装方式是VC_redist,安装文件一般叫VC_redist.x64.exe(当然也有x86的)
改造前的beanshell脚本: (此处以Oracle老牌中间件Tuxedo的调用为例)
//try{
//设置连接参数
JoltSession jsession;
JoltSessionAttributes sattr;
JoltRemoteService joltRemoteService;
System.setProperty("bea.jolt.encoding", "gbk");
String serverName = "VBGLISVR";
String serverHost = "//127.0.0.1:16931";
String userName = "";
String userPassword = "";
String appPassword = "";
String userRole = "";
String sendStr =
"调用入参,因安全问题已替换成现在文字";
String returnStr;
sattr = new JoltSessionAttributes();
//设置目标连接地址
sattr.setString(JoltSessionAttributes.APPADDRESS,serverHost);
//设置TimeOut时间
sattr.setInt(JoltSessionAttributes.IDLETIMEOUT, 10000);
//建立连接,初始化
jsession = new JoltSession(sattr,userName,userRole,userPassword,appPassword);
//连接服务VICKNSVR
joltRemoteService = new JoltRemoteService(serverName,jsession);
//发送数据
joltRemoteService.setString("STRING",sendStr);
joltRemoteService.call(null);
returnStr = joltRemoteService.getStringDef("STRING",null);
joltRemoteService.clear();
//打印返回报文
log.info("成功获取 返回报文:");
log.info(returnStr);
ResponseMessage = returnStr;
// } catch (Exception e) {
// log.info("出错:Tuxedo协议 错误信息:");
// log.info(e);
// }
改造后的python脚本:
#coding=utf-8
import jpype
def tuxedo_req_recv(host_ip_port,S_Name,xml):
if not jpype.isJVMStarted():
jpype.startJVM(classpath=['10CusLibrary\*']) #这里如果指定*,只是项目的根目录,要根据jar包存放目录更改
JoltRemoteService = jpype.JClass("bea.jolt.JoltRemoteService") #这里相当于java中的import
JoltSession = jpype.JClass("bea.jolt.JoltSession") #这里相当于java中的import
JoltSessionAttributes = jpype.JClass("bea.jolt.JoltSessionAttributes") #这里相当于java中的import
System = jpype.JClass("java.lang.System") #这里是为了设置jar的运行环境信息(其实也是import,不是所有的jar包调用都需要这个)
INFO=str(xml)
returnStr=str("")
System.setProperty("bea.jolt.encoding","GBK") #设置codeing的通用方法
joltSessionAttributes = JoltSessionAttributes() #相当于java的实例化
joltSessionAttributes.setString(JoltSessionAttributes.APPADDRESS,host_ip_port)
joltSessionAttributes.setInt(JoltSessionAttributes.IDLETIMEOUT,10000)
joltSession = JoltSession(joltSessionAttributes,"","","","") #相当于java的实例化
joltRemoteService = JoltRemoteService(S_Name,joltSession) #相当于java的实例化
joltRemoteService.setString("STRING",INFO)
joltRemoteService.call(None)
returnStr = joltRemoteService.getStringDef("STRING",None)
joltSession.endSession()
return returnStr
jpype.shutdownJVM()
具体实现都在上面python脚本注释里了,所有的jar包调用都可以按照这个套路实现
----------有时间陆续更新中
更多推荐
所有评论(0)