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

【JAVA接口自动化】JAVA如何读取Yaml文件

java读取yaml文件 自动化测试中,用例数据存放在yaml文件中

数据存储

我们采用yaml存储数据文件 按照我下面的方式创建

 

yaml文件数据

接下来我们创建并构造三个yaml文件,用于我们在JAVA中进行读取yaml文件数据,依次创建yaml文件如下: person.yaml

---
id: 1
name: rebort
age: 18
---
id: 2
name: rebort-rebort
age: 19

 

person2.yaml

---
- id: 3name: 小rebortage: 18- id: 4name: 技巧工人age: 19

 

person3.yaml

---
- id: 5name: rebort大哥age: 18- id: 6name: 测试一下,干age: 19

 

接下来编写读取yaml文件的JAVA代码

public class Person {private String id;private String name;private String age;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"id='" + id + '\'' +", name='" + name + '\'' +", age='" + age + '\'' +'}';}
}

编写JAVA代码读取yaml文件数据,并返回对象

在编写读取文件代码之前,我们先将yaml文件读取所需要的依赖添加一下,我这里使用的是maven,所以我直接在pom.xml中添加 如下:

 

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.IOException;public class ReadDataFromYaml {public static Person getData(String path, Person p){ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());try {return objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), p.getClass());} catch (IOException e) {System.out.println("读取异常:" + e);}return null;}public static void main(String[] args) {Person p = new Person();p = getData("/caseData/person.yaml", p);System.out.println(p);if (p!=null){System.out.println(p.getId());System.out.println(p.getName());System.out.println(p.getAge());}}
}

运行代码后查看此时控制台的输出打印情况

可以看到我们已经读取到了yaml中的数据,并且打印在控制台显示 可以在控制台看到具体的数据信息

 

接下来我们优化了代码,使用优化:泛型,传字节码

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.IOException;public class ReadDataFromYaml {public static <T> T getData(String path, Class<T> clazz){ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());try {T obj = objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), clazz);return obj;} catch (Exception e) {System.out.println("异常:" + e);}return null;}public static void main(String[] args) {Person p = getData("/caseData/person.yaml", Person.class);System.out.println(p);if (p!=null){System.out.println(p.getId());System.out.println(p.getName());System.out.println(p.getAge());}}
}

再次查看此时控制台的输出打印,是不是同样也能看到输出的打印信息

 

如何读取yaml文件,并返回对象list,接下来我们将代码优化为返回list

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class ReadDataFromYaml {public static List<Person> getData(String path, List<Person> plist){ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());try {plist = objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), plist.getClass());return plist;} catch (IOException e) {System.out.println("读取异常:" + e);}return null;}public static void main(String[] args) {List<Person> plist = new ArrayList<Person>();plist = getData("/caseData/person2.yaml", plist);System.out.println(plist);}
}

运行代码此时查看控制台的输出打印情况

 

再次优化读取返回对象list的代码,使用泛型的方式,返回字节码

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.hwapitest.utils.Person;public class ReadDataFromYaml {public static <T> List<T> getData(String path, Class<T> clazz){ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());try {List<T> list = objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), List.class);return list;} catch (IOException e) {System.out.println("读取异常:" + e);}return null;}public static void main(String[] args) {List<Person> plist = new ArrayList<Person>();List<Person> plist1 = getData("/caseData/person2.yaml", Person.class);if ( plist1!=null){plist.addAll(plist1);}List<Person> plist2 = getData("/caseData/person2.yaml", Person.class);if ( plist2!=null){plist.addAll(plist2);}System.out.println(plist);}
}

再次运行代码,可以看到控制台输出打印结果

 

问题

上面可以把多个yaml的数据放到一个list里面

但是,如果打印对象内容(模拟解析测试用例数据)

public static void main(String[] args) {List<Person> plist = new ArrayList<Person>();List<Person> plist1 = getData("/caseData/person2.yaml", Person.class);if ( plist1!=null){plist.addAll(plist1);}List<Person> plist2 = getData("/caseData/person2.yaml", Person.class);if ( plist2!=null){plist.addAll(plist2);}System.out.println(plist);for (Person person : plist2) {System.out.println(person.getName());}
}

运行结果后会看到如下的报错情况

 

通过debug发现,list的元素是LinkedHashMap类型

 

解决方案:

