本文概要:

废话不多说,本文将包括以下内容:

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包调用都可以按照这个套路实现

                                                                                                      ----------有时间陆续更新中

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