測试之路3——对照XML文件2
距离上一篇对照xml文件隔了非常久,并不代表一直做了那么久。
事实上上一次对照xml文件一直出错,事实上我忽略了一个非常easy的问题:我从根文件夹下得到的全部孩子,是这个根下的,而xml文件的组织形式例如以下,孩子也有可能是其它的根:
<streams>
<stream id = "979" presetid = "-1">
<h264>
<profile>High</profile>
<par_y>-1</par_y>
<fr>source</fr>
<cqquantizer>0</cqquantizer>
<deviceid>0</deviceid>
<qualitylevel>0</qualitylevel>
<simhd>
<deblock>0</deblock>
<deinterlace>2</deinterlace>
<denoise>0</denoise>
<delight>0</delight>
<saturation>0</saturation>
<hue>0</hue>
</simhd>
</h264>
<aac>
<profile>LC</profile>
<channel>1</channel>
<bitrate>12000</bitrate> </aac>
</stream>
</streams>
这里能够把streams当做全部的根,可是它以下有stream,stream以下还有h264和aac两个节点,h264又有非常多节点 ,而h264本身并没有參数值。
所以我得到的children仅仅是得到stream,我须要遍历孩子,直到它没有某个孩子不再有孩子,再返回。
这么想来,是自己曾经学数据结构学的不好,我实际要做的就是遍历树的每一片叶子。于是,我開始遍历整个xml树了。
但是我该怎么遍历,还是像数据结构上说的那样,先根,中根,后根?事实上,我并不须要一起去遍历两个xml树,我仅仅要遍历一个xml树(源文件),然后去比对目标文件的xml树就能够了。由于我发现,这我这里目标文件的叶子比源文件的多;且目标文件的叶子在普通情况下都包含目标文件。所以我以源文件为參照物,去寻找目标文件是否存在该节点,假设不存在,则错误;再去比对參数,假设參数不同,则错误。
xml文件里可能存在名字同样,可是实际位置不同的节点,所以对照的节点必须相对位置也同样,所以这也减少了对照难度。所以我能够简单写出对照的測试程序:
//简单对例如法:
//传递參数:源文件,返回的目标文件
//返回值:true表示XML对照一样
//改动日期:2014.5.26 tanlee
//对照策略:假设源文件有标签,寻找目标文件是否有相应标签,个数假设不同样
public boolean simpleCompare(Document sourceDoc,Document targetDoc)
{
Element sourceRoot = sourceDoc.getDocumentElement(); HashSet<String> sourceSet =new HashSet<String>();
HashSet<String> sourceNames = getNodeNames(sourceRoot,sourceSet);//将全部标签元素提取出来,建立哈希表,方便寻找全部标签 Iterator<String> sIterator=sourceNames.iterator();//迭代器去遍历 while(sIterator.hasNext()) //遍历全部源文件的标签
{
String sName = sIterator.next(); //遍历迭代器得到相应的标签名字
NodeList snodeList1 = sourceDoc.getElementsByTagName(sName);//依据名字寻找相应的子节点
int length1 = snodeList1.getLength();
NodeList snodeList2 = targetDoc.getElementsByTagName(sName);//依据源文件里的标签寻找相应的
int length2 = snodeList2.getLength();;
if(length1 < length2)//当源文件长度小于目标文件,进行推断
{
// System.out.println("节点的元素个数不同:" + " " + sName + " " + "源文件个数:"
// + length1 + " " + "目标文件个数:" + length2 );
for(int i = 0,j = 0;i < length1;i++) //对nodelist1进行遍历
{
String ssValue = new String("cao");
String tValue = new String("cao");
ssValue = sourceDoc.getElementsByTagName(sName).item(i).getFirstChild().getNodeValue(); for(j =0;j < length2;j++)//内部循环对照,假设找不到和它相等的值,返回错误
{
tValue = targetDoc.getElementsByTagName(sName).item(j).getFirstChild().getNodeValue();
if(ssValue != null && ssValue != null && ssValue.equals(tValue))//表示找不到
{
break;
}
else if(ssValue == null && tValue == null)
{
break;
}
}
if(j == length2) //到达循环次数,还是没有找到,说明没有值相应,能够返回错误
{
System.out.println("没有找到标签相应的值");
return false;
}
}
}
else if(length1 == length2) //长度同样的情况下,进行对照,对照的条件是,假设目标文件能找到且值同样则返回true
{
for(int i = 0;i < length1;i++) //对nodelist1进行遍历
{
String ssValue = new String(" ");
String tValue = new String(" ");
//假设找不到该节点
if(targetDoc.getElementsByTagName(sName).item(i).getFirstChild() == null )
{
if(sourceDoc.getElementsByTagName(sName).item(i).getFirstChild() != null )
{
System.out.println("源文件有该标签,而目标文件没有");
return false; //假设源文件有节点
}
else
break;
}
ssValue = sourceDoc.getElementsByTagName(sName).item(i).getFirstChild().getNodeValue();
tValue = targetDoc.getElementsByTagName(sName).item(i).getFirstChild().getNodeValue();
if(ssValue != null&&!ssValue.equals(tValue))//表示找不到
{
// System.out.println("Error");
return false;
}
else
{
//System.out.println(ssValue);
}
}
}
else
{
System.out.println("目标文件节点长度小于源文件节点长度");
return false ; //其它情况就是目标文件的节点长度小于源文件的节点长度,即找不到相应节点,直接返回错误
}
}
return true;
}
只是,返回的结果都是false,这让我惊呆了,难道是我又写错了?我仅仅能把遍历到的节点输出来,果真节点都不在,这是什么原因?
老大这个时候提醒了我,解析xml的时候须要把xml文件进行格式化,我把源文件和目标文件导出来看一看,一个是3KB,还有一个是5KB,非常显然就算某些元素信息有区别,文件大小也不会相差如此之大,所以我打开看了一下:源文件没有空格和回车,而目标文件有非常多空格和回车,我于是理解他们的格式是不一样的。
须要自己去标准化吗?好像不用了,里面已经写好了方法。是用正则,我不是非常懂,至少用了再去学吧,代码例如以下:
//标准化传入的XML文件的字符串
//传递參数:源文件的String,返回的true
//返回值:改动过的String
//改动日期:2014.5.29 tanlee
public String standardXML(String xml)
{
xml = xml.replace("\r\n", "").replaceAll("(?<=>)\\s+(?=<)", "");
return xml;
}
这样就基本实现了功能,最终能返回一些true了,通过人工对照发现自己的自己主动化測试程序尽管简单,但还是能实现功能的。
可是,问题又来了,怎么给自己的源文件加入新的标签,以适应server那边添加的參数?看来改进的地方还非常多,仅仅能下次再改了。
測试之路3——对照XML文件2的更多相关文章
- 測试之路2——对照XML文件1
才来几天,老大又给了我一个新的任务.不像曾经的建100个任务project那么坑爹,却还是顿时让我感觉压力山大. 由于在这之前,我改了他写的例程,用于生成新的任务项目,事实上任务项目就是通过XML文件 ...
- Android Gradle Plugin指南(四)——測试
原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing 5.Testing(測试) 构建一个測试 ...
- Android程序解析XML文件的方法及使用PULL解析XML案例
一.一般解析XML文件的方法有SAX和DOM.PULL (1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信 ...
- 使用SAX解析XML文件
SAX这是Simple API for XML缩写,它不是由引起W3C拟议标准正式.尽管如此,使用SAX很少几个,点儿全部的XML解析器都会支持它. 与DOM比較而言,SAX是一种轻量型的方法. 我们 ...
- eclipse下的ssh框架整合过程及測试
最近在搭建Stuts2+hibernate+spring的框架,网上看的教程,大部分都是非常easy的步骤.没有比較具体的步骤以及每一个步骤完毕之后怎样检查是否配置成功.下面是笔者依据自己搭建的过程进 ...
- [单元測试]_[VC2010使用gtest单元測试入门]
场景: 1. gtest作为C++的单元測试工具非常优秀了,它集成了非常多标准assert所没有的功能,比方让流程继续运行的EXPECT,仅仅測试特定測试用例的--gtest_filter, 输出xm ...
- Maven实现Web应用集成測试自己主动化 -- 測试自己主动化(WebTest Maven Plugin)
近期在appfuse看到使用webtest-maven-plugin实现Web应用的集成測试,研究了下.感觉很不错.对于Web应用自己主动构建很有帮助,在性能測试之前能够保证Web应用的基本功能工作正 ...
- Hdfs的ACL測试
Hadoop从2.4.0版本号開始支持hdfs的ACL,在CDH5.0其中也集成了该特性,以下对其进行一些測试: unnamed user (file owner) 文件的拥有者 unnamed gr ...
- Mock+Proxy在SDK项目的自己主动化測试实战
项目背景 广告SDK项目是为应用程序APP开发者提供移动广告平台接入的API程序集合,其形态就是一个植入宿主APP的jar包.提供的功能主要有以下几点: - 为APP请求广告内容 - 用户行为打点 - ...
随机推荐
- Makefile条件推断 ——————————【Badboy】
使用条件推断,能够让make依据执行时的不同情况选择不同的执行分支. 条件表达式能够是比較变量的值,或是比較变量和常量的值. 一.演示样例 以下的样例,推断$(CC)变量是否"gcc&quo ...
- 如何在eclipse dump Java内存占用情况和打印GC LOG
当使用java开发应用程序发生内存泄露的时候,经常会需要dump内存,然后使用内存分析工具,比如Eclipse Memory Analyzer(一般称作MAT)工具. 本文将介绍如何在eclipse ...
- Bootstrap表格的使用
先定义前端table <table class="table table-striped table-bordered table-hover" id="expan ...
- VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用(简单明了)
一. 在字符串前加一个L作用: 如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节. strlen("as ...
- MIPS平台目标机安装Oprofile时出现error
在Debian下安装Oprofile 重要:应该使linux内核选项支持 在 .config 文件中设置CONFIG_PROFILING=y和CONFIG_OPROFILE=y. 重新编译,烧写.使用 ...
- 数字证书, 数字签名, SSL(TLS) , SASL .
因为项目中要用到TLS + SASL 来做安全认证层. 所以看了一些网上的资料, 这里做一个总结. 1. 首先推荐几个文章: 数字证书: http://www.cnblogs.com/hyddd/ar ...
- VC生成的DLL给QT的EXE调用时lib路径问题小结
VC生成的DLL给QT调用,有两种方式,一种是隐式调用调用(使用.lib文件方式): ① 在*.pro工程文件中添加VC生成的lib文件路径时,或者使用一个绝对路径,如: LIBS += " ...
- SilkTest高级进阶系列10 – bitmap工具bitview
SilkTest 提供了一个bitmap的工具,它可以帮助我们捕捉,比较bitmap文件.该bitmap工具的位置是~/SilkTest/bitview.exe 运行该工具后,你会发现它提供了捕捉控件 ...
- TCP/IP详细解释--TCP/IP可靠的原则 推拉窗 拥塞窗口
TCP和UDP在同一水平---传输层.但TCP和UDP最不一样的地方.TCP它提供了一个可靠的数据传输服务,TCP是面向连接的,那.使用TCP两台主机通过第一通信"拨打电话"这个过 ...
- ONVIFclient搜索设备获取rtsp解决开发笔记(精华文章)
总结: 眼下ONVIF协议系列设备已经超过一半的数字监控行业占据更多,关闭,作为一个开发者,你还在犹豫下就明白了?本文介绍了ONVIFclient从搜索,认证,获取,媒体信息获取. ...