当前位置: 首页 > news >正文

不同程序建的网站风格手机微信网站模板

不同程序建的网站风格,手机微信网站模板,h5开发网站,新浪企业邮箱章节目录#xff1a; 一、背景介绍二、前置准备三、设计思路四、代码具体实现五、执行效果六、其他说明七、结束语 一、背景介绍 有哪些用例是可以通用且固定的#xff1f; 针对之前提到的接口用例设计思路#xff0c;拆分为三个切入点#xff1a; 举个例子#xff1a; {… 章节目录 一、背景介绍二、前置准备三、设计思路四、代码具体实现五、执行效果六、其他说明七、结束语 一、背景介绍 有哪些用例是可以通用且固定的 针对之前提到的接口用例设计思路拆分为三个切入点 举个例子 {field: value }针对这个字符串类型的入参我们可以设计 当前数据类型入参例如空串空格字符特殊字符字符个数上下限等。非当前数据类型入参例如整型、浮点类型、布尔类型等。特殊值0、null值等。 二、前置准备 运行数据工厂的前提条件。 java 开发及运行环境。maven 构建工具。使用到的依赖 dependencies!--解析 json--dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.76/version/dependency!--操作 excel 文件--dependencygroupIdorg.apache.poi/groupIdartifactIdpoi/artifactIdversion4.1.2/version/dependencydependencygroupIdorg.apache.poi/groupIdartifactIdpoi-ooxml/artifactIdversion4.1.2/version/dependency/dependencies三、设计思路 工具类之间是如何交互的。 包层级目录 ---java | \---com | \---example | \---myproject | ---boot | | Launcher.java | | | ---core | | DataFactory.java | | | ---pojo | | WriteBackData.java | | | \---util | CaseUtils.java | ExcelUtils.java | FileUtils.java | JsonPathParser.java | JsonUtils.java | \---resourcesrequest.jsonTestCase.xls 脚本执行的主流程 四、代码具体实现 Launcher启动类 package com.example.myproject.boot;import com.alibaba.fastjson.JSONObject; import com.example.myproject.core.DataFactory;/*** 执行入口。** author Jan* date 2023/08*/ public class Launcher {public static void main(String[] args) throws Exception {// 这里支持传入自定义的用例拓展字段 - new JSONObject() 。DataFactory.runAndCreateTestCases(null);} } DataFactory核心类 package com.example.myproject.core;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONPath; import com.example.myproject.pojo.WriteBackData; import com.example.myproject.util.*;import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*;/*** 数据工厂。** author Jan* date 2023/08*/ public class DataFactory {private DataFactory() {}/*** 回写数据的集合。*/private static final ListWriteBackData WRITE_BACK_DATA new ArrayList();/*** 运行和创建测试用例。** param ext ext 额外的拓展参数。* throws Exception 异常。*/public static void runAndCreateTestCases(JSONObject ext) throws Exception {// 获取请求示例。String jsonStr FileUtils.readSampleRequest();// 解析json的字段数据类型及jsonPath。SetString jsonPaths JsonPathParser.getJsonPaths(jsonStr);for (String jsonPath : jsonPaths) {// 字段数据类型。String filedDataType JSONPath.read(jsonStr, jsonPath).getClass().getSimpleName();// 跳过复合类型。if (JSONObject.equals(filedDataType)) {continue;}// 字段名。String[] split jsonPath.split(\\.);String filedName split[split.length - 1];// 通过反射生成对应数据类型的测试用例。ListObject caseValues DataFactory.getObjectArrayFromReflectType(CaseUtils.class, filedDataType);MapString, String caseNameAndRequestValueMap new HashMap();for (Object value : caseValues) {String caseName CaseUtils.createSpecifyCaseNameByCaseValue(filedName, value);// 修改字段值。JSONObject jsonObject JsonUtils.checkAndSetJsonPathValue(jsonStr, jsonPath, value);caseNameAndRequestValueMap.put(caseName, jsonObject.toJSONString());}for (Map.EntryString, String entry : caseNameAndRequestValueMap.entrySet()) {String caseName entry.getKey();String requestValue ;if (null ! ext) {// 额外参数。ext.put(title, caseName);ext.put(case, JSON.parseObject(entry.getValue()));requestValue ext.toJSONString();} else {requestValue entry.getValue();}WRITE_BACK_DATA.add(new WriteBackData(caseName, requestValue));}}System.out.println(组装完成的用例数为 WRITE_BACK_DATA.size());//开始回写ExcelUtils.initFileAndWriteDataToExcel(WRITE_BACK_DATA);}/*** 通过反射获取用例集合。** param clazz clazz* param type 类型* return {link List}{link Object}* throws NoSuchMethodException 没有这样方法异常。* throws InvocationTargetException 调用目标异常。* throws InstantiationException 实例化异常。* throws IllegalAccessException 非法访问异常。*/private static ListObject getObjectArrayFromReflectType(Class? extends CaseUtils clazz, String type) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Object obj clazz.getConstructor().newInstance();String methodName get type TypeCases;Method method clazz.getDeclaredMethod(methodName);Object invoke method.invoke(obj);int length Array.getLength(invoke);ListObject caseValues new ArrayList();for (int i 0; i length; i) {caseValues.add(Array.get(invoke, i));}return caseValues;} } WriteBackData封装回写信息 package com.example.myproject.pojo;/*** 回写对象。** author Jan* date 2023/08*/ public class WriteBackData {/*** 用例名称。*/private String caseName;/*** 操作步骤。即用例报文*/private String step;public WriteBackData(String caseName, String step) {this.caseName caseName;this.step step;}public String getCaseName() {return caseName;}public void setCaseName(String caseName) {this.caseName caseName;}public String getStep() {return step;}public void setStep(String step) {this.step step;} } CaseUtils静态存放用例设计 package com.example.myproject.util;import java.util.Arrays; import java.util.Collections;/*** 测试用例。** author Jan* date 2023/08*/ public class CaseUtils {private static final String STRING string;private static final String INTERFACE [接口名];/*** 字符串类型用例。* 空串、空格字符、特殊字符、整型、精度类型、null值。** return {link Object[]}*/public static Object[] getStringTypeCases() {return new Object[]{, , , -1, -1.1, null};}/*** 整数类型用例。* 字符串类型、特殊值0、负数值、整型较大值、整型边界值、精度类型、null值。** return {link Object[]}*/public static Object[] getIntegerTypeCases() {return new Object[]{STRING, 0, -1, 2147483647, 2147483648L, -1.1, null};}/*** 长整型用例。* 字符串类型、特殊值0、负数值、精度类型、null值、长整型边界值。** return {link Object[]}*/public static Object[] getLongTypeCases() {return new Object[]{STRING, 0, -1, -1.1, null, 9223372036854775807L};}/*** 浮点类型用例。* 字符串类型、负精度值、负整数值、null值、三位小数。** return {link Object[]}*/public static Object[] getBigDecimalTypeCases() {return new Object[]{STRING, -1.1, -1, 0, null, 999.999D};}/*** 布尔类型用例。* 字符串类型、负精度值、负整数值、特殊值0、null值、真布尔、假布尔。** return {link Object[]}*/public static Object[] getBooleanTypeCases() {return new Object[]{STRING, -1, -1.1, 0, null, true, false};}/*** 集合类型用例。* 字符串类型、负精度值、null值、负整数值、空集合、混合类型。** return {link Object[]}*/public static Object[] getJSONArrayTypeCases() {return new Object[]{Collections.singletonList(STRING),Collections.singletonList(-1.1),Collections.singletonList(null),Collections.singletonList(-1),Collections.emptyList(),Arrays.asList(STRING, -1, -1.1)};}/*** 创建指定用例名。** param baseName 基本名称。* param value 值。* return {link String}*/public static String createSpecifyCaseNameByCaseValue(String baseName, Object value) {String caseName ;if (.equals(value)) {caseName INTERFACE baseName -传空 .trim();} else if ( .equals(value)) {caseName INTERFACE baseName -传空格 .trim();} else if (.equals(value)) {caseName INTERFACE baseName -传特殊符号\\ .trim();} else if (null.equals(value)) {caseName INTERFACE baseName -特殊值null .trim();} else if (STRING.equals(value)) {caseName INTERFACE baseName -传字符类型\string\ .trim();} else if ([string].equals(value)) {caseName INTERFACE baseName -传字符串值类型集合 .trim();} else if ([-1.1].equals(value)) {caseName INTERFACE baseName -传精度值类型集合 .trim();} else if ([null].equals(value)) {caseName INTERFACE baseName -传null值集合 .trim();} else if ([-1].equals(value)) {caseName INTERFACE baseName -传整型值类型集合 .trim();} else if ([].equals(value)) {caseName INTERFACE baseName -传空集合 .trim();} else if ([string, -1, -1.1].equals(value)) {caseName INTERFACE baseName -传混合数据类型集合 .trim();} else {caseName INTERFACE baseName -传 value .trim();}return caseName;}} ExcelUtilsexcel 操作 package com.example.myproject.util;import com.example.myproject.pojo.WriteBackData; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.List;/*** Excel 操作。** author Jan* date 2023/08*/ public class ExcelUtils {private ExcelUtils() {}/*** 写出路径。*/private static final String OUT_PATH src/main/resources;/*** 工作表名。*/private static final String SHEET_NAME testCase;/*** 用例写入resource目录。** param writeBackDataList 回写数据列表。*/public static void initFileAndWriteDataToExcel(ListWriteBackData writeBackDataList) {File filePath new File(OUT_PATH);FileUtils.initTestCaseFile(filePath);String testCaseFilePath filePath File.separator FileUtils.getFileName();ExcelUtils.writeExcel(writeBackDataList, testCaseFilePath);System.out.println( 用例写入完成);}/*** 写入。** param dataList 数据列表。* param filePath 文件路径。*/private static void writeExcel(ListWriteBackData dataList, String filePath) {try (XSSFWorkbook workbook new XSSFWorkbook();OutputStream out new FileOutputStream(filePath)) {XSSFSheet sheet workbook.createSheet(SHEET_NAME);// 第一行表头。XSSFRow firstRow sheet.createRow(0);XSSFCell[] cells new XSSFCell[3];String[] titles new String[]{用例名称,用例编号,操作步骤(生成用例后,记得将\null\替换为null,9223372036854775807替换为9223372036854775808)};// 循环设置表头信息。for (int i 0; i 3; i) {cells[0] firstRow.createCell(i);cells[0].setCellValue(titles[i]);}// 遍历数据集合,将数据写入 Excel 中。for (int i 0; i dataList.size(); i) {XSSFRow row sheet.createRow(i 1);WriteBackData writeBackData dataList.get(i);//第一列 用例名XSSFCell cell row.createCell(0);cell.setCellValue(writeBackData.getCaseName());//第二列 用例编号cell row.createCell(1);cell.setCellValue(i 1);//第三列 操作步骤cell row.createCell(2);cell.setCellValue(writeBackData.getStep());}workbook.write(out);} catch (Exception e) {e.printStackTrace();}} } FileUtils用例文件操作 package com.example.myproject.util;import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path;/*** 文件操作。** author Jan* date 2023/08*/ public class FileUtils {private FileUtils() {}/*** 生成的用例文件名。*/private static final String FILE_NAME TestCase.xls;/*** 读取文件流。** param inputStream 输入流。* return {link String}*/public static String readFileStream(InputStream inputStream) {StringBuilder sb new StringBuilder();try (BufferedReader reader new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {String line;while (null ! (line reader.readLine())) {sb.append(line);}} catch (IOException e) {e.printStackTrace();}return sb.toString();}/*** 读取请求示例。** return {link String}*/public static String readSampleRequest() {InputStream is FileUtils.class.getClassLoader().getResourceAsStream(request.json);return FileUtils.readFileStream(is);}/*** 用例文件名称。** return {link String}*/public static String getFileName() {return FILE_NAME;}/*** 初始化测试用例文件。** param filePath 文件路径。*/public static void initTestCaseFile(File filePath) {Path testFilePath filePath.toPath().resolve(getFileName());try {boolean deleted Files.deleteIfExists(testFilePath);System.out.println(deleted ? 初始化开始 旧用例删除成功 : 用例初始化开始 旧用例删除失败);} catch (NoSuchFileException e) {System.err.println(文件未找到 filePath);} catch (IOException e) {System.err.println(删除文件失败 e.getMessage());}try {Files.createFile(testFilePath);System.out.println(用例初始化结束 新用例创建成功);} catch (IOException e) {System.err.println(新用例创建失败 e.getMessage());}} } JsonPathParser递归解析得到叶子节点的 jsonPath package com.example.myproject.util;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.ParserConfig;import java.util.HashSet; import java.util.Map; import java.util.Set;/*** 解析 json 得到具体字段的 jsonPath。** author Jan* date 2023/08*/ public class JsonPathParser {static {// 设置全局白名单解析 pb3 中的 type 类型。ParserConfig.getGlobalInstance().setAutoTypeSupport(true);}private JsonPathParser() {}/*** 得到json路径。** param jsonStr json str* return {link Set}{link String}*/public static SetString getJsonPaths(String jsonStr) {// 解析JSON字符串为JSON对象。JSONObject jsonObj JSON.parseObject(jsonStr);// 存储JSONPath路径的集合。SetString jsonPaths new HashSet();// 递归遍历JSON对象的所有字段并提取出JSONPath路径。parseJsonObj(jsonObj, $, jsonPaths);return jsonPaths;}/*** 解析 json 对象。** param jsonObj json obj。* param parentPath 父路径。* param jsonPaths json路径。*/private static void parseJsonObj(JSONObject jsonObj, String parentPath, SetString jsonPaths) {for (Map.EntryString, Object entry : jsonObj.entrySet()) {String key entry.getKey();// 跳过PBv3的类型标识。if (key.contains(type)) {continue;}Object value jsonObj.get(key);String currPath parentPath . key;// 将当前字段的JSONPath路径添加到集合中。jsonPaths.add(currPath);if (value instanceof JSONObject) {// 递归处理嵌套的JSON对象。parseJsonObj((JSONObject) value, currPath, jsonPaths);} else if (value instanceof JSONArray) {// 递归处理嵌套的JSON数组。parseJsonArray((JSONArray) value, currPath, jsonPaths);}}}/*** 解析 json 数组。** param jsonArray json数组。* param parentPath 父路径。* param jsonPaths json路径。*/private static void parseJsonArray(JSONArray jsonArray, String parentPath, SetString jsonPaths) {for (int i 0; i jsonArray.size(); i) {// 只取集合中第一个元素的字段。if (0 i) {continue;}Object value jsonArray.get(i);String currPath parentPath [ i ];if (value instanceof JSONObject) {// 递归处理嵌套的JSON对象。parseJsonObj((JSONObject) value, currPath, jsonPaths);} else if (value instanceof JSONArray) {// 递归处理嵌套的JSON数组。parseJsonArray((JSONArray) value, currPath, jsonPaths);}}} } JsonUtils设置用例值 package com.example.myproject.util;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONPath;/*** 替换字段值。** author Jan* date 2023/08*/ public class JsonUtils {private JsonUtils() {}/*** 检查并设置json路径值。** param json json。* param jsonPath json路径。* param testCaseValue 测试用例价值。* return {link JSONObject}*/public static JSONObject checkAndSetJsonPathValue(String json, String jsonPath, Object testCaseValue) {JSONObject jsonObject null;try {jsonObject JSON.parseObject(json);// 还原直接替换值 testCaseValue。JSONPath.set(jsonObject, jsonPath, testCaseValue);} catch (Exception e) {System.err.println(error case: jsonPath);}return jsonObject;} } 五、执行效果 测试一下。 被测 json 串 {String:str,Int:1,Float:0.1,Long:622337203685477500,Bool:true,test:{Array:[]} }运行测试 生成的最终用例 六、其他说明 支持 protobuf v3 转换的 json type 类型。脚本用例生成的优点 高效率减少冗余操作。避免编写出因人为失误导致的错误用例。方便后期用例迭代。 综上所述在 json 字段较多的情况下提效尤为明显。源码地址https://gitee.com/Jan7/datafactory 七、结束语 “-------怕什么真理无穷进一寸有一寸的欢喜。” 微信公众号搜索饺子泡牛奶。
http://www.w-s-a.com/news/491735/

