本节书摘来自异步社区《精通自动化测试框架设计》一书中的第2章,第2.3节测试数据交互基本方法,作者陈冬严 , 邵杰明 , 王东刚 , 蒋涛,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.3 测试数据交互基本方法
本节将介绍几种常用的数据交互的方法,并就以上这些数据类型,根据各自的来源与使用场景,选取较为合适的处理方法。在实践中,读者可以根据适合自身框架的特点有针对性地加以改造。
在开始之前,首先介绍下在国内领先的问卷调查网站问卷星上做的一个软件自动化测试问卷调查(http://www.sojump.com/jq/3569220.aspx)中一道有关测试数据题目的调查结果,如图2.2所示。
从结果上看,Excel占据着最大的份额,可见MS Office系列的成功;而直接内嵌以及XML紧随其后,有着20%上下的占比。居中的则是属性文件交互以及CSV交互这样相对更专业的方式。数据库交互则以 3%不到的份额差点垫底,估计在日益追求轻量化的今天,数据库这种“重”的方式也逐渐被大家所摒弃。
当然,上述数据只是该次调查的结果,供大家在方案选型时做参考。最关键的是读者结合自身项目的实际情况,选择适合的数据交互方式。
2.3.1 使用Java的系统属性
Java在包java.lang.System中提供了一些标准的系统属性。这些信息可以用于确定用例执行方式,或者记录运行环境。读者可以通过运行下面这个例子来了解这些属性。
importjava.util.Iterator;
importjava.util.Properties;
public classSysProp {
public static void main(String args[]) {
Properties props=System.getProperties();
Iteratoriter=props.keySet().iterator();
while(iter.hasNext()) {
String key=(String)iter.next();
System.out.println(key+" = "+ props.get(key));
}
}
}
如果需要获得某一特定的系统属性,可以通过方法String java.lang.System.getProperty(String key)来完成。譬如下面这段代码获得了用户的根目录,并赋值给变量USER_HOME。
public static final String USER__HOME= System.getProperty("user.home");
类似地,System.setProperty(key, value)和System.setProperties(props)可以用来设定系统属性。譬如,下面这个语句就把属性值“firefox”赋给自定义的系统属性BROWSER_TYPE。
System.setProperty("BROWSER___TYPE", "firefox");
介绍完了在代码中的设置与获取,再介绍下如何在Java系统让属性信息可以在命令行、IDE环境或者Ant中将少量的变量数据传递给JVM。
命令行中最简单的就是使用标准的命令行选项"-Dpropertyname=value",如:
Java -DBROWSER_TYPE=firefox class
在Ant中可以使用子单元直接传递。
< syspropertykey="browser.type" value="firefox"/ >
而在像Eclipse 这样的IDE,可以直接在运行配置中设定,如图2.3所示。
读者如果感兴趣,可以通过以上这3种方式来运行下面这段代码。
import staticorg.junit.Assert.*;
importorg.junit.Test;
public classSysProp {
private String SELENIUM___PROPERTIES=System.getProperty("browser.type");
@Test
publicvoid Test() {
assertEquals("firefox",SELENIUM___PROPERTIES);
}
}
它们运行后,应该能获得一致的运行结果。
2.3.2使用操作系统的环境变量
环境变量,简单来讲,对于Windows操作系统,就是在系统属性→高级→环境变量中设置的变量。对于一些全局的测试数据,如数据库连接参数、第三方类库文件位置等,可以考虑通过环境变量来传递。
读者可以运行下面这段程序来了解System.getenv()的用法,并和前一小节中的输出进行比较,了解系统属性参数和环境变量的具体区别。
importjava.util.Iterator;
importjava.util.Map;
public classEnvProp {
public static void main(String args[]) {
Map< String, String >envMap=System.getenv();
Iterator iter=envMap.keySet().iterator();
while(iter.hasNext()) {
String key=(String)iter.next();
System.out.println(key+" = "+ envMap.get(key));
}
}
}
2.3.3 使用属性文件
前面介绍的两种方式,一般适合于框架中所使用的属性为个位数的情况。随着测试复杂性的增强,测试用例数量也呈几何级数增长。这时候,你可能需要一种更灵活、更有效的数据存储和交换的方式,那就是Java的属性文件。操作属性文件的方法其实和操作系统属性很类似,都可以使用包java.util.Properties中提供的类。细心的读者可能已经发现,前面两种方法虽然数据来源不一样,但其实都是在利用同一种数据格式:
Key=value
属性文件中的属性值也是采用这种方式保存数据。操作属性文件,因为牵涉到文件,所以首先需要为Properties类提供一个读写流。Properties用于读写属性文件的方法分别是:
//读取属性文件流的方法
public voidload(InputStream inStream) throwsIOException {}
//写属性文件流的方法
public void store(OutputStream out, String comments) throwsIOException {}
这里只是列举了一些简单的读取方式,供初学的读者进行了解。在第 3 章中将介绍Solvent框架的整体解决方案如何综合使用各类型数据交互方法满足各种测试框架的需求。