《精通自动化测试框架设计》—第2章 2.7节使用CSV文件

2.7 使用CSV文件
CSV[1]的全称是Comma Separate Values,即以逗号为分隔符,每条记录占一行的一种文件格式。当然分隔符并不限制于逗号,因此其另一个名字叫做Character Separated Values。这种古老的文件格式早在20世纪60年代就已出现,被使用于IBM OS360上,远早于个人电脑时代的来临。时至今日,CSV文件依然顽强并且广泛地使用着,特别是在程序间交换数据的场合。例如,在某些ERP系统中,作为安装的一部分,在完成了二进制可执行文件的安装之后,需要导入一些基础数据,如工作流的定义、各种对象的定义与属性、变更流程定义等。这些很多时候是使用CSV格式的文件进行的交互。另外,用户列表、组织权限、产品列表等产品使用或者示例的数据等,也是如此。

在进行自动化测试时,测试用例中的数据非常依赖于AUT中的上下文基础数据,而这些基础数据又可以通过CSV文件导入到AUT之中。那么,考虑将这些CSV文件中遴选出部分必需的数据,导入到测试框架中,作为测试框架的基础数据存在并供下游用例使用。据此,则可简单实现所谓的单一数据源(Single Source Of Truth),即使后期CSV文件中的变化了,因为用例和被测应用使用同一套数据源,自动化测试也可以照常执行。这种设计既提高了数据通用性,又降低了维护成本。

2.7.1 CSV文件数据解析思路
从面向对象的角度,如果将一个CSV文件的记录结构类比成一个Java类,那么该CSV文件中的每一条记录就可以理解为同一个类的不同实例,它们有着相同的属性,当然属性值随着记录数据的不同而不同。因此,与通过xstream将XML文件转换成Java对象类似,通过将CSV文件导入并转换成Java对象,然后按照操纵对象的方式来处理CSV文件中的数据,从而避免了通过I/O,反复处理文件操作这种费时费力的方式。熟悉数据库开发的读者可能对这种方式很熟悉,这其实就是借助了数据库中常用的对象关系映射(ORM, Object/Relation Mapping)概念。感兴趣的读者可以查阅相关的资料进行学习。

提供了将CSV文件转换为Java对象的第三方工具包比较多,这里采用的是opencsv。这一工具包的作者是Glen Smith,目前的维护者是Sean Sullivan。整个项目还处在积极的维护当中。在此小节写成的这一周,其官方网站上的单周下载量超过了1000次。另外其采用的是Apache 2.0 许可模式,只要不对它进行修改,即使用于商业用途,也是免费的。当然这一工具除了进行CSV到Java对象的转换,其余的功能如CSV导入导出功能也是比较全的。需要进行更多的CSV操作的读者可以到其官网上详细了解其他功能。

2.7.2 实现泛型解析
Opencsv提供了非常方便的CSV文件解析方法。在此基础上加以简单的封装,就可以实现一个较为通用的CSV文件转换为Java对象的方法。核心代码如下:

   public static< T extends BaseBean > List< T > parseCSV2Bean (String filename,Class< T > type){
     List< T > list =null;
try {
CSVReader reader = new CSVReader(new FileReader(filename), ',', '\"');
//构造了一个CSV文件的解析器,待解析的CSV文件以逗号分隔记录中的字段,以双引号作为各字段的起止标志。
HeaderColumnNameMappingStrategy< T >mappingStrategy =
new HeaderColumnNameMappingStrategy< T >();
     //HeaderColumnNameMappingStrategy实现了MappingStrategy接口,这种匹配策略下会将
//文件第一行的每个字段作为待转换的bean类的成员变量,也就是其属性
mappingStrategy.setType(type);
     //此处通过泛型实现了待解析文件和与之对应的Java Bean类之间的动态匹配
CsvToBean< T > csv = new CsvToBean< T >();
list = csv.parse(mappingStrategy, reader);
     //完成解析,并将解析的结果返回给一个泛型的list
     } catch (FileNotFoundException e) {
e.printStackTrace();
     }
return list;
   }

至此,通过一段简短的代码,就实现了通用的CSV转换为Java Bean list的功能。当然有一个小窍门就是,所有的Java Bean类都需要继承BaseBean。

2.7.3 对象类案例
下面是一个简单的示例。假设有一个employee.csv的员工信息表,与之对应的是一个EmployeeBean的类,其成员变量可以是id,name,position,salary等,如下面的代码所示:

public classEmployeeBean {
private intid;
private String name;
private String role;
private String salary;

//其余get/set方法省略

}

通过下面的这两行代码,就可以实现两者之间的解析和匹配的工作。

List< EmployeeBean > employees;

employees=CSVDigester.parseCSV2Bean("employee.csv",EmployeeBean.class)