相关文章:

  • 制作网站报价工程项目查询哪个网站
  • 深圳移动网站建设制作公司网站建设的认识
  • 网站建设脚本语言有哪些想开网店哪个平台好
  • 视频网站用什么做的好深圳的小程序开发公司
  • 南京网站定制开发商城网站免费模板
  • 青海学会网站建设公司照片组合拼图
  • 中国建设银行福清分行网站爱站网权重查询
  • 外贸通网站建设网站建设7个主要流程图
  • 元气森林网络营销方式医疗网站优化怎么做
  • 手机网站制作报价表做网站公司做网站公司
  • 湖州网站设计吉林网站建设哪家好
  • 做存储各种环境信息的网站使用tag的网站
  • 阿里云用ip做网站网站开发员属于
  • 外链网盘下载南宁seo推广优化
  • 网站的推广方案有哪些此网站可能有
  • wordpress更改链接后网站打不开一键生成个人网站
  • 网站建设后台有哪些东西前端开发培训一般多少钱
  • 高端建设网站公司网站开发 源码
  • 企业网站的劣势园林景观设计公司简介范文
  • 网站建设程序招聘东营建设信息网登录
  • o2o是什么意思通俗讲seo与网站优化 pdf
  • 外贸网站外包一般建设一个网站多少钱
  • 抄袭别人网站的前端代码合法吗网络促销策略
  • 用wordpress制作网站做资源网站
  • wordpress 发布网站南宁网站建设网站
  • 职业生涯规划大赛心得贵阳哪家网站做优化排名最好
  • wordpress 图片懒加载北京网站优化和推广
  • 深圳网站建设工作一个dede管理两个网站
  • 被禁止访问网站怎么办中国建筑网官网查询系统
  • 网站管理运营建设网贷网站