添加数据驱动工具

This commit is contained in:
彭宇琦 2020-06-19 19:16:38 +08:00
parent 4739333623
commit 4a38428371
8 changed files with 315 additions and 18 deletions

View File

@ -87,7 +87,7 @@
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.3.0</version>
<version>4.5.1</version>
</dependency>
<dependency>

View File

@ -0,0 +1,149 @@
package pres.auxiliary.tool.http;
/**
* <p><b>文件名</b>EasyHttp.java</p>
* <p><b>用途</b>
* 可用于进行简单的接口请求
* </p>
* <p><b>编码时间</b>2020年6月18日上午7:02:54</p>
* <p><b>修改时间</b>2020年6月18日上午7:02:54</p>
* @author 彭宇琦
* @version Ver1.0
*
*/
public class EasyHttp {
/**
* 存储指定的请求方式
*/
private RequestType requestType;
/**
* 存储接口请求地址及相应拼接的参数用于最终请求
*/
private StringBuilder url = new StringBuilder();
/**
* 存储接口请求协议
*/
private String agreement = "http://";
/**
* 存储主机IP或者域名
*/
private String host = "";
/**
* 存储端口
*/
private String port = "";
/**
* 存储接口路径
*/
private String address = "";
/**
* 用于设置请求方式传入请求方式枚举类{@link RequestType}
* @param requestType {@link RequestType}枚举类
* @return 类本身
*/
public EasyHttp requestType(RequestType requestType) {
this.requestType = requestType;
return this;
}
/**
* 指定接口请求url当未指定协议时将默认以http为请求协议
* @param host 请求url
* @return 类本身
*/
public EasyHttp url(String url) {
String inter = "";
String pram = "";
//替换中文冒号为英文冒号
inter.replaceAll("", ":");
//判断传入的url是否存在参数
if (url.indexOf("?") > -1) {
inter = url.substring(0, url.indexOf("?"));
pram = url.substring(url.indexOf("?") + 1);
} else {
inter = url;
}
//判断传参是否包含协议若未包含则默认拼接http
int index = inter.indexOf("://");
if (index > -1) {
agreement(inter.substring(0, index + "://".length()));
//裁剪协议
inter = inter.substring(index + "://".length());
}
//按照/符号拆分IP及端口
if((index = inter.indexOf("/")) > -1) {
//获取接口地址
address(inter.substring(index));
//裁剪接口地址
inter = inter.substring(0, index);
}
//判断获取的ip是否包含冒号若包含冒号则按照冒号切分ip及端口
if ((index = inter.indexOf(":")) > -1) {
port(inter.substring(index + 1));
host(inter.substring(0, index));
} else {
host(inter);
//若其中未包含冒号则表示端口为80
port("80");
}
return this;
}
/**
* 用于设置接口请求协议默认为http://
* @param agreement 协议
* @return 类本身
*/
public EasyHttp agreement(String agreement) {
this.agreement = agreement;
return this;
}
/**
* 用于设置接口请求的IP或域名
* @param host IP或域名
* @return 类本身
*/
public EasyHttp host(String host) {
this.host = host;
return this;
}
/**
* 用于设置接口路径
* @param host 接口路径
* @return 类本身
*/
public EasyHttp address(String address) {
this.address = address;
return this;
}
/**
* 用于设置端口号
* @param port 端口号
* @return 类本身
*/
public EasyHttp port(String port) {
this.port = port;
return this;
}
/**
* 返回设置的url
* @return url
*/
public String getUrlString() {
url.delete(0, url.length());
return url.append(agreement).append(host).append(":" + port).append(address).toString();
}
}

View File

@ -0,0 +1,23 @@
package pres.auxiliary.tool.http;
/**
* <p><b>文件名</b>RequestType.java</p>
* <p><b>用途</b>
* 定义接口请求的方式
* </p>
* <p><b>编码时间</b>2020年6月17日下午7:50:54</p>
* <p><b>修改时间</b>2020年6月17日下午7:50:54</p>
* @author 彭宇琦
* @version Ver1.0
*
*/
public enum RequestType {
/**
* get请求
*/
GET,
/**
* post请求
*/
POST;
}

View File

