首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过OpenCVS实现对CSV数据的封装

通过OpenCVS实现对CSV数据的封装

作者头像
Antony
发布2020-12-02 10:30:10
发布2020-12-02 10:30:10
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

需求:

一般CSV文件都作为系统基础数据提供者的角色被频繁使用者。如果在进行自动化测试时,测试用例中的数据非常依赖于SUT中的上下文基础数据,而这些基础数据又是通过CSV文件导入到SUT之中。那么,考虑将这些CSV文件中遴选出部分必须的,导入到测试框架中,作为测试框架的基础数据存在并供下游用例使用。据此,则可简单实现所谓的单一数据源(Single Source Of Truth),即使后期CSV文件中的变化了,SUT/测试用例也可以照常执行,提高了通用性,降低了维护成本。

思路:

与通过xstream 将 xml文件转换成java 对象类似,利用工具将csv文件也转换为java 对象。能实现此类功能的第三方工具包比较多,这里采用的是opencsv。 它的官方网站是:http://opencsv.sourceforge.net。

实现:

1. 核心CSV解析代码

代码语言:javascript
代码运行次数:0
运行
复制
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.bean.CsvToBean;
import au.com.bytecode.opencsv.bean.HeaderColumnNameMappingStrategy;
public class CSVDigester {
   public static extends BaseBean> List parseCSV2Bean (String filename,Class type){  //文件名字和需要转换的目标类作为入参。
       List list =null;
       try {
           CSVReader reader = new CSVReader(new FileReader(filename), ',', '"'); //每条记录以逗号分隔数据, 并以'\'作为行结束符。
           HeaderColumnNameMappingStrategy mappingStrategy =
          new HeaderColumnNameMappingStrategy();
           mappingStrategy.setType(type);
           CsvToBean csv = new CsvToBean();
       list = csv.parse(mappingStrategy, reader);  //数据被按行解析并存入list
       } catch (FileNotFoundException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       return list;
   }
}

由此,实现了csv文件向List的java 对象的转化。我们再来看它是如何使用的。

2 定义对应java bean类

代码语言:javascript
代码运行次数:0
运行
复制
public class Employee {
private int id;
 private String name;
 private String role;
 private String salary;
 
public int getId() {
 return id;
 }
public void setId(int id) {
 this.id = id;
 }
public String getName() {
 return name;
 }
public void setName(String name) {
 this.name = name;
 }
public String getRole() {
 return role;
 }
public void setRole(String role) {
 this.role = role;
 }
public String getSalary() {
 return salary;
 }
public void setSalary(String salary) {
 this.salary = salary;
 }

3 测试框架中提供统一数据源

代码语言:javascript
代码运行次数:0
运行
复制
public class Beans {
private static List< Employee > employeeBeans;
public static List< Employee > getEmployeeBeans() {
   return employeeBeans;
}  //提供该Employee数据源的对外访问接口。
private static void setEmployeeBeans (
       List< Employee > employeeBeans) {
   Beans. employeeBeans = employeeBeans;
}
 
 
static { 
   System.out.println("now parsing Employee.csv");
   setEmployeeBeans(CSVDigester.parseCSV2Bean("Employee.csv", Employee.class));  //测试框架初始化时读入该数据。
}
}

如果有大量的CSV文件需要解析,则在Beans的静态块中使用类似操作即可。

3 测试框架使用该数据源

通过以上的操作,已经将针对CSV文件的操作转换成了对List employeeBeans 的操作。通过有针对性的将一些通用的操作封装成方法,则简化测试用例的自动化实现和代码的复用性。 譬如查询某个employee是否存在等等,具体的代码例子这里就不举了,读者可自行实现。

**原文写于2014-06-04 ,新浪博客

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档