基于Java+HttpClient+TestNG的接口自动化测试框架(四)-------参数存取处理
在这里,我们可以看到,在url,header,param中,我们使用了${param_name}的形式,这些变量可以从我们的公共参数池中取得,而后面的verify,可以对返回值使用JSONPath来精准判定。而对于,save中的内容,我们可以将其存入公共参数池,供后面的接口进行调用。
/**
* 公共参数数据池(全局可用)
*/
private static Map<String, String> saveDatas = new HashMap<String, String>(); /**
* 替换符,如果数据中包含“${}”则会被替换成公共参数中存储的数据
*/
protected Pattern replaceParamPattern = Pattern.compile("\\$\\{(.*?)\\}"); /**
* 获取公共数据池中的数据
*
* @param key
* 公共数据的key
* @return 对应的value
*/
protected String getSaveData(String key) {
if ("".equals(key) || !saveDatas.containsKey(key)) {
return null;
} else {
return saveDatas.get(key);
}
}
protected void setSaveDatas(Map<String, String> map) {
saveDatas.putAll(map);
}
在使用过程中,我们可以将参数分为两类。第一类为全局参数,意思是可以将之前从xml中读取的配置,作为全局参数存入公共参数数据池,在整个接口测试运行的过程中均可进行调用。第二类是,接口过程中产生对的过程参数,即,接口A返回的数据,可以作为参数使用在接口B的请求中。这类参数在接口请求执行过程中进行定义,也存入公共参数池。
这两类参数,均使用${param_name}的形式进行调用。来看下面一段代码:
/**
* 取公共参数 并替换参数,处理${}
* @param param
* @return
*/
protected String getCommonParam(String param) {
if (stringUtil.isEmpty(param)) { //stringUtil后续进行说明
return "";
}
Matcher m = replaceParamPattern.matcher(param);// 取公共参数正则
while (m.find()) {
String replaceKey = m.group(1);
// 如果公共参数池中未能找到对应的值,该用例失败。
Assert.assertNotNull(replaceKey,
String.format("格式化参数失败,公共参数中找不到%s。", replaceKey));
String value;
// 从公共参数池中获取值
value = getSaveData(replaceKey);
//如果值不为空,则将参数替换为公共参数池里读取到的value的值。
if(null != value) {
param = param.replace(m.group(), value);
//如果值为空,则将参数替换为字符串“null”
}else {
param = param.replace(m.group(), "null");
}
}
return param;
}
这里使用了正则表达式来匹配参数中出现的${XXXX}形式的字符串。这一段的主要思想为,使用定义好的正则表达式来匹配param的字符串,如果匹配的到,则进行循环,把匹配到的第一个字符串(基本就是1个字符串)作为key,然后到saveData的Map中取得对应的值,并返回。
这样,我们就实现了使用${param_name}的形式,调用公共参数池的目的。
那么说完了“取参数”,我们还需要说一下“存参数”。在接口测试执行的过程中,假如我想把某个返回的值作为参数,存入公共参数池中,我们应该怎么做呢?
/**
* 提取json串中的值保存至公共池中
*
* @param json
* 将被提取的json串。
* @param allSave
* 所有将被保存的数据:xx=$.jsonpath.xx;将$.jsonpath.
* xx提取出来的值存放至公共池的xx中
*/
protected void saveResult(String json, String allSave) {
if (null == json || "".equals(json) || null == allSave
|| "".equals(allSave)) {
return;
}
allSave = getCommonParam(allSave);
String[] saves = allSave.split(";");
String key, value;
for (String save : saves) {
Pattern pattern = Pattern.compile("([^;=]*)=([^;]*)");
Matcher m = pattern.matcher(save.trim());
while (m.find()) {
key = getBuildValue(json, m.group(1)); //getBuildValue的方法后续说明
value = getBuildValue(json, m.group(2));
reportUtil.log(String.format("存储公共参数 %s值为:%s.", key, value));
saveDatas.put(key, value);
}
}
}
这里我们在save时,同样是通过正则表达式来进行匹配,具体的形式类似于 aa=$.Content.User 的形式,即变量名=JSONPath,将JSONPath找到的值来赋此变量,并存储到公共参数池中。
这里提到了一个getBuildValue的方法,具体的代码如下:
/**
* 获取格式化后的值
*
* @param sourchJson
* @param key
* @return
*/
private String getBuildValue(String sourchJson, String key) {
key = key.trim();
Matcher funMatch = funPattern.matcher(key); //funPattern为函数匹配正则表达式,后续进行说明
if (key.startsWith("$.")) {// 如果为JSONPath,获取该JSONPath对应的值(对象)
Object x = JSONPath.read(sourchJson, key);
//空值处理
if(x == null) {
key = (String)x;
}else {
key = x.toString();
}
//如果匹配到的是自定义函数,则先解析该自定义函数的参数,若该自定义函数的参数中有JSONPath,则对该JSONPath取值,并对应转成字符串对象。
} else if (funMatch.find()) {
String args = funMatch.group(2);
String[] argArr = args.split(",");
for (int index = 0; index < argArr.length; index++) {
String arg = argArr[index];
if (arg.startsWith("$.")) {
argArr[index] = JSONPath.read(sourchJson, arg).toString();
}
}
String value = functionUtil.getValue(funMatch.group(1), argArr); // functionUtil为自定义函数工具类,后续说明
key = stringUtil.replaceFirst(key, funMatch.group(), value);
}
return key;
}
那么,通过以上的代码,我们可以较为清晰的看到,我们设计了这个公共参数池,来对全局参数和过程参数进行管理,即可取也可存。方便了在之后的代码中进行调用。
在上面的代码中,我们出现了一个stringUtil的工具类,这算是一个字符串处理工具。请看以下代码:
public class stringUtil {
public static boolean isNotEmpty(String str) {
return null != str && !"".equals(str);
}
public static boolean isEmpty(String str) {
return null == str || "".equals(str);
}
/**
*
* @param sourceStr 待替换字符串
* @param matchStr 匹配字符串
* @param replaceStr 目标替换字符串
* @return
*/
public static String replaceFirst(String sourceStr,String matchStr,String replaceStr){
int index = sourceStr.indexOf(matchStr);
int matLength = matchStr.length();
int sourLength = sourceStr.length();
String beginStr = sourceStr.substring(0,index);
String endStr = sourceStr.substring(index+matLength,sourLength);
sourceStr = beginStr + replaceStr + endStr;
return sourceStr;
}
}
这个工具类中,写了判定字符串是否为空的方法,还有一个替换首个匹配字符串的方法。有兴趣的童鞋可以自行继续扩展。
基于Java+HttpClient+TestNG的接口自动化测试框架(四)-------参数存取处理的更多相关文章
- 基于Java+HttpClient+TestNG的接口自动化测试框架(八)------ 针对文件的处理
在实际的接口测试中,有时需要根据情况进行文件的上传和下载.在文件数量比较小的时候,我们当然可以直接处理(比如若干个接口都用一个文件).但是,如果我们上传的文件需要使用不同文件夹里不同的文件,而且数量又 ...
- Python 基于python实现的http接口自动化测试框架(含源码)
基于python实现的http+json协议接口自动化测试框架(含源码) by:授客 QQ:1033553122 欢迎加入软件性能测试交流 QQ群:7156436 由于篇幅问题,采用百度网 ...
- 手把手教你用Eclipse+TestNG搭建接口自动化测试框架
转载于:http://qa.blog.163.com/blog/static/190147002201510275306185/ 把群博里关于接口自动化的文章都看了一遍,都是关于测试过程中遇到的问题及 ...
- Eclipse+TestNG搭建接口自动化测试框架
一.环境安装 1.前提 安装好jdk 配置好Java环境变量 安装Eclips 这些网上都有,就不再详细介绍. 资源分享链接:http://pan.baidu.com/s/1v9Fw6 2.安装Tes ...
- 基于Python + requests 的web接口自动化测试框架
之前采用JMeter进行接口测试,每次给带新人进行培训比较麻烦,干脆用python实现,将代码和用例分离,易于维护. 项目背景 公司的软件采用B/S架构,进行数据存储.分析.管理 工具选择 pytho ...
- 接口自动化 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)
基于python实现的http+json协议接口自动化测试框架(实用改进版) by:授客 QQ:1033553122 欢迎加入软件性能测试交流QQ群:7156436 目录 1. ...
- Python 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)
目录 1. 写在前面 2. 开发环境 3. 大致流程 4. 框架简介 5. 运行结果展示 6. 文件与配置 7. 测试接口实例 n ...
- 接口自动化测试框架 -- reudom
reudom Automated testing framework based on requests and unittest interface. 基于 Unittest 和 Requests ...
- 基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport的接口自动化测试框架
接口自动化框架 项目说明 本框架是一套基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport而设计的数据驱动接口自动化测试框架,TestNG ...
随机推荐
- HDU 1698 Just a Hook (线段树模板题-区间求和)
Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of t ...
- JAVA核心知识点--打包 FatJar 方法小结
目录 什么是 FatJar 三种打包方法 1. 非遮蔽方法(Unshaded) 2. 遮蔽方法(Shaded) 3. 嵌套方法(Jar of Jars) 小结 参考阅读 原文地址:https://yq ...
- Vue中qs插件的使用
qs 是一个增加了一些安全性的查询字符串解析和序列化字符串的库. 在项目中使用命令行工具输入:npm install qs安装完成后在需要用到的组件中:import qs from ‘qs’具体使用中 ...
- 2018-2-13-win10-uwp-从Type使用构造
title author date CreateTime categories win10 uwp 从Type使用构造 lindexi 2018-2-13 17:23:3 +0800 2018-2-1 ...
- 前端vue——阿里图标的使用方法
阿里图标库的官方网址:https://www.iconfont.cn/ 使用前需要先登录,这里有三种登录方式,本人使用的是新浪微博登录 第一步:找到你需要的图标,点击添加入库 第二步:点击右上角的购物 ...
- 1.1 Lack of free swap space on zabbix_server (zabbix监控报错)
1.首先看一下内存 free -m 2.然后创建一个分区添加交换文件 mkdir /home/temp dd if=/dev/zero of=/home/temp/swap bs=1024 count ...
- 20191024-3 互评Alpha阶段作品——都是为了生活组
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9860 评价:都是为了生活组——All For Eating 基于NAB ...
- 【题解】NOIP2017逛公园(DP)
[题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...
- $Poj2054\ Color\ a\ Tree\ $ 贪心
$poj$ $Description$ 一颗树有 $n$ 个节点,这些节点被标号为:$1,2,3…n,$每个节点 $i$ 都有一个权值 $A[i]$. 现在要把这棵树的节点全部染色,染色的规则是: 根 ...
- win10纯净版安装及其常用软件集锦(2020新年湘岳阳万江波整理)
win10纯净版安装及其常用软件集锦 1.安装win10纯净版:链接:https://pan.baidu.com/s/1L9yl-LNxxDQbEN_TGswzcA 提取码:u0pt 2.安装WPS2 ...