@ -4,6 +4,17 @@ import pres.auxiliary.tool.date.Time;
import pres.auxiliary.tool.randomstring.RandomString;
import pres.auxiliary.tool.randomstring.StringMode;
/**
* <p><b>文件名</b>Functions.java</p>
* <p><b>用途</b>
* 提供部分默认的函数在编写数据驱动时可直接调用相应的方法
* </p>
* <p><b>编码时间</b>2020年6月16日下午7:25:36</p>
* <p><b>修改时间</b>2020年6月16日下午7:25:36</p>
* @author
* @version Ver1.0
*
*/
public class Functions {
/**
* <p>
@ -85,11 +96,34 @@ public class Functions {
/**
* <p>
* 定义对指定时间处理函数
* 定义对指定时间处理的函数用法<br>
* ${time(时间, 增减时间方式)}
* </p>
* @return 处理后的时间
* <p>
* <b>参数解释</b>
* </p>
* <p>
* <b>时间</b>指定的时间可传入年允许只传入也允许只传入
* 当只传入表示当前日期的0时0分0秒当只传入表示当天日期的时间当传入
* 完整的时间时之间用空格隔开<br>
* 之间允许使用的分隔符有或月或日/\.-<br>
* 之间允许使用的分隔符有或分或秒:<br>
* <b>增减时间方式</b>指定对时间进行增减的方式使用英文单位表示需要操作的内容包括
* ymwdh小时smin分钟不带符号表示增加时间-符号
* 表示减少时间允许传入小数允许使用连续式每个单位之间没有顺序允许一个单位传入多个9d-2d-5m8y-3.66min
*
* <p>
* <b>示例</b><br>
* ${time(2020-06-08 11:20:12, 1d)}表示生成2020-06-08 11:20:12增加1天的时间<br>
* ${time(2020年06月08日 11时20分12秒, -1d2.3y)}表示生成2020年06月08日 11时20分12秒减少一天并增加2.3年的时间<br>
* ${time(2020-06-08,1d)}表示生成2020-06-08 00:00:00增加1天的时间<br>
* ${time(11:20:12, 1h)}表示生成当天11:20:12增加1天的时间<br>
* </p>
* <p>
* <b>注意</b>计算小数点的日期时可能存在精度丢失计算跨度越大精度丢失越多
* </p>
* @return {@link DataDriverFunction}类对象
*/
public static DataDriverFunction getTime() {
//定义规则
String regex = "time\\(((\\d{4}[-\\.年\\\\/][01]?\\d[-\\.月\\\\\\/][0123]?\\d日?"
@ -109,8 +143,29 @@ public class Functions {
}
/**
* 定义对当前时间处理函数
* @return 处理后的时间
* <p>
* 定义对当前时间处理的函数用法<br>
* ${time(增减时间方式)}
* </p>
* <p>
* <b>参数解释</b>
* </p>
* <p>
* <b>增减时间方式</b>指定对时间进行增减的方式使用英文单位表示需要操作的内容包括
* ymwdh小时smin分钟不带符号表示增加时间-符号
* 表示减少时间允许传入小数允许使用连续式每个单位之间没有顺序允许一个单位传入多个9d-2d-5m8y-3.66min
* 该参数允许不传当不传入该参数时返回为当前时间
*
* <p>
* <b>示例</b><br>
* ${time(1d)}表示生成当前时间增加1天的时间<br>
* ${time(-1d2.3y)}表示生成当前时间减少一天并增加2.3年的时间<br>
* ${time()}表示生成当前时间<br>
* </p>
* <p>
* <b>注意</b>计算小数点的日期时可能存在精度丢失计算跨度越大精度丢失越多
* </p>
* @return {@link DataDriverFunction}类对象
*/
public static DataDriverFunction getNowTime() {
//定义规则

View File

@ -2,6 +2,7 @@ package pres.auxiliary.work.selenium.datadriven;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -34,6 +35,9 @@ import pres.auxiliary.tool.date.Time;
* </pre>
* 从数据驱动中读取到的数据有${test}${select(1)}则按照字符串的形式输出后分别得到HelloWorldfunction1
* </p>
* <p>
* 除自定义函数外构造类时将默认加载部分函数可直接调用详见{@link Functions}
* </p>
* <p><b>编码时间</b>2020年6月3日上午7:04:51</p>
* <p><b>修改时间</b>2020年6月3日上午7:04:51</p>
* @author 彭宇琦
@ -55,13 +59,26 @@ public class TestNGDataDriver {
* 用于存储自定义的公式
*/
private HashMap<String, DataFunction> dataFunctionMap = new HashMap<>(16);
/**
* 用于对日期格式或特殊字段输入的日期进行转换
*/
private Time time = new Time();
/**
* 构造类并将默认的数据驱动函数{@link Functions}加载至类中
*/
public TestNGDataDriver() {
//构造Functions通过反射将所有Functions中的所有方法执行并添加至dataFunctionMap中
Functions functions = new Functions();
for (Method method : functions.getClass().getDeclaredMethods()) {
try {
addFunction((DataDriverFunction) method.invoke(functions));
} catch (Exception e) {
}
}
}
/**
* 用于返回数据驱动中列表的元素个数即当前数据驱动中最大行元素个数
* @return 列元素个数
@ -181,15 +198,15 @@ public class TestNGDataDriver {
//将rowDataList之前的列都置为空串
int oldListSize = dataList.get(rowInde - 1).dataList.size();
for (int index = 0; index < oldListSize - rowDataList.size(); index++) {
data.dataList.add("");
data.addData("");
}
}
//存储数据
rowDataList.forEach(data.dataList :: add);
rowDataList.forEach(data :: addData);
dataList.add(data);
} else {
rowDataList.forEach(dataList.get(rowInde).dataList :: add);
rowDataList.forEach(dataList.get(rowInde) :: addData);
}
}
@ -241,7 +258,6 @@ public class TestNGDataDriver {
* @return 字符串形式的数据
*/
public String getString(int index) {
return index < dataList.size() ? disposeContent(dataList.get(index)) : "";
}
@ -359,6 +375,14 @@ public class TestNGDataDriver {
return new Time(getString(listName));
}
/**
* 用于添加元素
* @param content 元素内容
*/
private void addData(String content) {
dataList.add(disposeContent(content));
}
/**
* 用于处理读取得到的内容并将处理后的内容进行返回
* @param content 读取的内容

View File

@ -10,6 +10,9 @@ import java.util.Date;
import org.testng.annotations.Test;
import pres.auxiliary.tool.randomstring.RandomString;
import pres.auxiliary.tool.randomstring.StringMode;
public class TimeTest {
Time time = new Time();
@ -42,6 +45,10 @@ public class TimeTest {
time = new Time();
time.addTime("-90d+1min");
System.out.println(time.getFormatTime());
Time time = new Time();
time.setTimeFormat("2020-05-32 HH:mm:ss");
time.addTime("-" + new RandomString(StringMode.NUM).toString(2, 4) + "s");
}
/**

View File

@ -0,0 +1,38 @@
package pres.auxiliary.tool.http;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
public class EasyHttpTest {
EasyHttp eh = new EasyHttp();
@AfterMethod
public void showUrl() {
System.out.println(eh.getUrlString());
}
@Test
public void urlTest_All() {
eh.url("http://127.0.0.1:8080/a/b");
}
@Test
public void urlTest_NotAgreement() {
eh.url("127.0.0.1:8080/a/b");
}
@Test
public void urlTest_NotPort() {
eh.url("http://127.0.0.1/a/b");
}
@Test
public void urlTest_NotAddress() {
eh.url("http://127.0.0.1:8080");
}
@Test
public void urlTest_Host() {
eh.url("http://www.hao123.com/a/b");
}
}

View File

@ -15,22 +15,21 @@ import pres.auxiliary.work.selenium.datadriven.TestNGDataDriver.Data;
public class TestNGDataDriverTest {
TestNGDataDriver testNGData = new TestNGDataDriver();
File docxFile = new File("src/test/java/pres/auxiliary/work/selenium/datadriven/Test.docx");
File xlsxFile = new File("src/test/java/pres/auxiliary/work/selenium/datadriven/AddTest.xlsx");
File functionFile = new File("src/test/java/pres/auxiliary/work/selenium/datadriven/Functions.xlsx");
/**
* 测试{@link TestNGDataDriver#addExcelData(java.io.File, String, boolean)}方法
* @throws IOException
*/
@BeforeClass
public void initData() throws IOException {
File docxFile = new File("src/test/java/pres/auxiliary/work/selenium/datadriven/Test.docx");
File xlsxFile = new File("src/test/java/pres/auxiliary/work/selenium/datadriven/AddTest.xlsx");
File functionFile = new File("src/test/java/pres/auxiliary/work/selenium/datadriven/Functions.xlsx");
String patten = SplitType.SPLIT_TAB.getSplitSign();
String sheetName = "Sheet1";
testNGData.addDataDriver(docxFile, patten, true);
testNGData.addDataDriver(xlsxFile, sheetName, true);
testNGData.addDataDriver(functionFile, "Sheet1", true);
}
@AfterMethod
@ -66,7 +65,8 @@ public class TestNGDataDriverTest {
*/
@Test
public void addFunctiontest_Functions_Rs() throws IOException {
testNGData.addFunction(Functions.randomString());
// testNGData.addFunction(Functions.randomString());
testNGData.addDataDriver(functionFile, "Sheet1", true);
}
/**
@ -77,5 +77,6 @@ public class TestNGDataDriverTest {
public void addFunctiontest_Functions_Time() throws IOException {
testNGData.addFunction(Functions.getNowTime());
testNGData.addFunction(Functions.getTime());
testNGData.addDataDriver(functionFile, "Sheet1", true);
}
}