接口自动化测试中常遇的一些问题

 

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",

"26()及之后下单年前不发货","【两件装】","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美迪惠尔",

"tehuizhuangFanclfangke 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

 

 

posted @ 2021-11-11 18:01  BKY007-xzf  阅读(323)  评论(0)    收藏  举报