装换位指定的类型

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;public class ReadDataFromYaml {public static List<Person> getData(String path) {ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());try {List list = objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), List.class);// 转成指定类型的list集合List<Person> list_new = objectMapper.convertValue(list, new TypeReference<List<Person>>() {});return list_new;} catch (Exception e) {System.out.println("异常:" + e);}return null;}public static void main(String[] args) {List<Person> plist = new ArrayList<Person>();List<Person> plist1 = getData("/caseData/person2.yaml");if ( plist1!=null){plist.addAll(plist1);}List<Person> plist2 = getData("/caseData/person3.yaml");if ( plist2!=null){plist.addAll(plist2);for (Person person : plist2) {System.out.println(person.getId());System.out.println(person.getName());System.out.println(person.getAge());}}System.out.println(plist);}
}

再次运行后可以看到打印输出多个文件的yaml数据

 

思考

上面解决方案中,我们把类型写死了,如果作为一个工具类,如何实现传任意类型?

 


文章转载自:

http://fh0uBvXv.qtzqk.cn
http://0p666zrB.qtzqk.cn
http://DXsRevao.qtzqk.cn
http://9q4lKqap.qtzqk.cn
http://lEsYotaF.qtzqk.cn
http://yg1QXS4W.qtzqk.cn
http://C09LegFQ.qtzqk.cn
http://DCd7phgS.qtzqk.cn
http://IrDNGjwS.qtzqk.cn
http://asmaoMqe.qtzqk.cn
http://MPu4RXnd.qtzqk.cn
http://l0LjILb6.qtzqk.cn
http://keWqRzTD.qtzqk.cn
http://U3gNSaXA.qtzqk.cn
http://7keClp0w.qtzqk.cn
http://khFnHAoK.qtzqk.cn
http://MifDF5uo.qtzqk.cn
http://gbJ6HRf6.qtzqk.cn
http://imwcdNVo.qtzqk.cn
http://VE7eanu4.qtzqk.cn
http://3slUkhVS.qtzqk.cn
http://GL4rYWh5.qtzqk.cn
http://i2dn13Iy.qtzqk.cn
http://7nozkKTh.qtzqk.cn
http://10Hzo7lM.qtzqk.cn
http://pe6c6xrX.qtzqk.cn
http://c3Dn6XR9.qtzqk.cn
http://OpDnfthD.qtzqk.cn
http://ZrREix1R.qtzqk.cn
http://X37vWCws.qtzqk.cn
http://www.dtcms.com/a/384346.html

相关文章:

  • Redis全面指南:从入门到精通
  • Word在WPS和Office中给图片添加黑色边框
  • C++ Lua组合拳:构建高性能系统配置管理框架
  • 数据库编程--完成简单的信息登录系统+思维导图
  • Spring Boot 深入剖析:SpringApplicationRunListener
  • 【新手指南】解析Laf.run上的GET API接口
  • 如何批量删除 iPhone/iPad 上的照片 [7 种方法
  • Spring Boot 日志体系全面解析:从 SLF4J 到 Logback、Log4j2 与 Lombok 超详细!!
  • springboot创建请求处理
  • 08-Redis 字符串类型全解析:从命令实操到业务场景落地
  • 学习海康VisionMaster之字符缺陷检测
  • CAD画图:002软件界面操作
  • 解锁全球业务潜能:AWS全球网络加速解决方案深度解析
  • HTTPS Everywhere 是什么?HTTPS 插件作用、iOS 抓包失败原因解析与常见抓包工具对比
  • 【C++】STL详解(七)—stack和queue的介绍及使用
  • 20250912在荣品RD-RK3588-MID开发板的Android13系统下拿掉卡迪屏的reset引脚的下拉复位波形
  • 在线图书借阅平台的设计与实现 —— 基于飞算JavaAI的实战开发全流程与优化实践
  • Git : 分支管理和远程仓库
  • 当传统金融遇上AI智能:AIStock系统深度技术解析
  • 大数据如何捕捉你的爱好?如何实现跨站用户行为分析?
  • 用OpenCV CSRT实现实时目标跟踪
  • 13.Linux OpenSSH 服务管理
  • 微算法科技(NASDAQ: MLGO)研发基于量子密钥图像的量子图像加密算法,提供更高安全性的图像保护方案
  • LAMP 环境部署
  • Java程序设计:Eclipse 安装和使用
  • ZooKeeper 集群高可用配置指南
  • 在天嵌 TQ3568 (Debian) 上配置并添加打印机教程
  • pcl封装10 get_area_form_boundary计算平面点云面积
  • 突破局域网限制:MongoDB远程管理新体验
  • C++学习:map/set源码剖析+利用红黑树封装map/set