需求:
一般CSV文件都作为系统基础数据提供者的角色被频繁使用者。如果在进行自动化测试时,测试用例中的数据非常依赖于SUT中的上下文基础数据,而这些基础数据又是通过CSV文件导入到SUT之中。那么,考虑将这些CSV文件中遴选出部分必须的,导入到测试框架中,作为测试框架的基础数据存在并供下游用例使用。据此,则可简单实现所谓的单一数据源(Single Source Of Truth),即使后期CSV文件中的变化了,SUT/测试用例也可以照常执行,提高了通用性,降低了维护成本。
思路:
与通过xstream 将 xml文件转换成java 对象类似,利用工具将csv文件也转换为java 对象。能实现此类功能的第三方工具包比较多,这里采用的是opencsv。 它的官方网站是:http://opencsv.sourceforge.net。
实现:
1. 核心CSV解析代码
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类
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 测试框架中提供统一数据源
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 ,新浪博客