接口自动化测试框架设计

文章目录

    • 接口测试的定义
    • 接口测试的意义
    • 接口测试的测试用例设计
    • 接口测试的测试用例设计方法
    • postman
      • 主要功能
      • 请求体分类
      • JSON数据类型
      • postman内置参数
      • postman变量
        • 全局变量
        • 环境变量
      • postman断言
      • JSON提取器
      • 正则表达式提取器
      • Cookie提取器
      • postman加密
      • 接口签名
    • 接口自动化测试基础
      • get
      • post-form
      • post-json
    • 接口自动化测试框架基础
      • 实现步骤
      • 使用步骤
      • 整体框架示意
      • 代码实现
        • com.edu.core
          • ApiListener.java
          • BaseTest.java
          • HttpDriver .java
          • MailUtil.java
        • com.edu.dataprovider
          • ExcelDataProvider.java
          • MysqlDataProvider.java
          • NSDataProvider.java
          • TxtDataProvider.java
        • com.edu.utils
          • Checker.java
          • Common.java
          • DbHelper.java
          • Log.java
          • ReadPro.java
          • ResultSetHandler.java
          • ResultVerifier.java
        • com.edu.test
          • LoginTest.java
        • src-log4j2.xml

接口测试的定义

测试系统间接口的一种测试,测试的对象主要是接口,主要是测试外部系统与所测试系统之间以及内部系统之间的交互点。

接口测试的意义

  • 前后端分离,通过测试保证服务端的正确性
  • 基于安全考虑,前端验证很容易跳过。
  • BUG更容易定位
  • 自动化测试落地性价比更高,比UI更稳定
  • 测试提前,降低研发成本,提高效率
  • 更容易实现持续集成

接口测试的测试用例设计

  • 功能
    • 功能是否正常
    • 功能是否按照接口文档实现
  • 逻辑业务
    • 是否依赖业务
  • 异常处理
    • 参数异常【关键字参数、参数为空、多或少参数、错误参数】
    • 数据异常【关键字数据、数据为空、长度不一致、错误数据】
  • 安全
    • Cookie
    • 传输数据是否加密
    • 身份权限验证
    • 密码规则是否符合需求
    • 唯一识别码

接口测试的测试用例设计方法

  • 等价类分析
  • 边界值分析法
  • 决策表
  • 场景法
    在这里插入图片描述

postman

主要功能

  • 模拟各种http requests
  • Collection功能
  • 人性化的Response整理
  • 内置测试脚本管理
  • 设定变量与环境

请求体分类

在这里插入图片描述

JSON数据类型

  • 数值【整数、浮点数】例:”price”:123.78
  • null空值【”“表示空字符串不是空值】 例:”name”:null
  • 逻辑值【true\false】 例:”student”:true
  • 对象【花括号】例:”address”:{“line”: 123 yuhua road”,“city”:”shijiazhuang”}
  • 数组【方括号】例:“employees”: [{ “firstName”:“Bill” , “lastName”:“Gates” }, {“firstName”:“George” , “lastName”:“Bush” }]

postman内置参数

https://learning.postman.com/docs/writing-scripts/script-references/variables-list/

  • 时间戳:{{KaTeX parse error: Expected 'EOF', got '}' at position 10: timestamp}̲} {"tag":{"name…timestamp}}"}}
  • 随机生成整数0~1000:{{KaTeX parse error: Expected 'EOF', got '}' at position 10: randomInt}̲} {"tag":{"id":…randomInt}}"} }
  • 生成随机的GUID的字符串:{{KaTeX parse error: Expected 'EOF', got '}' at position 5: guid}̲} { "tag" : { …guid}}" } }

postman变量

全局变量

全局变量可供所有请求使用
pm.globals.set(“token1”, jsonData.access_token);

环境变量

//提取token的值
var jsonData=JSON.parse(responseBody)
console.log(jsonData.access_token)
pm.environment.set(“token1”, jsonData.access_token);

postman断言

在这里插入图片描述
在这里插入图片描述

JSON提取器

在这里插入图片描述

正则表达式提取器

在这里插入图片描述

Cookie提取器

在这里插入图片描述

postman加密

常见加密方式三种方式:

  • 加密算法(MD5、RSA、DES、AES、SHA)
  • 自定义加密算法
  • 接口签名
    在这里插入图片描述

接口签名

  • 1什么是接口签名?
  • 使用用户名,密码,时间戳和所有的排过序之后的参数,拼接组合起来成为一个串,再把该串加密得到的字符串,这就是一个签名。该签名字符串是唯一的有权访问第三方接口的鉴权码。
  • 2为什么需要做接口签名?
  • 防篡防伪装攻击。
  • 改攻击。
  • 防重放攻击。
  • 防数据泄露 。
  • 3生成signature(签名)规则
  • 对所有请求参数按key的ASCII码做升序排列
  • 把请求参数拼接组合成串
  • 把AccessKey和SecretKey码加入上面拼接好的字符串
  • 用时间戳连接到字符串的尾部
  • 再把这个字符串进行MD5加密,加密后再转化成大写
    在这里插入图片描述
    在这里插入图片描述

