接口自动化测试中常遇的一些问题
1. POST参数处理
1.1. timestamp参数
方法一:
import java.util.*;
import java.text.SimpleDateFormat;
timestamp_value="${__time(YMDHMS,)}";
log.info("当前获取的系统系统时间:" +timestamp_value);
vars.put("current_time",timestamp_value.replaceAll("-", "").replaceAll(":", "")); //用于时间戳
String Ttime=(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
String Tdate=Ttime.substring(0,10); //截取出来 日期
String str1_time1=Tdate+" 09:30:10"; //开始日期
String str2_time2=Tdate+" 18:30:00"; //截止日期
vars.put("start_time1",str1_time1); //用于数据库查询时传递用的开始时间
vars.put("end_time2",str2_time2); //用于数据库查询时传递用的截止时间
方法二:
import java.util.*;
import java.lang.*;
import java.text.SimpleDateFormat;
Date newTime = new Date();
long timestamp = newTime.getTime();
vars.putObject("timestamp", newTime.getTime());
1.2. 数组格式参数,从数据库中读取数据来传递 post中的数组
范例:
{"appId":36690389776,
"appKey":"YTiMVUIxYOZx",
"apiv":"1.0.0",
"security":99,
"timestamp":"20210315152355",
"orderNoList":["OJY20210315000000092172582",
"OJY20210315000000092163331",
"OJY20210315000000092154382",
"OJY20210315000000092148491",
"OJY20210315000000092145277",
"OJY20210315000000092141867",
"OJY20210315000000092138909",
"OJY20210315000000092135866",
"OJY20210315000000092133088",
"OJY20210315000000092131500"],
"sign":"D4560916C519357F6FBBE85DD76AE129"}

jdbc:mysql://172.16.51.3:51968/orion-ofc-order-basic



从jdbc请求中获取数组格式的 数据脚本如下:
import sun.misc.*;
import java.util.ArrayList;
List list = new ArrayList();
for (int i = 1; i <= ${order_no_#}; i++){
//String s = vars.get("order_no_"+i).toString();
String s = "\""+vars.get("order_no_"+i).toString()+"\"";
list.add(s);
}
log.info("sql打印结果:" + list);
vars.putObject("orderNoList_object",list);
1.3. 通过随机数组来选择 下拉框从 一堆数据中随机来获取一个数据来传参

import java.util.*;
import java.text.SimpleDateFormat;
String[] test_itemName={"Amore爱茉莉","Balea芭乐雅","【特惠装】","Preferred Nutrition",
"【2月6日(含)及之后下单年前不发货","【两件装】","Thermos膳魔师","anello 涤纶帆布",
"Pigeon贝亲","Karen Murrell","Benefit贝玲妃","SKATER斯凯达","PANDORA潘多拉","Goodfeel好感觉",
"Clinique倩碧","GNC健安喜","GAYA 泰国","Sunlife","THE BODY SHOP","Calvin Klein",
"LANVIN浪凡","Mistine 羽翼粉","Doppelherz双心","Thompson's汤普森",
"Aptamil爱他美","Crabtree&Evelyn瑰珀翠","L'OCCITANE欧舒丹","Swisse瑞思","Vitabiotics","Mediheal美迪惠尔",
"【tehuizhuang】Fanclfangke heijiangrekongwan 120li","【maiyizengyi】","Paldobadao","Amoreaimoli","【liangbaozhuang】","Aptamilaitamei(xinxilan)","Earth Mamadiqiumama baobaohutungao 60g"
};
int N=${__Random(1,37,)};
vars.put("my_itemName",test_itemName[N]); //查询条件 商品名称 参数化
String[] test_itemId={"14818711","13793114","13064951","15060231","15577720","15080425",
"36690776909","35259281","36690850985","58664727","58696814","36690838305",
"36690837472","36690835510","36690835022","36690834872","36690834645","36690824339",
"36690823121","36690713695","18696155","36690692520","36690691927","36690691633",
"36690682611","13457286","36690657882","36690657225","10646705","36690652954"
};
int M=${__Random(1,30,)};
//String b=test_itemId[M];
//int itemId=Integer.valueOf(b);
vars.put("my_itemId",test_itemId[M]); //精确查询商品ID
//log.info("公司名称:"+test_itemID[N]);
1.4. 格式转换 json数组 到 字符串
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.*;
Map map = new HashMap();
map.put("logisticsCompany","顺丰");
map.put("logisticsNo","SF20200518156132113132132");
map.put("shippingTime","2020-02-26 08:18:19");
map.put("shippingUser","张莹莹");
map.put("sourceOrderNo","IMS2020011278588459-1A030");
//转换字符串
//String jsonmap1 = JSON.toJSONString(map);
//转换为json数组
List myList = new LinkedList();
myList.add(map);
String mystringbody = JSON.toJSONString(myList);
//vars.putObject("body_data",myList);
vars.put("body_data",mystringbody);
log.info("body_data:"+ mystringbody);
1.5. Post数据内容转义


import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.*;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.*;
int n=2;
List myList = new LinkedList();
for(i=0;i<n;i++)
{
Map map = new HashMap();
map.put("logisticsCompany","顺丰");
map.put("logisticsNo","SF"+"${current_time}"+"${__RandomString(12,0123456789,)}"+i);
map.put("shippingTime","${test_time}");
map.put("shippingUser","张莹莹");
map.put("sourceOrderNo","${sourceOrderNo_data}");
//添加到 数组中
myList.add(map);
}
//map数组 转换为 字符串格式
String mystringbody = JSON.toJSONString(myList);
//添加转义符
mystringbody=StringEscapeUtils.escapeJson(mystringbody);
//vars.putObject("body_data",myList);
vars.put("body_data",mystringbody);
log.info("body_data:"+ mystringbody);
1.6. 定义一个固定的字符串类型(转义过的json数组)
对固定的数据格式 进行转义
https://www.json.cn/json/jsonzip.html
import java.util.*;
import java.lang.*;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import xyz.onion.microservice.framework.common.utils.security.OnionSecuritySignUtils;
import com.alibaba.fastjson.JSONArray;
String jsonArryStr ="[{\"skuNo\":\"skuNo_028031\",\"barcode\":\"tiaoma_408117\",\"qty\":100},{\"skuNo\":\"skuNoa1\",\"barcode\":\"barcodea1\",\"qty\":100},{\"skuNo\":\"skuNo880\",\"barcode\":\"barcode880\",\"qty\":100},{\"skuNo\":\"skuNo870\",\"barcode\":\"barcode870\",\"qty\":100}]”;
//转换成json数组格式
JSONArray jsonArray = JSONArray.parseArray(jsonArryStr);
//加入map参数项中
map.put("details",jsonArray);

2. Token传参


3. 获取响应结果方法
方法一:
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject
String jsonContent = prev.getResponseDataAsString();
JSONObject response = new JSONObject(jsonContent);
JSONArray groups =
response.getJSONObject("priorityGroups").getJSONArray("groups"); String strGroups = groups.toString();
方法二:
正则提取器提取
Json提取器提取
4. Mock服务
下载地址 https://github.com/dreamhead/moco
获取moco-runner-1.1.0-standalone.jar 文件
本地创建一个json文件例如(omall_updateStocks.json),文件内容如下:
[
{
"response": {
"text": "call succsed!!!"
}
}
]
帮助手册:https://github.com/dreamhead/moco/tree/master/moco-doc
其他配置使用参考:
https://blog.csdn.net/yishi_c/article/details/106849388

开启CMD命令行窗口,运行
C:\Users\Administrator\Desktop> java -jar F:\mock_test\moco-runner-1.1.0-standalone.jar http -p 12345 -c F:\mock_test\omall_updateStocks.json
Java -jar 指定目录下的jar包名 http -p 自定义端口号 -c 制定文件目录下的json文件
开启服务

本地浏览器访问 http://172.16.110.24:12345/
如果是 测试环境中要调用这个mock服务,需要部署在 被测环境中,同被测系统 部署同一个地方。


5. 断言方法

import org.json.*;
import java.util.Arrays;
2个整形或浮点型 断言
if(${request_uid}!=${response_uid})
{
Failure=true;
Failuremessage=" 请求的uid 与 响应的 uid不一致,断言失败!"
log.info("请求的uid:"+${request_uid);
log.info("响应的uid:"+${response_uid);
}
//断言 响应的数据 与 请求的 uid保持一致!
//这里断言的 参数都是 可变的,并不是 写死的
字符串内容断言
if(history == "")
{
Failure = true;
FailureMessage = "连接数据库失败或者数据库内没有历史数据";
//调用Gson提供的Json对象euqals方法判断是否一致
}else if(responseObj.equals(historyObj) == false)
{
//把断言失败置为真
Failure = true;
FailureMessage = "和历史数据不匹配";
}
6. 钉钉消息配置
Python脚本
#! usr/bin/python
#coding=utf-8
#!/bin/bash
import urllib
import urllib2
import json
#import sys
import socket
import os
import commands
#发送钉钉消息
def sendDingDingMessage(url, data):
req = urllib2.Request(url)
req.add_header("Content-Type", "application/json; charset=utf-8")
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
response = opener.open(req, json.dumps(data))
return response.read()
#输出 最新日期的文件名 TestStatisticsReport*.html
(status, output) = commands.getstatusoutput("for i in `find /my_test2019/apache-jmeter-5.0/jmeter_test_report/html/TestStatisticsReport*.html -maxdepth 30 -type f|tail -n 1`; do basename $i; done")
str1=str(output)
print str1
#输出 最新日期的文件名 TestReportDetail*.html
(status, output) = commands.getstatusoutput("for i in `find /my_test2019/apache-jmeter-5.0/jmeter_test_report/html/TestReportDetail*.html -maxdepth 30 -type f|tail -n 1`; do basename $i; done")
str2=str(output)
print str2
#主函数
def main():
posturl = "https://oapi.dingtalk.com/robot/send?access_token=19b061ba0c073989e7f2f98aaafd9ede41be6b9e219a989a1c1de77772f5256a"
data = {"msgtype": "markdown", "markdown": {"text": 'Jmeter interface automation 接口测试汇总报告&接口测试详情报告如下:' + '\n\n' + "http://172.16.50.239:8090/"+str1 +
'\n\n' + "http://172.16.50.239:8090/"+str2 + '\n\n',
"title": "Jmeter"},"at":{"isAtAll": "false"}}
sendDingDingMessage(posturl, data)
if __name__ == '__main__':
main()
7. Nginx配置
cd /etc/nginx
vim nginx.conf
Systemctl stop firewall.service
cd /usr/sbin
./nginx


浙公网安备 33010602011771号