1.2.2 第二步:框架—数据驱动
在经过第一步之后,虽然可以自动化测试,但是每次运行都会用“测试”,“UTF-8”两个常量做参数,这达不到我们的201个测试数据组合的目标。为了解决这个问题,我们要对常量进行参数化,使得每次运行都要提交不同的数据。这个过程叫做数据驱动。如图6-4所示。
图6-4 URLEncoder单元测试数据驱动
数据驱动要考虑如下三个因素:
(1)数据源选择什么类型?
数据源有很多种选择,比如
1) 文本文件
2) 数据库
3)excel
4)xml
5)其他
选择哪种数据源,要根据项目的需求和特点而定。以当前的项目要求来看,URLEncoder的单元自动化测试需要频繁地从数据源读取数据,数据库显然在性能上不太合适。另外,数据源至少要能存储不同语言的字符,比如德文,中文,日文,韩文等等,对数据源的要求就是要很好地支持unicode,因此xml和excel入围。如果我们的单元自动化测试要求在unix和windows下都能运行,那么excel作为windows应用被淘汰,而xml最终胜出。
(2)数据如何被描述和组织?
在第一步里,我们看到有三个常量,strToEncode,strEncoding和strExpected。根据这个信息,生成mydata.xml如下。
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<DataPool>
<EncodeData id=”1″>
<EncodeString>NLS_en_abcdefghigklmnopqrstuvwxyz</EncodeString>
<Charset>US-ASCII</Charset>
<Expected>NLS_en_abcdefghigklmnopqrstuvwxyz</Expected>
</<EncodeData >
<EncodeData id=”2″>
<EncodeString>NLS_fr_àèòù</EncodeString>
<Charset>utf-8</Charset>
<Expected>NLS_fr_%C3%A0%C3%A8%C3%B2%C3%B9%3F</Expected>
</<EncodeData >
<EncodeData id=”3″>
<EncodeString>NLS_zh_软件自动化测试框架-柳胜</EncodeString>
<Charset>gb2312</Charset>
<Expected>NLS_zh_%C8%ED%BC%FE%D7%D4%B6%AF%BB%AF%B2%E2%CA%D4%BF%F2%BC%DC-%C1%F8%CA%A4</Expected>
</EncodeData>
<EncodeData id=”4″>
<EncodeString>NLS_ja_なリンクをクリックすると</EncodeString>
<Charset>ISO-2022-jp</Charset> <Expected>NLS_ja_%1B%24%42%24%4A%25%6A%25%73%25%2F%24%72%25%2F%25%6A%25%43%25%2F%24%39%24%6B%24%48</Expected>
</<EncodeData>
</DataPool>
(3)代码实现data层
驱动函数如下:
import java.net.URLEncoder;
public class TestURLEncoder
{
public static void main(String args[])
{
try{
//初始化数据源,即完成从xml文件到对象的存储
MyXMLData data=new MyXMLData();
For (int i=0;i<data.getSize();i++)
{
String strToEncode = data.get(i).getValue(“EncodeString”);
String strEncoding= data.get(i).getValue(“Charset”);
String strExpected= data.get(i).getValue(“Expected”);
;
//调用URLEncoder
String strAfterEncoded = URLEncoder.encode(strToEncode, strEncoding));
//对比
If(strAfterEncoded== strExpected)
//输出
System.out.println(”Pass: Verification is successful”);
Else
System.out.println(”Fail: Verification is fail”);
}
}
catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
}
作了如上修改之后,单元自动化测试框架实现了两个目的。
(1). 每次测试URLEncoder的数据都通过MyXMLData对象从数据源mydata.xml中提取
(2). mydata.xml有多少条EncodeData记录,For循环就会运行多少次,从而实现了数据源灵活扩展的目的。
为了达到上述的目标,我们需要自己开发MyXMLData类,至少实现三个方法
1)MyXMLData()初始化方法,实现从xml文件里读取数据
2)MyXMLData.get(int i)方法, 按序号获得某条记录,以哈希表的方式返回
3) MyXMLData.get(i).getValue(String)方法,通过key名获得某条记录的字段值,即我们想要的EncodedString,Charset,Expected。
【注意】:MyXMLData就是我们测试框架的data层的雏形。
【注意】:第二步的整体思路其实就是Junit的功能雏形