基础知识

  • testng重试
    实现方法,增加MtxRetryAnalyzer类,使用时@Test(retryAnalyzer = MtxRetryAnalyzer.class)
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;public class MtxRetryAnalyzer implements IRetryAnalyzer {//implements 代表实现IRetryAnalyzer接口private int retryCountMtx = 0;private final int MAX_RETRY_COUNT = 3;@Overridepublic boolean retry(ITestResult iTestResult) {//0 1  2   3 < 3if (retryCountMtx < MAX_RETRY_COUNT) {retryCountMtx++;return true;}return false;}
}

测试用例

import org.testng.Assert;
import org.testng.annotations.Test;
public class MtxTest5 {@Test(retryAnalyzer = MtxRetryAnalyzer.class)public void loginSuccessTest(){Assert.fail();}@Test(invocationCount = 3) //跑3次
public void loginSuccessTest(){Assert.fail();}
}
  • testNG

实现封装

  1. 最原始的代码
import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.testng.annotations.Test;
@Test
public void run(){RestAssured.baseURI = "http://www.mtxshop.com:7002";//定义baseURIRequestSpecification request = RestAssured.given();//创建请求对象request.header("uuid","56573820-d6ea-11eb-a2ff-77778112c882");request.formParam("username", "rainbow2");request.formParam("password", "e10adc3949ba59abbe56e057f20f883e");request.formParam("captcha", "1512");request.formParam("uuid", "56573820-d6ea-11eb-a2ff-77778112c882");request.log().all();//打印请求日志Response response = request.post("/passport/login");//发起请求,获取应答response.then().log().all();//打印应答日志String loginResponseStr = response.asString();String path = "$.access_token";String token = JsonPathUtil.extract(loginResponseStr, path).toString();System.out.println("token=======" + token);}
  1. 第一次优化
import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;String baseURIStr = "http://www.mtxshop.com:7002";String urlStr = "/passport/login";String uuidStr = TestDataUtil.getUUID();Map<String, String> headersMap = new HashMap<>();headersMap.put("uuid", uuidStr);Map<String, String> paramsMap = new HashMap<>();paramsMap.put("username", "rainbow2");paramsMap.put("password", "e10adc3949ba59abbe56e057f20f883e");paramsMap.put("captcha", "1512");paramsMap.put("uuid", uuidStr);//"56573820-d6ea-11eb-a2ff-77778112c882"RestAssured.baseURI = baseURIStr;//定义baseURIRequestSpecification request = RestAssured.given();//创建请求对象/*for (Map.Entry<String, String> header : headers.entrySet()) {request.header(header.getKey(), header.getValue());}*/request.headers(headersMap)/*for (Map.Entry<String, String> param : params.entrySet()) {request.formParam(param.getKey(), param.getValue());//添加表单参数}*/request.formParams(paramsMap)request.log().all();//打印请求日志Response response = request.post(urlStr);//发起请求,获取应答response.then().log().all();//打印应答日志String loginResponseStr = response.asString();String path = "$.access_token";String token = JsonPathUtil.extract(loginResponseStr, path).toString();System.out.println("token=======" + token);
  1. 第二次优化

将请求部分封装

   public static String post(String baseURIStr, String urlStr, Map<String, String> headers, Map<String, String> params) {RestAssured.baseURI = baseURIStr;//定义baseURIRequestSpecification request = RestAssured.given();//创建请求对象
/*        for (Map.Entry<String, String> header : headers.entrySet()) {request.header(header.getKey(), header.getValue());}*/request.headers(headers);
/*        for (Map.Entry<String, String> param : params.entrySet()) {request.formParam(param.getKey(), param.getValue());//添加表单参数}*/request.formParams(params);request.log().all();//打印请求日志Response response = request.post(urlStr);//发起请求,获取应答response.then().log().all();//打印应答日志return response.asString();//将应答报体转成String}
        String baseURIStr = "http://www.mtxshop.com:7002";String urlStr = "/passport/login";String uuidStr = TestDataUtil.getUUID();Map<String, String> headersMap = new HashMap<>();headersMap.put("uuid", uuidStr);Map<String, String> paramsMap = new HashMap<>();paramsMap.put("username", "rainbow2");paramsMap.put("password", "e10adc3949ba59abbe56e057f20f883e");paramsMap.put("captcha", "1512");paramsMap.put("uuid", uuidStr);//"56573820-d6ea-11eb-a2ff-77778112c882"String loginResponseStr = post(baseURIStr, urlStr, headersMap, paramsMap);String path = "$.access_token";String token = JsonPathUtil.extract(loginResponseStr, path).toString();System.out.println("token=======" + token);

4.封装(重复使用的部分,高内聚,低耦合)
java中静态方法中调用非静态方法

public class MtxClient {public static String baseURI;public static String url;public static Map<String,String> headers = new HashMap<>();//报头public static Map<String,String> cookies = new HashMap<>();//cookiespublic static Map<String,String> params = new HashMap<>();//报体public static Response response;  //MtxClient.response//构造函数public MtxClient(String baseURI,String url,Map<String,String> headers,Map<String,String> params){if( !baseURI.isEmpty()  &&   !url.isEmpty() ){this.baseURI = baseURI;this.url = url;if(headers.size() >0 ){this.headers = headers;}if(params.size() >0){this.params = params;}}//写一个方法
public Response sendHttp(String methodHttp) {//非静态方法,调用时需要new 对象RequestSpecification request = RestAssured.given();request.baseUri(baseURI);if (headers.size() > 0) {request.headers(headers);if(!params.isEmpty()){request.formParams(params);}}if(cookies.size()>0){request.cookies(cookies);}String methodHttpLower = methodHttp.trim().toLowerCase();//统一化//分支switch (methodHttpLower) {case "post":response = request.post(url);break;default:logger.info("HTTP协议暂未提供该方法的实现~");break;}headers.clear();params.clear();return response;}}
public class MtxClientBuyer {//定义成员变量public static final String BASE_BUYER_URI = "http://www.mtxshop.com:7002";public static final String LOGIN_URL = "/passport/login";public static final String UUID = TestDataUtil.getUUID();public static final String CAPTCHA = "1512";public static final String TOKEN_JSON_PATH = "$.access_token";public static String token = "";public static void login(String username,String password){Map<String,String> headers =new HashMap<>();headers.put("uuid",UUID);Map<String, String> paramsMap = new HashMap<>();paramsMap.put("username", username);paramsMap.put("password", password);paramsMap.put("captcha", "1512");paramsMap.put("uuid", UUID);//"56573820-d6ea-11eb-a2ff-77778112c882"MtxClient mtxClient = new MtxClient(BASE_BUYER_URI,LOGIN_URL,headers,params);MtxClient.response  = mtxClient.sendHttp("post");//非静态方法,不可以直接MtxClient..sendHttp("post");Response responseLogin = MtxClient.response;token = JsonPathUtil.extract(responseLogin.asString(),TOKEN_JSON_PATH).toString();   }
}    
    @Testpublic void test02_login(){login("rainbow2","e10adc3949ba59abbe56e057f20f883e")}

日志集成

依赖包

    <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

log4j.properties(放置在resources目录下)

log4j.rootLogger = info,rootFile,console
log4j.logger.org.apache.http = OFF
log4j.logger.freemarker.cache =OFF

#日志文件 log4j.appender.rootFile=org.apache.log4j.RollingFileAppender log4j.appender.rootFile.File=logs/clientlog/info.log
log4j.appender.rootFile.Encoding=UTF8
log4j.appender.rootFile.MaxFileSize=2000KB
log4j.appender.rootFile.MaxBackupIndex=30
log4j.appender.rootFile.Threshold=DEBUG
log4j.appender.rootFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rootFile.layout.ConversionPattern=[mtx-api-test]
%d{yyyy/MM/dd HH:mm:s} %x %5p %t %c:%L - %m %n

#控制台 log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[mtx-api-test]
%d{yyyy/MM/dd HH:mm:s} %x %5p %t %c:%L - %m %n

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class LoggerStudy {private static Log log = LogFactory.getLog(LoggerStudy.class);//定义当前类的日志对象成员变量public static void main(String[] args) {String text = "mtx";log.info("this is info :"+text);//中log.debug("this is debug:"+text);//低log.error("this is error:"+text);//高}
}
import org.apache.log4j.Logger;public class LoggerStudy2 {private static Logger log = Logger.getLogger(LoggerStudy2.class);public static void main(String[] args) {String text = "mtx";log.info("this is info :"+text);//中log.debug("this is debug:"+text);//低log.error("this is error:"+text);//高}
}

常用测试数据

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;/*** @ClassName TestDataUtil* @Description TODO* @Author 彩虹rainbow  QQ3130978832* @Date-Time 2022/3/7 9:36* @ProjectName Mtx202201* @Copyright 北京码同学网络科技有限公司**/
public class TestDataUtil {public static String getUUID(){return UUID.randomUUID().toString();}public static String getTimeByFormat(String formatStr){SimpleDateFormat sdf  = new SimpleDateFormat();//定义格式化时间对象if( formatStr.isEmpty() ){formatStr = "yyyyMMddHHmmss";}sdf.applyPattern(formatStr);Date date = new Date();//定义当前时间对象return sdf.format(date);}public static String getTimeByFormat(){return getTimeByFormat("");}public static String phoneRand(){Random random = new Random();//定义随机数对象StringBuilder stringBuilder = new StringBuilder();//定义变长字符串对象String[] phoneSegment = {"130","134","135","136","137","138","139","147","150","151","152","157","158","159","182","183","184","186","187","188"};stringBuilder.append( phoneSegment[random.nextInt(phoneSegment.length)] );//[0,length-1]for (int i=0;i<8;i++){stringBuilder.append(random.nextInt(10));//[0,10)}return stringBuilder.toString();}public static String nameRand(){Random random = new Random();//定义随机数对象randomStringBuilder stringBuilder = new StringBuilder();//定义变长字符串对象stringBuilderString[] xing = {"赵","钱","孙","李","周","吴","郑","王","冯","陈","褚","卫","蒋","沈","韩","杨","朱","秦","尤","许","何","吕","施","张","万俟","司马","上官","欧阳","夏侯","诸葛","东方","公孙","司徒"};String[] ming = {"德辉","方旭","飞轩","彬蔚","芳蕤","彬彬","博裕","芳苓","博闻","芳蔼","承德","博容","博文","朝宗","博艺","澄泓","博雅","澹雅","得韬"};stringBuilder.append( xing[random.nextInt(xing.length)] );stringBuilder.append( ming[random.nextInt(ming.length)] );return stringBuilder.toString();}public static int numRand(int n, int m){return  (int)(Math.random()*(m-n+1)+n);}/*** [min,max]* @param min* @param max* @return*/public static int getRandInt(int min,int max){Random random = new Random();return random.nextInt(max-min+1)+min;}/*** 随机整数[0,bound]* @param bound* @return*/public static int getRandInt(int bound){Random random = new Random();return random.nextInt(bound+1);}public static String getRandStr(int length){final String strs = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";String[] str  =strs.split(",");int strArrLen = str.length;StringBuilder randomStrBuilder = new StringBuilder("");for(int i=0;i<length;i++){Random random = new Random();int tmpInt = random.nextInt(strArrLen);randomStrBuilder.append(str[tmpInt]);}return randomStrBuilder.toString();}public static String getRandStr(String sourceStr,int length){StringBuilder randomStrBuilder = new StringBuilder("");char[]  charArray = sourceStr.toCharArray();for(int i=0;i<length;i++){Random random = new Random();int randomInt = random.nextInt(sourceStr.length());randomStrBuilder.append(charArray[randomInt]);}return randomStrBuilder.toString();}/*** [1,rightBoundary)* @param rightBoundary* @return*/public static int getRandIntExcludedZero(int rightBoundary){Random random = new Random();int tmpInt = 0;while (tmpInt == 0){tmpInt = random.nextInt(rightBoundary);}return tmpInt;}/*** 随机数字字符串,由0-9字符随机组合,长度为length* @param length* @return*/public static String getNumStr(int length){StringBuilder stringBuilder = new StringBuilder("");while (stringBuilder.length()<length){Random random = new Random();int tempInt = random.nextInt(10);//[0,10)stringBuilder.append(tempInt);if(stringBuilder.toString().startsWith("0")){stringBuilder.deleteCharAt(0);}}return stringBuilder.toString();}public static void myRandomStudy(){Random random = new Random();System.out.println(random.nextLong());//19位随机整数,包括正负System.out.println(random.nextInt());//10位随机整数,包括正负System.out.println(random.nextDouble());//大于0小于1的小数,小数点后17位System.out.println(random.nextDouble()*10);//随机小数扩大10倍System.out.println( (long)(random.nextDouble()*100) );//随机小数扩大100倍 再转长整型System.out.println(Math.abs(random.nextLong()));//19位随机整数,仅正System.out.println(Math.abs(random.nextInt()));//10位随机整数,仅正}/*** 随机13位的时间戳* @param begin* @param end* @return*/public static long getRandTimestamp(long begin,long end){long diff = (long)(Math.random()*(end - begin));long rand = begin + diff;if(rand == begin || rand == end){//StackOverflowreturn getRandTimestamp(begin,end);}return rand;}public static String getRandDate(String begin,String end){SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");long randDateLong = 0;try {Date startDate = format.parse(begin);//将字符串转成Date对象Date endDate = format.parse(end);//日期数据由字符串变量存储改为由Date"变量"存储if(startDate.getTime() >= endDate.getTime()){randDateLong = getRandTimestamp(endDate.getTime(),startDate.getTime());}else{randDateLong = getRandTimestamp(startDate.getTime(),endDate.getTime());}} catch (ParseException e) {e.printStackTrace();}return format.format(new Date(randDateLong));}public static String getRandDateTime(String format,String begin,String end){SimpleDateFormat formatDate = null;if(format.isEmpty()){formatDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");}else{formatDate =  new SimpleDateFormat(format);}long randDateLong = 0;try {Date startDate = formatDate.parse(begin);Date endDate = formatDate.parse(end);if(startDate.getTime() >= endDate.getTime()){randDateLong = getRandTimestamp(endDate.getTime(),startDate.getTime());}else{randDateLong = getRandTimestamp(startDate.getTime(),endDate.getTime());}} catch (ParseException e) {e.printStackTrace();}return formatDate.format(new Date(randDateLong));}/*** 随机数* @param minimum* @param maximum* @return*/public static String randomNumer(String minimum,String maximum) {long min = Long.parseLong(minimum.trim());long max = Long.parseLong(maximum.trim());long rand = ThreadLocalRandom.current().nextLong(min, max + 1L);String randString = Long.toString(rand);return randString;}

Excel文件处理

依赖包

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.12</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.12</version></dependency>

读取excel文件-全

import org.apache.log4j.Logger;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;public class ExcelUtil {private static Logger logger = Logger.getLogger(ExcelUtil.class);public XSSFWorkbook excelWorkbook;//excelpublic XSSFSheet xssfSheet;//工作表public Row row;//行public Cell cell;//单元格public static final String BASE_PATH_FILE = "src/main/resources/";//public static StringBuilder projectPathFile = new StringBuilder();public static StringBuilder pathNameFile = new StringBuilder(BASE_PATH_FILE);public ExcelUtil(String projectPath,String excelName){try {FileInputStream fileInputStream = new FileInputStream(new File(pathNameFile.append(projectPath).append(excelName).toString()));this.excelWorkbook = new XSSFWorkbook(fileInputStream);} catch (Exception e) {//e.printStackTrace();logger.error(e.getMessage(),e);}}
//读取全部的工作表内容public Object[][] getSheetData(String sheetName){int rowNum = excelWorkbook.getSheet(sheetName).getLastRowNum();int colNum = excelWorkbook.getSheet(sheetName).getRow(0).getLastCellNum();Object[][] data = new Object[rowNum][colNum];for (int i = 1; i <=rowNum; i++) {for (int j = 0; j < colNum; j++) {String cellData = getCellData(sheetName,i,j);data[i-1][j] = cellData;}}return data;}//拿到单元格中的数据,public String getCellData(String sheetName,int rownum,int colnum){//列数、列数都是从0开始计数 的StringBuilder cellValue = new StringBuilder("");try{xssfSheet = excelWorkbook.getSheet(sheetName);//工作表row = xssfSheet.getRow(rownum);cell = row.getCell(colnum);logger.info(cell.getCellType());if( cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN ){cellValue.append(String.valueOf(cell.getBooleanCellValue()));}else if(cell.getCellType() == XSSFCell.CELL_TYPE_STRING){cellValue.append( cell.getStringCellValue());}else if(cell.getCellType()==XSSFCell.CELL_TYPE_NUMERIC){short format = cell.getCellStyle().getDataFormat();if(format==14 || format == 31 || format == 57 || format == 58 || format == 177 || format == 179){DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");Date date = DateUtil.getJavaDate(cell.getNumericCellValue());cellValue.append(formater.format(date));}else if (format == 20 || format == 32 || format == 180 ) {DateFormat formater = new SimpleDateFormat("HH:mm");Date date = DateUtil.getJavaDate(cell.getNumericCellValue());cellValue.append(formater.format(date));}else {DecimalFormat df = new DecimalFormat("0");cellValue.append(df.format(cell.getNumericCellValue()));}}else if(cell.getCellType()==XSSFCell.CELL_TYPE_BLANK){cellValue.append("");}else{cellValue.append(cell.getStringCellValue());}logger.info("读取【"+sheetName+"】的第【"+rownum+"】行第【"+colnum+"】列的值是:"+cellValue);}catch (Exception e){logger.error("行号【"+rownum+"】,列号【"+colnum+"】的单元格内容为空~");logger.error(e.getMessage(),e);}return cellValue.toString();}
//关闭读取p流public void close(){try {excelWorkbook.close();}catch (IOException e){logger.error(e.getMessage(),e);}}public static void main(String[] args) {ExcelUtil excelUtil = new ExcelUtil("mtxcrm_params/","crmdata.xlsx");excelUtil.getCellData("新建产品",3,1);}
}

读取excel文件-01-单元格类型是字符串类型
XSSFCell.CELL_TYPE_STRING

public class ExcelUtil {private static Logger logger = Logger.getLogger(ExcelUtil.class);public XSSFWorkbook excelWorkbook;//excelpublic XSSFSheet xssfSheet;//sheetpublic Row row;//行public Cell cell;//单元格public static final String BASE_PATH_FILE = "src/main/resources/";//public static StringBuilder projectPathFile = new StringBuilder();public static StringBuilder pathNameFile = new StringBuilder(BASE_PATH_FILE);public ExcelUtil(String projectPath,String excelName){try {FileInputStream fileInputStream = new FileInputStream(new File(pathNameFile.append(projectPath).append(excelName).toString()));this.excelWorkbook = new XSSFWorkbook(fileInputStream);} catch (Exception e) {logger.error(e.getMessage(),e);}}public String getCellData(String sheetName,int rownum,int colnum){//列数、列数都是从0开始计数 的StringBuilder cellValue = new StringBuilder("");try{xssfSheet = excelWorkbook.getSheet(sheetName);row = xssfSheet.getRow(rownum);cell = row.getCell(colnum);logger.info(cell.getCellType());logger.info(cell.getStringCellValue());//(cell.getCellType() == XSSFCell.CELL_TYPE_STRINGcellValue.append(String.valueOf(cell.getStringCellValue()));//当单元格类型是字符串类型的时候}catch (Exception e){logger.error("行号【"+rownum+"】,列号【"+colnum+"】的单元格内容为空~");logger.error(e.getMessage(),e);}return cellValue.toString();
}

读取excel文件-02-单元格类型时间&日期类型
cell.getCellType()==XSSFCell.CELL_TYPE_NUMERIC

public String getCellData(String sheetName,int rownum,int colnum){//列数、列数都是从0开始计数 的StringBuilder cellValue = new StringBuilder("");try{xssfSheet = excelWorkbook.getSheet(sheetName);row = xssfSheet.getRow(rownum);cell = row.getCell(colnum);logger.info(cell.getCellType());//cell.getCellType()==XSSFCell.CELL_TYPE_NUMERICshort format = cell.getCellStyle().getDataFormat();if(format==14 || format == 31 || format == 57 || format == 58 || format == 177 || format == 179){DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");Date date = DateUtil.getJavaDate(cell.getNumericCellValue());cellValue.append(formater.format(date));}else if (format == 20 || format == 32 || format == 180 ) {DateFormat formater = new SimpleDateFormat("HH:mm");Date date = DateUtil.getJavaDate(cell.getNumericCellValue());cellValue.append(formater.format(date));}else {//非时间类型的,直接提取数值DecimalFormat df = new DecimalFormat("0");cellValue.append(df.format(cell.getNumericCellValue()));}logger.info(cell.getStringCellValue());}catch (Exception e){logger.error("行号【"+rownum+"】,列号【"+colnum+"】的单元格内容为空~");logger.error(e.getMessage(),e);}return cellValue.toString();}

读取excel文件-03-单元格类型是布尔类型
XSSFCell.CELL_TYPE_BOOLEAN

    public String getCellData(String sheetName,int rownum,int colnum){//列数、列数都是从0开始计数 的StringBuilder cellValue = new StringBuilder("");try{xssfSheet = excelWorkbook.getSheet(sheetName);row = xssfSheet.getRow(rownum);cell = row.getCell(colnum);logger.info(cell.getCellType());logger.info(cell.getStringCellValue());//(cell.getCellType() == XSSFCell.CELL_BOOLEANcellValue.append(String.valueOf(cell.getBooleanCellValue()));}catch (Exception e){logger.error("行号【"+rownum+"】,列号【"+colnum+"】的单元格内容为空~");logger.error(e.getMessage(),e);}return cellValue.toString();
}

读取excel文件-04-单元格类型是空
XSSFCell.CELL_TYPE_CELL_TYPE_BLANK

    public String getCellData(String sheetName,int rownum,int colnum){//列数、列数都是从0开始计数 的StringBuilder cellValue = new StringBuilder("");try{xssfSheet = excelWorkbook.getSheet(sheetName);row = xssfSheet.getRow(rownum);cell = row.getCell(colnum);logger.info(cell.getCellType());logger.info(cell.getStringCellValue());//(cell.getCellType() == XSSFCell.CELL_BLANKcellValue.append("");}catch (Exception e){logger.error("行号【"+rownum+"】,列号【"+colnum+"】的单元格内容为空~");logger.error(e.getMessage(),e);}return cellValue.toString();
}

JsonUtil

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.json</artifactId><version>1.1.4</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version></dependency>
import com.alibaba.fastjson.JSONArray;
import org.apache.log4j.Logger;import javax.json.Json;
import javax.json.stream.JsonParser;
import java.io.*;
import java.nio.charset.StandardCharsets;public class JsonsUtil {private static Logger logger = Logger.getLogger(JsonsUtil.class);public final static String BASE_PATH = "src/main/resources/";public static JSONArray getJsonArray(String fileNameStr) {logger.info("-----------------------文件相对路径以及名称为:"+fileNameStr);StringBuilder stringBuilderFilePathName = new StringBuilder();if(fileNameStr.contains(BASE_PATH)){stringBuilderFilePathName.append(fileNameStr);}else{stringBuilderFilePathName.append(BASE_PATH+fileNameStr);}logger.info("====================文件路径以及名称为:"+stringBuilderFilePathName);JSONArray jsonArray = new JSONArray();try {JsonParser parser = Json.createParser(new FileReader(stringBuilderFilePathName.toString()));logger.info("文件路径以及文件名为:"+stringBuilderFilePathName);while (parser.hasNext()) {JsonParser.Event event = parser.next();switch (event) {case START_ARRAY:case START_OBJECT:case KEY_NAME:case END_OBJECT:case END_ARRAY:String jsonStr = parser.getValue().toString();jsonArray = JSONArray.parseArray(jsonStr);break;default:break;}}} catch (Exception exception) {logger.error(exception.getMessage(),exception);}stringBuilderFilePathName.setLength(0);return jsonArray;}public static void writeJson(String str, String filePathStr) {StringBuilder stringBuilderFilePathName = new StringBuilder();try {if(filePathStr.contains(BASE_PATH)){stringBuilderFilePathName.append(filePathStr);}else {stringBuilderFilePathName.append(BASE_PATH+filePathStr);}OutputStream outputStream = new FileOutputStream(stringBuilderFilePathName.toString(), false);//覆盖写入logger.info("文件路径以及文件名为:"+stringBuilderFilePathName);outputStream.write(str.getBytes(StandardCharsets.UTF_8));Json.createWriter(outputStream);outputStream.flush();outputStream.close();} catch (Exception e) {logger.error(e.getMessage(),e);}}public static String readJson(String fileNameStr) {String filePathNameStr = BASE_PATH + fileNameStr;logger.info("文件路径以及文件名为:"+BASE_PATH+fileNameStr);String lineStr = "";StringBuilder stringBuilder = new StringBuilder();File file = new File(filePathNameStr);//创建文件对象if (file.exists()) {//如果该文件存在try {BufferedReader bufferedReader = new BufferedReader(new FileReader(filePathNameStr));while (  (lineStr=bufferedReader.readLine())  !=null ) {//空行stringBuilder.append(lineStr);}bufferedReader.close();} catch (IOException exception) {exception.printStackTrace();logger.error(exception.getMessage(),exception);}}return stringBuilder.toString();}

DBUtil

import java.sql.*;
import java.util.*;import groovy.util.logging.Slf4j;
import org.apache.log4j.Logger;@Slf4j
public class DBUtil {private static Logger logger = Logger.getLogger(DBUtil.class);private static Map<String, String> connStrs = new HashMap<>();private static Map<String, Connection> conns = new HashMap<>();public static Connection connection;//nullpublic static void getConnect(String url, String username, String password) {try {connection = DriverManager.getConnection(url, username, password);System.out.println("建立数据库连接");} catch (SQLException throwables) {throwables.printStackTrace();}}public static void getConnect(String db) {String dburl = connStrs.get(db);int i = dburl.lastIndexOf(":");String strPassword = dburl.substring(i + 1);dburl = dburl.substring(0, i);i = dburl.lastIndexOf(":");String strUserName = dburl.substring(i + 1);dburl = dburl.substring(0, i);logger.info(dburl + "@@" + strUserName + "##" + strPassword);try {//            Class.forName(dburl.contains("mysql") ? "com.mysql.cj.jdbc.Driver" : "oracle.jdbc.driver.OracleDriver");connection = DriverManager.getConnection(dburl, strUserName, strPassword);connection.setAutoCommit(false);//关闭自动commitconns.put(db, connection);System.out.println("建立数据库连接");} catch (Exception e) {assert false : "load db conn failed," + dburl + "," + e.getMessage();
//            e.printStackTrace();}}public static Connection getDbConn(String db) {getConnect(db);return conns.get(db);}public static String getConnStr(String db) {return connStrs.get(db);}public static boolean executeUpdate(String db, String strSql) throws SQLException {connection = getDbConn(db);Statement stat = null;strSql = strSql.trim();if (strSql.endsWith(";")) {strSql = strSql.substring(0, strSql.length() - 1);}try {stat = connection.createStatement();stat.executeUpdate(strSql);} catch (SQLException e) {logger.error(e.getMessage() + "->" + strSql);} finally {stat.close();connection.commit();}return true;}public static void closeConnect() {if (connection != null) {try {connection.close();System.out.println("关闭数据库连接");} catch (SQLException throwables) {throwables.printStackTrace();}}}public static void closeConn() throws SQLException {if (conns != null) {for (String Key1 : conns.keySet()) {conns.get(Key1).close();System.out.println("关闭数据库连接");}}}private static void load() {if (connStrs.size() > 2)return;//如果不加花括号,那么当条件不成立时,只会执行最近的一句代码Map<String, String> date = new HashMap<>();connStrs = date;}public static List<Map<String, Object>> read(String sql) {List<Map<String, Object>> lines = new ArrayList<>();try {PreparedStatement preparedStatement = connection.prepareStatement(sql);ResultSet resultSet = preparedStatement.executeQuery();ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();//列数while (resultSet.next()) {//1行Map<String, Object> line = new HashMap<>();for (int i = 1; i <= columnCount; i++) {//从1开始计数String colName = metaData.getColumnLabel(i);//字段名Object colValue = resultSet.getObject(i);//字段值line.put(colName, colValue);}lines.add(line);}} catch (SQLException throwables) {throwables.printStackTrace();}return lines;}public static List<Map<String, Object>> read(String db, String strSql, int row) throws SQLException {connection = getDbConn(db);strSql = strSql.trim();if (strSql.endsWith(";"))strSql = strSql.substring(0, strSql.length() - 1);List<Map<String, Object>> lines = new ArrayList<>();Statement stmt = null;ResultSet rs = null;try {stmt = connection.createStatement();rs = stmt.executeQuery(strSql);ResultSetMetaData rmd = rs.getMetaData();int columnCount = rmd.getColumnCount();//列数int t = 0;while (rs.next()) {//1行t++;Map<String, Object> result = new LinkedHashMap<>();for (int i = 1; i <= columnCount; i++) {//从1开始计数String colName = rmd.getColumnLabel(i).toLowerCase();//字段名
//                    Object colValue = rs.getObject(i);//字段值Object colValue = rmd.getColumnClassName(i).equals("oracle.sql.TIMESTAMP") ? rs.getTimestamp(i) : rs.getString(i);//字段值result.put(colName, colValue);}lines.add(result);if (row == t) break;}} catch (SQLException e) {logger.error(e.getMessage() + "->" + strSql);}finally {if(rs!= null)rs.close();System.out.println("关闭rs");if(stmt != null)stmt.close();System.out.println("关闭stmt");}connection.commit();return lines;}

RestAsured测试框架相关推荐

  1. 软件自动测试框架,软件自动化测试框架的研究和实现

    摘要: 软件自动化测试是软件工程领域的一项重要课题.随着软件工程理论的不断发展,软件自动化测试在理论上也不断达到新的高度.目前最为成熟的软件自动化测试技术是使用自动测试框架来指导自动化测试的实现.迄今 ...

  2. model存数据_Jepsen 测试框架在图数据库 Nebula Graph 中的实践

    在本篇文章中主要介绍图数据库 Nebula Graph 在 Jepsen 这块的实践. Jepsen 简介 Jepsen 是一款用于系统测试的开源软件库,致力于提高分布式数据库.队列.共识系统等的安全 ...

  3. 5个最佳的Android测试框架

    2019独角兽企业重金招聘Python工程师标准>>> 谷歌的Android生态系统正在不断地迅速扩张.有证据表明,新的移动OEM正在攻陷世界的每一个角落,不同的屏幕尺寸.ROM / ...

  4. testem方便的web tdd 测试框架使用

    备注: 单元测试,对于日常的开发是比较重要的,testem 简化了我们的代码编写,以及运行. 主要特性: a. 支持的测试框架有:jasmine quint mocha buster.js ,同时也包 ...

  5. 自动化测试框架cucumber_BDD测试框架之Cucumber使用入门

    ▼ 关注测试局| 会上瘾 1什么是Cucumber cucumber早在ruby环境下应用广泛,作为BDD框架的先驱,cucumber后来被移植到了多平台,简单来说cucumber是一个测试框架,就像 ...

  6. ThinkPHP 集成 PHPUnit 8 测试框架进行单元测试

    ThinkPHP 5.1 集成 PHPUnit 8 测试框架 本项目仅适用于运行 PHP7.2 以上的环境!对于低版本 PHP 请根据需要调整 PHPUnit 的版本! 声明 由于原项目 think- ...

  7. 走进Java接口测试大门之测试框架TestNG

    一.简介 TestNG 是一个受 JUnit 和 NUnit 启发的测试框架,旨在简化广泛的测试需求,从单元测试到接口测试. 但引入了一些新功能,使其更强大,更易于使用,例如: 注释. 在线程池中运行 ...

  8. Python测试框架pytest(05)fixture - error和failed、fixture实例化、多个fixture

    Python测试框架pytest系列可以查看下列 Python测试框架pytest(01)简介.安装.快速入门_编程简单学的博客-CSDN博客 Python测试框架pytest(02)PyCharm设 ...

  9. Python测试框架pytest(04)fixture - 测试用例调用fixture、fixture传递测试数据

    Python测试框架pytest系列可以查看下列 Python测试框架pytest(01)简介.安装.快速入门_编程简单学的博客-CSDN博客 Python测试框架pytest(02)PyCharm设 ...

  10. Python测试框架pytest(03)setup和teardown

    Python测试框架pytest系列可以查看下列 Python测试框架pytest(01)简介.安装.快速入门_编程简单学的博客-CSDN博客 ​​​​​​Python测试框架pytest(02)Py ...

最新文章

  1. 选择适合页面或应用程序的数据查看机制
  2. 处理unsigned相减错误(BIGINT UNSIGNED value is out of range)
  3. android jar 加密
  4. Mask R-CNN详解
  5. springboot发送qq邮件
  6. Oracle SQL中的!=与
  7. endwith php,endwith函数怎么使用
  8. Latex添加矢量图/将visio画图转换成矢量图
  9. 联想笔记本电脑键盘灯怎么开启_解决方案:如何打开Lenovo键盘灯?联想笔记本键盘键盘灯按哪个键?...
  10. fw150us的linux驱动下载,FAST FW150US2.0无线网卡驱动
  11. 家园2简易地图编辑器
  12. 关于nginx日志的HTTP 499状态码
  13. LTspice中 Voltage Controlled Switches的使用方法
  14. 基于PaaS人事部门间平台多重身份的技术解决方案
  15. power automate desktop字符串处理
  16. CCNET的参考文件
  17. 去哪儿网 ReactNative 跨小程序多端方案介绍
  18. java.util.Date java.sql.Date SimpleDateFormat String 转DATE
  19. Google Earth Engine(GEE)——join连接在GEE中的应用(同一sentinel-2影像集合)含滑动窗口平滑影像过程
  20. CStdioFile扩展(支持Ansi、Unicode、Utf-8等文本格式)

热门文章

  1. opencv读取视频转换成一张张图片
  2. win10 实现远程连接linux系统
  3. 各种单点登录方案调研
  4. photoshop基础操作集合01
  5. 手机滚动截屏软件推荐
  6. 2019北邮网安考研经验
  7. python中返回上一步操作的快捷键_在计算机中返回上一步的快捷键
  8. clustalX2使用以及相关的问题
  9. 2022年了,微信透明头像怎么设置?不多说,安排
  10. 测评分享丨海思Hi3519AV100开发板功能测试