解析得到的结果将返回给一个List employees的变量。据此,如本小节开头所介绍的那样,将繁琐的文件操作转换成了对一个list的访问,简化了操作,提高了速度,并增强了系统鲁棒性。

2.7.4 提供数据源的外部访问

Public classBeans {

private static List < EmployeeBean >employees;
public static voidsetEmployees(List < EmployeeBean > employees) {
   Beans.employees = employees;
}
public static List< EmployeeBean >getEmployees() {
   returnemployees;

}//提供该Employee数据源的外部访问接口

static { 
   setEmployees(CSVDigester.parseCSV2Bean("employees.csv",EmployeeBean.class));

 //测试框架初始化时读入该数据
}

如果有其他的CSV文件需要解析,则在Beans的静态块中使用类似操作即可。通过以上的操作,已经将针对CSV文件的操作转换成了对List employeeBeans的操作。使用时,直接采用以下语句:

Beans.getEmployees();
既提供了静态方法,也方便了数据的使用。

通过有针对性地将一些通用的操作封装成方法,简化测试用例的自动化实现和代码的复用性,譬如查询某个employee是否存在等。具体的代码例子这里不再列举,读者可以自行实现。

2.7.5 CSV文件通过SQL方式查询结果
CSV文件还可以通过SQL查询的方式通过JDBC进行读取。以2.6.3中所介绍的读取TestLink数据库中的表platforms为例。如果将该表导出到一个CSV当中,则可以将前述的案例程序稍加改动,将driver以及Connection的取得方式更换成CSV文件方式即可,具体程序如下:

package com.dataset.db;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
   public class CSVDriver {
     private static String filepath="D:\\repo\\Playground";
     private static final String URL="jdbc:relique:csv:" + filepath;
   private static final String Driver="org.relique.jdbc.csv.CsvDriver";
     private static Connection conn;
     public static Connection getConnection()
     {
         Connection connection=null;
         if(conn!=null){
          connection= conn;
     }
       else {
          connection= getConnection(Driver,URL);
          conn=connection;
         }
         return connection;
     }
     
     public static Connection getConnection(String driver,String url)
     {
       Connection conn=null;
       try
       {
         Class.forName(driver);//driver来源已经修改为CSV驱动器
         conn = DriverManager.getConnection(url);//连接也已经使用了重载的方法,单以
           URL为入参
       System.out.println("New db conn created::"+conn.toString());
       }
       catch (Exception e) {
         e.printStackTrace();
       }
       
       return conn;
     }
     //以下closeConnection、select方法与之前无异,略
     public static void main(String [] args){
      //main方法中无任何变化
      }

这个程序运行完毕后,如果输入的数据内容相同,那么可以得到与之前相同的输出结果。这种方式为基础数据的参数化提供了便利,在数据库中完成开发之后,可以将结果导出为CSV,供用例集运行时作为初始基础数据使用。毕竟如本书第1章中所介绍的“快速回归系统”,在测试执行过程中,一遍遍清洗数据库是一个耗时耗力的事情,至少包括数据库的停止、清洗、导入和开启。而将不同的数据集导出为CSV文件,不同的测试集通过使用不同的CSV文件目录作为数据源,可以大大减轻其中的复杂程度。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-10-28 05:09:00

《精通自动化测试框架设计》—第2章 2.7节使用CSV文件的相关文章

《精通自动化测试框架设计》—第2章 2.1节简介

第2章 测试数据管理精通自动化测试框架设计2.1 简介在本章中将结合案例介绍各种数据管理与交互的方法.那么问题来了,作为一本介绍架构自动化测试框架的书籍,为什么首先要介绍数据管理呢? 正所谓兵马未动,粮草先行.自动化测试也建议数据先行.测试过程中所涉及的被测应用自身.测试用例.测试报告等,都需要各种不同类型的数据进行支撑.一般来讲,所谓软件产品的功能,就是该产品在某一上下文状态下,将一系列的输入数据处理以后,转换成相应的输出数据.而软件测试,也就是通过模拟数据来触发这些功能的过程.因此,在软件测

《精通自动化测试框架设计》目录—导读

作者简介 精通自动化测试框架设计 陈冬严,浙江大学硕士,具有10年软件测试和团队管理的工作经验,先后服务于ITSM.PLM软件研发企业,现就职于某金融行业核心机构IT规划部门.业余时间喜欢园艺. 邵杰明,热爱测试工作,10多年的测试行业经验,曾先后供职于多家世界一流软件公司担任测试开发和测试管理工作,积累了丰富的行业工作经验,拥有PMP认证,目前担任测试架构师的工作,致力于自动化测试设计.持续交付等方面的工作. 王东刚,常用网名fastpoint,资深测试专家,<软件测试与Junit实践>作者

《精通自动化测试框架设计》—第1章 1.2节史前的自动化

1.2 史前的自动化 自动化测试不等于UI自动化测试,也不仅仅是完成测试用例的自动化翻译和执行过程.本节将介绍一些过往的自动化实践,供读者在自动化测试框架设计或者选型时进行参考. 1.2.1 自动化安装系统 该SUT是一套典型的B/S架构的基于J2EE的产品,安装过程中至少有20个GUI页面,需要不停地填写和勾选相关的配置信息.最令人头痛的是需要填写大约50个端口号.当然,后续的版本上这个问题已经改善许多.开发环境中,还要考虑一台服务器上部署多套系统,手工安装时选择端口号几乎成了最痛苦的事情,就

《精通自动化测试框架设计》—第1章 1.6节再启航

1.6 再启航尽管面临这样或者那样的问题,一些测试团队仍然成功获得了开发团队的信任,建立起了双方每周对话的机制,在周例会上沟通彼此遇到的技术问题,并决定自动化测试任务的优先级.也有些测试团队的成员,开始代替开发人员着手修复或者新建框架中的类,并提交代码进代码库而不再只作为缺陷描述中的补充.这样做所取得的直接效果就是降低了与自动化测试框架相关的缺陷的修复时间. 在测试组织内部,也通过这两年的锻炼,吸引了一些熟练掌握框架API并且熟悉产品知识的自动化测试人员,他们通过BCO牵头,成立了一个虚拟的自动

《精通自动化测试框架设计》—第2章 2.5节使用Exce

2.5 使用Excel2.5.1 经典的DataTable 在图2.2所示的调查中,Excel作为排名第一的数据源是情理之中的.甚至可以说,应该找不出来没有使用过Excel表格进行数据处理的读者.Excel的易用性.强大的数据处理功能,也能让即使不会编程的使用者可以快速解决一些常用的数据统计.计算的问题.在早期的商业自动化测试工具中,数据驱动或者关键字驱动是作为一个卖点被广为宣传的亮点.接触过这些工具的读者估计都对DataTable之类的概念印象深刻.在那个假设"系统测试工程师不懂代码"

《精通自动化测试框架设计》—第2章 2.6节使用数据库

2.6 使用数据库 如果读者所在的企业正在招聘测试工程师或者读者正在求职,翻开工作说明书,无论是熟悉.掌握还是精通,估计绝大部分都会对于数据库有一定的要求.这说明了数据库在现在软件行业的普遍应用,也说明了这几乎是自动化测试所绕不开的一个技术点.在本小节中,将简要介绍如何通过编写代码与数据库进行交互.当然,这只是浅显的使用层面的介绍.如果牵涉到多套数据库数据配套不同用例集.基础数据导入以及数据清洗等问题,读者可以参考第1章中有关"快速回归测试系统"的介绍,以及下一小节中有关CSV文件的处

《精通自动化测试框架设计》—第2章 2.2节测试数据分类

2.2 测试数据分类据James Whittaker在他划时代的<探索式软件测试>一书中的介绍,软件测试人员在制定测试策略时需要关注以下5个部分,包括输入(input).状态(state).代码路径(code path).用户数据(user data)和执行环境(execution environment).在资源有限的情况下,完整解决这其中的哪怕一个问题都是不可能的.因此,需要测试人员时时做出测试决策.作为一个测试框架架构人员,也必然需要面临这些问题,解决测试人员在面对前述这些问题时所提出的

《精通自动化测试框架设计》—第1章 1.1节奥运年的新挑战

你多吃点饭,到东吴的路很长,很费体力. --<赤壁> 第1部分 构建UI自动化框架在本书的这一部分,将介绍数据管理.底层公共框架构建等主题,并借助TestLink Web UI自动化测试框架构建的实践案例来展示如何从底层框架开始,搭建一个具有良好可维护性以及后续可扩展性的Web UI自动化框架. 1.1 奥运年的新挑战2008年的夏天是一个举国欢腾的日子.An君在办公室里正对着"厨房三件套"的Office开始一段全新的奇妙旅程. An君加入的团队是P公司上海研发中心组建的第

《精通自动化测试框架设计》—第1章 1.5节冰山

1.5 冰山伴随成功到来的,必然是更多的.全新的挑战. 1.5.1 假失败首先遇到的是用例假失败(False Failure),也就是类似足球比赛中假摔的问题,或者因为非缺陷原因导致的自动化测试用例运行失败.一般大批量的测试运行开始于每个发布的若干个最早期的几个Sprint之后:这时候基本上已经达到100%通过率的测试用例.但在新版本上的通过率会有一个明显的降低,从上一版本的全部通过快速下降到60%甚至更低,然后就是一场艰苦卓绝的排错与根因分析的攻坚战,逐步又将通过率提升并稳定在95%左右,直至