接口自动化测试基础

get

  • 创建HttpClient对象
  • CloseableHttpClient client =HttpClient.createDefault();
  • 创建get请求对象
  • HttpGet get=new HttpGet(url);
  • 执行请求获取响应
  • CloseHttpResponse response=client.execute(get)
  • 获得响应体
  • HttpEntity response_entity=response.getEntity();
  • 获取响应体内容
  • String response_str=EntityUtils.toString(response_entity,"utf-8");
  • 释放资源
  • EntityUtils.consume(entity);
  • 关闭连接
  • response.close();client.close();

post-form

  • 创建HttpClient对象
  • CloseableHttpClient client =HttpClient.createDefault();
  • 创建post请求
  • HttpPost post=new HttpPost(url);
  • 设置请求头
  • post.setHeader(Content-Type","application/x-www-form-url")
  • 构建请求体
  • List<NameValuePair> user=new ArrayList<>() user.add(new BasicNameValuePair("username","vip") user.add(new BasicNameValuePair("password","secret") ;
    HttpEntity user=new StringEntity(“username=vip&password=secret”)
  • 设置请求实体
  • post.setEntity(new UrlEncodedFormEntity(user));
    post.setEntity(user)
  • 执行请求获取响应
  • CloseHttpResponse response=client.execute(post)
  • 获得响应体
  • HttpEntity response_entity=response.getEntity();
  • 获取响应体内容
  • String response_str=EntityUtils.toString(response_entity,"utf-8");

post-json

  • 使用fastjson构建请求体
  • JSONObject user=new JSONObject() user.put(" "," ");
  • 设置请求实体
  • post.setEntity

接口自动化测试框架基础

实现步骤

1.域名存放在属性文件中
2.常用get,post,方法进行封装,针对不同的参数,实现重载。
doGet(String url)
doGet(String url,Map<String,Object> para)
doGetByCookie(String url,CookieStore cookie)
doPost(String url,String para)
doPostByForm(String url, List data )针对Content-type是Form
doPost(String url,JSONObject para) 针对Content-type是JSON
doPostByCookie(String url,JSONObject para,CookieStore cookie)
3.断言的封装 Checker
4.数据驱动(把1000个商品遍历,做submit的操作;10个用户的登录,下单)
5.数据库的访问(JDBC)
6.监听器的使用
ApiListener extends TestListenerAdapter
重写 onFinish()方法
7.发送邮件 JAVAMail

使用步骤

1.创建空项目 Qg
2.创建libs,把需要的jar拷贝进来
3.拷贝conf目录
4.拷贝log4j2.xml文件
5.每个接口创建一个测试类
6.对接口的操作封装为方法
7.如果需要数据库的验证,测试类需要继承
BaseTest

整体框架示意

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

com.edu.core
ApiListener.java
package com.edu.core;import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;import org.testng.ITestContext;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;import com.edu.utils.Log;
import com.edu.utils.ReadPro;public class ApiListener extends TestListenerAdapter {private String writeResultToMail() {ITestNGMethod method[] = this.getAllTestMethods();List failedList = this.getFailedTests();List passedList = this.getPassedTests();List failedList1 = new ArrayList();List passedList1 = new ArrayList();for (int j = 0; j < failedList.size(); j++) {ITestResult tr = (ITestResult) failedList.get(j);if (tr.getMethod().getDescription() != null) {tr.setAttribute("name", tr.getMethod().getDescription());} else {tr.setAttribute("name", "");}failedList1.add(tr);}for (int j = 0; j < passedList.size(); j++) {ITestResult tr = (ITestResult) passedList.get(j);if (tr.getMethod().getDescription() != null) {tr.setAttribute("name", tr.getMethod().getDescription());} else {tr.setAttribute("name", "");}passedList1.add(tr);}Map context = new HashMap();context.put("date", new Date());context.put("failedList", failedList.size());context.put("passedList", passedList1.size());context.put("casesize", passedList.size() + failedList.size());context.put("failcasesize", failedList.size());try {String content = mapToString(context);return content;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public static String mapToString(Map<String, Object> para) {StringBuilder sBuilder = new StringBuilder();int size = para.size();for (Entry<String, Object> entry : para.entrySet()) {sBuilder.append(entry.getKey() + "=" + entry.getValue() + "\n");}return sBuilder.toString();}@Overridepublic void onFinish(ITestContext testContext) {super.onFinish(testContext);System.out.println(getAllTestMethods().length);String emailContent = this.writeResultToMail();System.out.println(emailContent);String emailTitle = ReadPro.getPropValue("mail_title") + "----" + this.getTime();String toMail = ReadPro.getPropValue("to_mail");try {
//			System.out.println(emailContent);
//			MailUtil.sendEmail(toMail, emailTitle, emailContent);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public String getTime() {java.util.Calendar c = java.util.Calendar.getInstance();java.text.SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy-MM-dd  hh:mm:ss");return f.format(c.getTime());}//	@Override
//	public void onTestSuccess(ITestResult tr) {
//		Log.info(tr.getInstance() + "-" + tr.getName() + "运行成功");
//	}
//
//	@Override
//	public void onTestFailure(ITestResult tr) {
//
//		Log.error(tr.getInstance() + "-" + tr.getName() + "运行失败");
//	}}
BaseTest.java
package com.edu.core;import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;import com.edu.utils.DbHelper;public class BaseTest {public DbHelper db ;@BeforeClasspublic void setUp()	throws Exception {db=DbHelper.getInstance();System.out.println("初始化数据库");}@AfterClasspublic void tearDown() throws Exception {db.close();}}
HttpDriver .java
package com.edu.core;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.cookie.CookieStore;
import org.apache.hc.client5.http.cookie.StandardCookieSpec;
import org.apache.hc.client5.http.entity.UrlEncodedFormEntity;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.NameValuePair;
import org.apache.hc.core5.http.ParseException;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.io.entity.StringEntity;import com.alibaba.fastjson2.JSONObject;
import com.edu.utils.Common;
import com.edu.utils.ReadPro;public class HttpDriver {static CloseableHttpClient httpClient = null;static CloseableHttpResponse respone = null;public static String doGet(String url) throws Exception {httpClient = HttpClients.createDefault();HttpGet get = new HttpGet(ReadPro.getPropValue("base_url") + url);respone = httpClient.execute(get);HttpEntity entity = respone.getEntity();String content = EntityUtils.toString(entity, "utf-8");EntityUtils.consume(entity);respone.close();httpClient.close();return content;}public static String doGet(String url, JSONObject data) throws Exception {String para = URLEncoder.encode(data.toString(), "UTF-8");httpClient = HttpClients.createDefault();HttpGet get = new HttpGet(url + "?" + para);respone = httpClient.execute(get);HttpEntity entity = respone.getEntity();String content = EntityUtils.toString(entity, "utf-8");EntityUtils.consume(entity);respone.close();httpClient.close();return content;}public static String doGetForEncoder(String url, String para) throws Exception {httpClient = HttpClients.createDefault();String content=URLEncoder.encode(para,"utf-8");HttpGet get = new HttpGet(ReadPro.getPropValue("base_url") + url + content);respone = httpClient.execute(get);HttpEntity entity = respone.getEntity();String result = EntityUtils.toString(entity, "utf-8");EntityUtils.consume(entity);respone.close();httpClient.close();return result;}public static String doGet(String url, Map<String, String> para) throws IOException, ParseException {String content = null;httpClient = HttpClients.createDefault();HttpGet get = new HttpGet(ReadPro.getPropValue("base_url") + url + "?" +Common.mapToString(para));respone = httpClient.execute(get);HttpEntity entity = respone.getEntity();content = EntityUtils.toString(entity, "utf-8");EntityUtils.consume(entity);respone.close();httpClient.close();return content;}public static String doPost(String url, JSONObject para) {httpClient = HttpClients.createDefault();HttpPost post = new HttpPost(ReadPro.getPropValue("base_url") + url);post.addHeader("Content-Type", "application/json");HttpEntity data;String content = null;try {data = new StringEntity(para.toString());post.setEntity(data);respone = httpClient.execute(post);HttpEntity entity = respone.getEntity();content = EntityUtils.toString(entity, "utf-8");EntityUtils.consume(entity);respone.close();httpClient.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return content;}public static String doGet(String url, CookieStore cookie) throws Exception {CloseableHttpClient client=HttpClients.custom().setDefaultCookieStore(cookie).build();HttpGet get = new HttpGet(ReadPro.getPropValue("base_url") + url);CloseableHttpResponse response = client.execute(get);HttpEntity result_entity = response.getEntity();String result = EntityUtils.toString(result_entity, "utf-8");EntityUtils.consume(result_entity);response.close();client.close();return result;}public static String doPostByForm(String url, List<NameValuePair> data ) throws Exception {httpClient = HttpClients.createDefault();HttpPost post = new HttpPost(ReadPro.getPropValue("base_url") + url);post.addHeader("Content-Type", "application/x-www-form-urlencoded");post.setEntity(new UrlEncodedFormEntity(data));respone = httpClient.execute(post);HttpEntity entity = respone.getEntity();String content = EntityUtils.toString(entity, "utf-8");respone.close();httpClient.close();return content;}public static String doPost(String url, JSONObject para, CookieStore cookie) throws Exception {httpClient=HttpClients.custom().setDefaultCookieStore(cookie).build();HttpPost post = new HttpPost(ReadPro.getPropValue("base_url")+url);post.addHeader("Content-Type", "application/json");HttpEntity data = new StringEntity(para.toString());post.setEntity(data);CloseableHttpResponse respone = httpClient.execute(post);HttpEntity entity = respone.getEntity();String content = EntityUtils.toString(entity, "utf-8");EntityUtils.consume(entity);respone.close();httpClient.close();return content;}}
MailUtil.java
package com.edu.core;import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;import java.util.Properties;import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;public class MailUtil {static int port = 25;static String server = "smtp.126.com";static String from = "李焕贞";static String user = "testlihuanzhen@126.com";static String password = "123456abcd";//授权码public static void sendEmail(String email, String subject, String body) throws UnsupportedEncodingException {try {Properties props = new Properties();props.put("mail.smtp.host", server);props.put("mail.smtp.port", String.valueOf(port));props.put("mail.smtp.auth", "true");Transport transport = null;Session session = Session.getDefaultInstance(props,null);transport = session.getTransport("smtp");transport.connect(server, user, password);MimeMessage msg = new MimeMessage(session);msg.setSentDate(new Date());InternetAddress fromAddress = new InternetAddress(user,from,"UTF-8");msg.setFrom(fromAddress);String emailList[]=email.split(",");InternetAddress[] toAddress = new InternetAddress[emailList.length];for(int i=0;i<emailList.length;i++){toAddress[i]=new InternetAddress(emailList[i]);}msg.addRecipients(Message.RecipientType.TO, toAddress);msg.setSubject(subject, "UTF-8");   msg.setContent(body, "text/html;charset=utf-8");msg.saveChanges();transport.sendMessage(msg, msg.getAllRecipients());} catch (NoSuchProviderException e) {e.printStackTrace();} catch (MessagingException e) {e.printStackTrace();}}public static void main(String args[]) throws UnsupportedEncodingException{MailUtil.sendEmail("testlihuanzhen@126.com", "星期二", "测试");}}
com.edu.dataprovider
ExcelDataProvider.java
package com.edu.dataprovider;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/** Excel数据驱动类*/public class ExcelDataProvider {public Object[][] getTestDataByExcel(String fileName, String sheetName)throws IOException {File file = new File(fileName);FileInputStream inputstream = new FileInputStream(file);Workbook wbook = null;String fileExtensionName = fileName.substring(fileName.indexOf("."));if (fileExtensionName.equals(".xlsx")) {wbook = new XSSFWorkbook(inputstream);} else if (fileExtensionName.equals(".xls")) {wbook = new HSSFWorkbook(inputstream);}Sheet sheet = wbook.getSheet(sheetName);// 通过sheetName生成Sheet对象int rowCount = sheet.getLastRowNum() - sheet.getFirstRowNum();// 获取当前sheet行数,行号和列号都是从0开始List<Object[]> records = new ArrayList<Object[]>();// 使用双循环获取excel文件的所有数据(第一行除外)for (int i = 1; i < rowCount + 1; i++) {Row row = sheet.getRow(i);String fields[] = new String[row.getLastCellNum()];for (int j = 0; j < row.getLastCellNum(); j++) {// 获取单元格数据fields[j] = row.getCell(j).getStringCellValue();}records.add(fields);}Object[][] results = new Object[records.size()][];for (int i = 0; i < records.size(); i++) {results[i] = records.get(i);}return results;}}
MysqlDataProvider.java
package com.edu.dataprovider;import java.io.IOException;
import java.sql.*;import java.util.ArrayList;
import java.util.List;import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;public class MysqlDataProvider {public  Object[][] getTestDataByMysql(String sql) {String url = "jdbc:mysql://10.7.90.21:3306/market_db";List<Object[]> records = new ArrayList<Object[]>();try {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection(url, "root", "123456");if (!conn.isClosed()) {System.out.println("连接数据库成功");}// Statement里面带有很多方法,比如executeUpdate可以实现插入,更新和删除等Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);//得到数据集的结构ResultSetMetaData rsMetaData = rs.getMetaData();int cols = rsMetaData.getColumnCount();System.out.println(cols);while (rs.next()) {String fields[] = new String[cols];int col=0;for (int i = 0; i < cols; i++) {fields[col] = rs.getString(i+1);//读取当前行指定的列col++;}records.add(fields);}rs.close();conn.close();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}Object[][] results = new Object[records.size()][];for (int i = 0; i < records.size(); i++) {results[i] = records.get(i);}return results;}}
NSDataProvider.java
package com.edu.dataprovider;import java.io.IOException;import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;public class NSDataProvider {@DataProvider(name="goodId")public Object[][] getId() throws IOException{return new ExcelDataProvider().getTestDataByExcel("data/mall.xlsx", "Sheet1");}@Test(dataProvider ="goodId" )public void test1(String id) {System.out.println(id);}@DataProvider(name="zl_shop")public  Object[][] getTxtData() throws IOException{return new  TxtDataProvider().getTxtUser("data/user.txt");}@DataProvider(name="user")public  Object[][] getMovieData() throws IOException{return new  ExcelDataProvider().getTestDataByExcel("data/user.xlsx","Sheet1");}@Test(dataProvider="txt")public void getData(String a,String b) {System.out.println(a+" "+b);}@DataProvider(name="excel")public Object[][] getExcelDada() throws IOException{return new ExcelDataProvider().getTestDataByExcel("data/user.xlsx","Sheet1");}@DataProvider(name="mysql")public Object[][] getMysqlDada() throws IOException{return new MysqlDataProvider().getTestDataByMysql("SELECT pid,name from t_product");}@Test(dataProvider="mysql")public void testDB(String a,String b) {System.out.println(a+" "+b);}}
TxtDataProvider.java
package com.edu.dataprovider;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;public class TxtDataProvider {public Object[][] getTxtUser(String fileName) throws IOException {List<String> dataList = new ArrayList<String>();File file = new File(fileName);FileInputStream fis = new FileInputStream(file);InputStreamReader isr= new InputStreamReader(fis);BufferedReader reader = new BufferedReader(isr);int cols=reader.readLine().split("\t").length;String readData;while((readData=reader.readLine())!=null) {dataList.add(readData);}Object [][] result = new Object[dataList.size()][cols];String [] arrays;for(int i=0;i<dataList.size();i++) {arrays=dataList.get(i).split("\t");for(int j=0;j<cols;j++)result[i][j]=arrays[j];}return result;}}
com.edu.utils
Checker.java
package com.edu.utils;import static org.testng.Assert.assertEquals;import java.util.List;import com.alibaba.fastjson2.JSONObject;public class Checker {String exceptionMessage = "";String message = "";String actualValue = "";String expectValue = "";JSONObject json = null;public Checker(String result) {this.json = JSONObject.parseObject(result);}public void assertArray(String patten,String key,String content){actualValue=this.json.getJSONArray(patten).getJSONObject(0).getString(key);assertEquals(actualValue, content);}public void verifyTextPresent(String patten) throws Exception {boolean value = json.containsKey(patten);if (value) {Log.info("the Text: '" + patten + "' is Present!");} else {Log.fatal("the Text: '" + patten + "' is not Present!");throw new Exception("the Text: '" + patten + "' is not Present!");}}public void verifyXpath(String locator, String patten) throws Exception {actualValue = this.json.getString(locator);verify(patten, actualValue);}public void verify(String pattern, String actualValue) throws Exception {this.actualValue = actualValue;this.setExceptionMessage(actualValue, pattern);this.setMessage(pattern, actualValue);String errormsg = getExceptionMessage();String msg = getMessage();if (ResultVerifier.verifyStringsByEqualAndExist(pattern, actualValue)) {Log.info(msg);} else {Log.fatal(errormsg);Log.info(json.toString());throw new Exception(errormsg);}}public void assertXpath(String locator, String object) throws Exception {// TODO Auto-generated method stubactualValue = this.json.getString(locator);assertEquals(actualValue,object);}public void setExceptionMessage(String actualValue, String expectValue) {this.exceptionMessage = "expectedValue doesn't match actualValue,actual Value is :" + actualValue+ "; expected Value is :" + expectValue;}public void setMessage(String expectValue, String actualValue) {this.message = "expectedValue :" + expectValue + "  match actualValue:" + actualValue;}public String getExceptionMessage() {return exceptionMessage;}public String getMessage() {return message;}
}
Common.java
package com.edu.utils;import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.cookie.BasicCookieStore;
import org.apache.hc.client5.http.cookie.CookieStore;
import org.apache.hc.client5.http.cookie.StandardCookieSpec;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.io.entity.StringEntity;import com.alibaba.fastjson2.JSONObject;public class Common {// 把map类型转换为String,并用&加以拼接public static String mapToString(Map<String, String> para) {StringBuilder sBuilder = new StringBuilder();String content = null;int size = para.size();for (Entry<String, String> entry : para.entrySet()) {sBuilder.append(entry.getKey() + "=" + entry.getValue());size--;if (size >= 1) {sBuilder.append("&");}}return sBuilder.toString();}public static CookieStore getCookie(String u_name,String password) throws Exception, IOException {JSONObject user=new JSONObject();user.put("phoneArea", "86");user.put("phoneNumber", u_name);user.put("password", password);CookieStore cookie = new BasicCookieStore();CloseableHttpClient client = HttpClients.custom().setDefaultCookieStore(cookie).build();String loginurl=ReadPro.getPropValue("base_url")+"/common/fgadmin/login";HttpPost post =new HttpPost(loginurl);//设置请求体HttpEntity userEntity=new StringEntity(user.toString());post.setHeader("Content-Type","application/json");post.setEntity(userEntity);CloseableHttpResponse response=client.execute(post);HttpEntity responseEntity=response.getEntity();String result=EntityUtils.toString(responseEntity,"UTF-8");System.out.println(result);EntityUtils.consume(responseEntity);response.close();client.close();return cookie;}}
DbHelper.java
package com.edu.utils;import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//import java.sql.DriverManager;
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import java.sql.Statement;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class DbHelper {static Logger log = LogManager.getLogger(DbHelper.class.getName());public java.sql.Connection conn = null; //connection objectpublic ResultSet rs = null; //resultset objectpublic Statement stmt = null; //statement objectpublic PreparedStatement pstmt = null; //preparedstatement objectprivate String drivers = null; //connection parameter:driversprivate String url = null; //connection parameter:urlprivate String user = null; //connection parameter:userprivate String password = null; //connection parameter:passwordprivate String configFile;public DbHelper() {}public DbHelper(String configFile) {this.configFile = configFile;init();}public static DbHelper getInstance() {DbHelper instance = new DbHelper("conf/conf.properties");instance.init();return instance;}private void init() {drivers = ReadPro.getPropValue("persistence.datasource.driverClassName");url = ReadPro.getPropValue("persistence.datasource.url");user = ReadPro.getPropValue("persistence.datasource.username");password = ReadPro.getPropValue("persistence.datasource.password");try {log.info(drivers+"---"+url);Class.forName(drivers);conn = DriverManager.getConnection(url, user, password);stmt = conn.createStatement();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public List query(String sql) throws Exception{List list = null;rs = stmt.executeQuery(sql);if (null != rs) {list = ResultSetHandler.toMapList(rs);}return list;}public boolean execute(String sql) throws Exception{boolean flag=false;flag = stmt.execute(sql);return flag;}public Map queryToMap(String sql) throws Exception{Map map = null;rs = stmt.executeQuery(sql);if (null != rs) {map = ResultSetHandler.toMap(rs);}return map;}public List queryToList(String sql) throws Exception {List list = null;rs = stmt.executeQuery(sql);if (null != rs) {list = ResultSetHandler.toStringArrayList(rs);}return list;}public String queryToString(String sql) { String str = null;try {rs = stmt.executeQuery(sql);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (null != rs) {try {str = ResultSetHandler.toString(rs);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}return str;}public void close() {if (null != rs) {try {rs.close();} catch (SQLException ex) {rs = null;}}if (null != stmt) {try {stmt.close();} catch (SQLException ex) {stmt = null;}}if (null != pstmt) {try {pstmt.close();} catch (SQLException ex) {pstmt = null;}}if (conn != null) {try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blockconn = null;}}}public static void main(String args[]) {DbHelper db = DbHelper.getInstance();try {List list = db.query("select * from malluser");for (int i = 0; i < list.size(); i++) {HashMap map = (HashMap) list.get(i);System.out.println(map.toString());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
Log.java
package com.edu.utils;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class Log {static Logger logger = LogManager.getLogger(Log.class);public static void fatal(String msg) {logger.fatal(msg);}public static void error(String msg) {logger.error(msg);}public static void warn(String msg) {logger.warn(msg);}public static void info(String msg) {logger.info(msg);}public static void debug(String msg) {logger.debug(msg);}
}
ReadPro.java
package com.edu.utils;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;public class ReadPro {public static final String filePath="conf/conf.properties";public static String getPropValue(String key) {Properties prop = new Properties();FileInputStream fis;try {fis = new FileInputStream(filePath);prop.load(fis);fis.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return prop.getProperty(key);}
}
ResultSetHandler.java
package com.edu.utils;import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class ResultSetHandler {static Logger log = LogManager.getLogger(ResultSetHandler.class.getName());public static List<Map<String, String>> toMapList(ResultSet rs){List<Map<String, String>> lst = new ArrayList<Map<String, String>>();ResultSetMetaData md;try{md = rs.getMetaData();String[] fieldNames = new String[md.getColumnCount()];for(int i=1;i<=fieldNames.length;i++){fieldNames[i-1] = md.getColumnLabel(i).toLowerCase();}while(rs.next()){Map<String, String> map = new HashMap<String, String>();for (int i = 1; i <= fieldNames.length; i++) {if(8==md.getColumnType(i)){map.put(fieldNames[i-1],String.valueOf(rs.getDouble(i)));}else{map.put(fieldNames[i-1],rs.getString(i));}}lst.add(map);}}catch (Exception e){log.error(e.getMessage(),e);//throw(new BaseException(Errors.ERRORS_COMMON,new String[]{Errors.DBOPERATION_FORMATRESULT},e.getMessage(),e));}return lst;}//private static Logger log = Logger.getLogger(ResultSetHandler.class);public static Map<String, String> toMap(ResultSet rs){Map<String, String> map = new HashMap<String, String>();ResultSetMetaData md;try{md = rs.getMetaData();String[] fieldNames = new String[md.getColumnCount()];for(int i=1;i<=fieldNames.length;i++){fieldNames[i-1] = md.getColumnLabel(i).toLowerCase();}if(rs.next()){for (int i = 1; i <= fieldNames.length; i++) {if(8==md.getColumnType(i)){map.put(fieldNames[i-1],String.valueOf(rs.getDouble(i)));}else{map.put(fieldNames[i-1],rs.getString(i));}}}}catch (Exception e){log.error(e.getMessage(),e);//throw(new BaseException(Errors.ERRORS_COMMON,new String[]{Errors.DBOPERATION_FORMATRESULT},e.getMessage(),e));}return map;}public static List toStringArrayList(ResultSet rs) throws Exception{List<String[]> lst = new ArrayList<String[]>();ResultSetMetaData md = rs.getMetaData();int fieldCount = md.getColumnCount();while(rs.next()){String[] arr = new String[fieldCount];for (int i = 1; i <= fieldCount; i++) {arr[i-1] = rs.getString(i);}lst.add(arr);}return lst;}public static String toString(ResultSet rs) throws Exception{String str = "";ResultSetMetaData md = rs.getMetaData();int fieldCount = md.getColumnCount();if(rs.next()&&fieldCount>=1){           if(8==md.getColumnType(1)){str = String.valueOf(rs.getDouble(1));}else{str = rs.getString(1);}}return str;}public static List<Object[]> toObjectArrayList(ResultSet rs){List<Object[]> lst = new ArrayList<Object[]>();ResultSetMetaData md;try{md = rs.getMetaData();int fieldCount = md.getColumnCount();while(rs.next()){Object[] arr = new Object[fieldCount];for (int i = 1; i <= fieldCount; i++) {arr[i-1] = rs.getObject(i);}lst.add(arr);}        }catch (SQLException e){//log.error(e.getMessage(),e);//throw(new BaseException(Errors.ERRORS_COMMON,new String[]{Errors.DBOPERATION_FORMATRESULT},e.getMessage(),e));}return lst;}public List<String> getFieldList(ResultSet rs) {ResultSetMetaData md;List<String> list = null;try{md = rs.getMetaData();list = new ArrayList<String>();for(int i=1;i<=md.getColumnCount();i++){list.add(md.getColumnLabel(i).toLowerCase());}}catch (SQLException e){log.error(e.getMessage(),e);}return list;}
}
ResultVerifier.java
package com.edu.utils;public class ResultVerifier {public static boolean verifyStringsByEqual(final String expectedValue, final String actualValue) {return expectedValue != null && expectedValue.equals(actualValue);}public static boolean verifyStringsByEqualAndExist(final String expectedValue, final String actualValue) {boolean flag=false;if(expectedValue != null && expectedValue.equals(actualValue)){flag=true;return flag;}if(expectedValue != null && actualValue.contains(expectedValue)){flag=true;return flag;}return flag;}public static void main(String args[]){System.out.print(ResultVerifier.verifyStringsByEqualAndExist("hello", "hello world"));}
}
com.edu.test
LoginTest.java
package com.edu.test;import org.testng.annotations.Test;import com.alibaba.fastjson2.JSONObject;
import com.edu.core.ApiListener;
import com.edu.core.HttpDriver;
import com.edu.dataprovider.NSDataProvider;
import com.edu.utils.Checker;public class LoginTest {String login_url = "/common/fgadmin/login";Checker check = null;public void login(Object phoneArea, Object phoneNumber, Object password) {JSONObject user = new JSONObject();user.put("phoneArea", phoneArea);user.put("phoneNumber", phoneNumber);user.put("password", password);String result = HttpDriver.doPost(login_url, user);System.out.println(result);check = new Checker(result);}@Testpublic void testLoginSuccess() throws Exception {login("86", "2000", "123456");check.verifyTextPresent("message");check.verifyXpath("code", "200");}}
src-log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn"><Appenders><Console name="Console" target="SYSTEM_ERR"><PatternLayout pattern="[%-5p] %d %c - %m%n" /></Console><File name="File" fileName="dist/my.log"><PatternLayout pattern="[%-5p] %d %c - %m%n" /></File></Appenders><Loggers><Root level="WARN"><AppenderRef ref="File" /><AppenderRef ref="Console" /></Root></Loggers>
</Configuration>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 fatal 错误到 sync.Map:Go中 Map 的并发策略

为什么 Go 语言在多个 goroutine 同时访问和修改同一个 map 时&#xff0c;会报出 fatal 错误而不是 panic&#xff1f;我们该如何应对 map 的数据竞争问题呢&#xff1f; 这篇文章将带你一步步了解背后的原理&#xff0c;并引出解决 map 并发问题的方案。 Map 数据竞争 首先…

node介绍

1.node是什么 Node是一个基于Chrome V8引擎的JS运行环境。 Node不是一个独立的语言、node不是JS框架。 Node是一个除了浏览器之外的、可以让JS运行的环境 Node.js是一个让JS运行在服务端的开发平台&#xff0c;是使用事件驱动&#xff0c;异步非阻塞I/O&#xff0c;单线程&…

【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲

Undertow web容器的入门实战及调优方案精讲 Undertow web容器Undertow 介绍官网API给出一句话概述Undertow&#xff1a;官网API总结特点&#xff1a;Lightweight&#xff08;轻量级&#xff09;HTTP Upgrade Support&#xff08;支持http升级&#xff09;、HTTP/2 Support支持H…

提升网站关键词排名的工具

随着互联网的蓬勃发展&#xff0c;网站的关键词排名成为衡量网站流量和曝光度的重要指标。在这个竞争激烈的数字时代&#xff0c;站在搜索引擎结果的前列变得至关重要。为了实现这一目标&#xff0c;合理利用关键词排名优化工具是必不可少的。本文将重点介绍147SEO软件&#xf…

《WebKit 技术内幕》之八(1):硬件加速机制

《WebKit 技术内幕》之八&#xff08;1&#xff09;&#xff1a;硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页&#xff0c;因为GPU的作用主要是用来绘制3D图形并且性能特别好&#xff0c;这是它的专长所在&#xff0c;它…

腾讯云tsf平台-部署微服务项目

腾讯云tsf平台-部署微服务项目 一、腾讯云tsf平台简介二、部署准备0&#xff08;数据库、中间件等部署&#xff09;三、部署准备1&#xff08;创建集群和命名空间&#xff09;1、准备部署资源--集群2、使用容器部署微服务步骤 1&#xff1a;创建容器集群步骤 2&#xff1a;创建…

canvas绘制六芒星

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

计算机网络——运输层(2)暨小程送书

计算机网络——运输层&#xff08;2&#xff09;暨小程送书 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 运输层&#xff08;2&#xff09;TCP/IP对比TCP&#xff08;传输控制协议&#xff09;&#xff1a;IP&#xff08;互联网协议&#xff09;&#xff1a;总结 拥塞…

一.初识Linux 1-3操作系统概述Linux初识虚拟机介绍

目录 一.初识Linux 1.操作系统概述 计算机组成 硬件&#xff1a; 软件&#xff1a; 操作系统&#xff1a; 操作系统工作流程 操作系统作用 常见的操作系统 PC端&#xff1a; 移动端&#xff1a;&#xff08;掌上操作系统&#xff09; 一.初识Linux 2.Linux初识 linu…

【微信小程序独立开发 5】后端搭建联调

前言&#xff1a;上节我们完成了个人信息页的编写&#xff0c;本节完成将个人信息发给后端&#xff0c;并由后端存储 创建Spring Boot项目 配置maven仓库 使用自己下载的maven版本 添加pom文件 <dependencies><dependency><groupId>org.springframework.boo…

【服务器】Xshell与Xftp软件的使用指南

目录 【Xshell软件】 1.1 Xshell软件的功能 1.2 Xshell软件的使用 【Xftp软件】 2.1 Xftp软件的功能 2.2 Xftp软件的使用 可替代产品【FinalShell】 3.1 FinalShell软件的使用 3.2 FinalShell连接服务器失败解决方法 可替代产品【FileZilla】

Java网络编程——UDP通信原理

一、TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信 TCPUDP协议名称传输控制协议用户数据包协议是否连接面向连接的协议。数据必须要建立连接无连接的协议&#xff0c;每个数据报中都给出完整的地址信息&#xff0c;因此不需要事先建立发送方和接受方的连接是…

Java面试题50道

文章目录 1.谈谈你对Spring的理解2.Spring的常用注解有哪些3.Spring中的bean线程安全吗4.Spring中的设计模式有哪些5.Spring事务传播行为有几种6.Spring是怎么解决循环依赖的7.SpringBoot自动配置原理8.SpringBoot配置文件类型以及加载顺序9.SpringCloud的常用组件有哪些10.说一…

toad 库中 iv 计算逻辑

merge 函数默认为决策树合并 决策树叶子结点默认值DEFAULT_BINS 10&#xff0c;可通过 n_bins 人为设置叶子结点数

Eureka整合seata分布式事务

文章目录 一、分布式事务存在的问题二、分布式事务理论三、认识SeataSeata分布式事务解决方案1、XA模式2、AT模式3、SAGA模式4.SAGA模式优缺点&#xff1a;5.四种模式对比 四、微服务整合Seata AT案例Seata配置微服务整合2.1、父工程项目创建引入依赖 2.2、Eureka集群搭建2.3、…

19万9的小米SU7已经彻底被否了

文 | AUTO芯球 作者 | 李诞 雷总 您是真不听劝啊 还要准备和米粉“干一架”啊 我和大家一样啊 这下好了 19万9的小米SU7已经彻底被否了 说实话 我心理真不是滋味 毕竟大家都说了&#xff0c; 9.9是雷爹&#xff0c;9万9是雷帝&#xff0c;15w是雷神 19万是雷总&#x…

Java开发工具:IntelliJ IDEA 2023 for Mac中文激活

IntelliJ IDEA 2023是一款由JetBrains开发的强大的集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;适用于多个编程语言。它旨在提高开发人员的生产力和代码质量。 软件下载&#xff1a;Java开发工具&#xff1a;IntelliJ IDEA 2023 for Mac中文激活 IntelliJ IDEA 20…

[Java面试]JavaSE知识回顾

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理Java面试中JavaSE中会涉及到的知识点 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x…

设计螺栓长度的基本原理和细节考虑——SunTorque智能扭矩系统

螺栓长度通常是指从螺栓头部到底部的整体长度。在选择或设计螺栓长度时&#xff0c;需要考虑多个因素&#xff0c;如被连接件的材料、厚度、螺栓间距以及预紧力等。设计螺栓长度应注意哪些原则和细节&#xff0c;SunTorque智能扭矩系统和大家一起来了解。设计螺栓长度的基本原则…

每日一题——LeetCode1304.和为零的N个不同整数

方法一 个人方法 n为偶数&#xff0c;只要同时放入一个数的正数和负数&#xff0c;那么和总为0&#xff0c;n是奇数就放入一个0&#xff0c;剩下的当偶数看待 var sumZero function(n) {let res[]if(n%2!0){res.push(0)n--}nn/2for(let i1;i<n;i){res.push(i)res.push(-i…