《测试框架》摘选-6 单元自动化测试-数据驱动

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的功能雏形