软件测试工具中QTP操作xml文件的方法及扩展QTP的.NET插件的问题

发表于:2010-08-30来源:作者:点击数: 标签:软件测试工具qtpQTPxml
软件测试工具中QTP操作xml文件的方法及扩展QTP的.NET插件的问题 目前,企业中对XML的应用越来越广泛,作为 自动化测试 的 测试工程师 ,也应该掌握XML的读写操作。 以下我使用XML DOM技术演示一个例子,用以读取XML指定节点的节点内容值。 读取函数原型 GetX

软件测试工具中QTP操作xml文件的方法及扩展QTP的.NET插件的问题

目前,企业中对XML的应用越来越广泛,作为自动化测试测试工程师,也应该掌握XML的读写操作。
  以下我使用XML DOM技术演示一个例子,用以读取XML指定节点的节点内容值。
  读取函数原型 GetXml strXmlPath,nodeName
  这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
  首先,新建一个vbs文件(取个名字叫readXml.vbs),输入代码:
Dim strXML
  GetXml "c:search.xml","TestResult"  '这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
MsgBox strXML

Function GetXml (ByVal strXmlFilePath,ByVal xmlNodeName)
        Dim xmlDoc,xmlRoot
       
        Set xmlDoc = CreateObject("Microsoft.XMLDOM") '创建XML DOM对象
        xmlDoc.async = False  '控制加载模式为同步模式(xml树加载完毕后再执行后续代码)
        xmlDoc.load strXmlFilePath        '载入xml文件
        If xmlDoc.parseError.errorCode <> 0 Then
                MsgBox "XML文件格式不对,原因是:" & Chr(13) &  xmlDoc.parseError.reason
                Exit Function               
        End If
        Set xmlRoot = xmlDoc.documentElement       
        xmlRecursion xmlRoot,xmlNodeName        '调用xml递归函数传入指定的根和节点名       
        GetXml = True 'xmlRecursion (xmlRoot)
       
End Function

Function xmlRecursion(byval xmlNode,byval strNodeName)
        If xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes Then
                If  xmlNode.childNodes.item(0).nodeName = "#text" Then
                        strXML = strXML & xmlNode.nodeName & ":" & xmlNode.childNodes.item(0).nodeValue & Chr(13)                                               
                End If               
        End If                       
        If xmlNode.hasChildNodes Then
                For Each childNodeItem In xmlNode.ChildNodes
                        If childNodeItem.hasChildNodes Then
                                xmlRecursion childNodeItem,strNodeName                               
                        End If                       
                Next
        End If       
End Function
 
问题:
  haschildnodes()这个方法好奇怪,明明已经没有子节点了,却仍然返回true,
  比如<TestResult>1</TestResult>这个节点,它的childNodes.item(0).nodeName竟然是“#text”,但是根据例子来看TestResult已经没有子节点了阿
回答:
  因为在xml有一个特殊的“子节点”——文本节点。比如 <TestResult>100</TestResult>
  这个节点TestResult下并不是没有子节点,而是有一个文本节点,这个节点的nodeName就是“#text”,而nodeValue是100.如果是 <TestResult/> 这种节点的话,那么用hasChildNodes则返回False
 
遍历xml的代码:
Option Explicit
Dim xmlDoc,myErr,strXML
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False  
xmlDoc.load "c:calc1.xml"
If xmlDoc.parseError.errorCode <> 0 Then  
   Set myErr = xmlDoc.parseError
   MsgBox("XML Loads Failed. " & myErr.reason)
Else
        Set rootNode = xmlDoc.documentElement
        Call rTravel(rootNode)
        MsgBox strXML
End If

Sub rTravel (rNode)
        Dim blnTwo,intTestCase,
        blnTwo = False
        iLen = rNode.childNodes.length
        If iLen > 0 Then
                For i = 0 To rNode.childNodes.length -1
                        Set child = rNode.childNodes.item(i)
                        Call rTravel(child)                       
                        childtext = child.nodeValue                       
                        strXML = strXML & childtext & chr(13)
                Next
        Else
                Exit Sub               
        End If
End Sub


方法二:
Option Explicit
Dim xmlDoc,myErr,strXML

Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False  
xmlDoc.load "c:calc1.xml"
If xmlDoc.parseError.errorCode <> 0 Then  
   Set myErr = xmlDoc.parseError
   MsgBox("XML Loads Failed. " & myErr.reason)
Else
        Set rootNode = xmlDoc.documentElement
        Call rTravel(rootNode)
        MsgBox strXML
End If
Sub rTravel (rNode)
        Dim blnTwo,intTestCase,
        blnTwo = False
        iLen = rNode.childNodes.length
        If iLen > 0 Then
                For i = 0 To rNode.childNodes.length -1
                        Set child = rNode.childNodes.item(i)
                        Call rTravel(child)                       
                        childtext = child.nodeValue                       
                        strXML = strXML & childtext & chr(13)
                Next
        Else
                Exit Sub               
        End If
End Sub


以下是我今天试用QTP插件时的一些过程,大家可以看一下
今天我试了一下QTP的.NET插件,QTP的.NET插件对于解决.NET控件识别和测试问题非常重要,是测试.NET平台程序必不可少的条件(包括测试.NET Windows Forms、.NET Web Forms、WPF控件)。.NET第三方控件或自定义的个性化控件的识别和测试问题可通过QTP的.NET插件提供的扩展模块来解决。

QTP的.NET插件主要提供了两种方式的扩展来支持个性化控件的测试:

(1).NET DLL:使用其为VS.NET提供的Custom Server模板来创建用C#写的DLL来支持个性化控件的测试。

(2)XML:使用XML文件来描述扩展。

第一种方法的好处是可以充分利用开发工具的优势,第二种方法则相对更便捷,可随时进行扩展,但是今天试用的结果是可实现录制方面的扩展,在回放方面的扩展不能实现,不知道是不是还有什么诀窍没掌握,QTP提供的帮助文档在这方面也比较有限。
在SwfConfig.xml文件中的扩展描述如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Controls>
  <Control Type="MyWindowsControlLibrary1.UserControl1">
          <Settings>
                 <Parameter Name="ConfigPath">D:\Program Files\Mercury Interactive\QuickTest Professional\dat\ControlDefineXMLSample.XML
                 </Parameter>
          </Settings>
         <CustomRecord>
                 <Component>
                        <Context>AUT-XML</Context>
                 </Component>
          </CustomRecord>
          <CustomReplay>
                <Component>

                       <Context>AUT-XML</Context>
                 </Component>
          </CustomReplay>
  </Control>
</Controls>

ControlDefineXMLSample.XML的定义如下:
<?xml version="1.0" encoding="UTF-8"?>
<Customization>
       <Record>
              <Events>
                     <Event name="MouseDown" enabled="true">
                            <RecordedCommand name="MouseMove">
                                   <Parameter>                                
                                   EventArgs.X
                                  </Parameter>
                                   <Parameter lang="C#">
                                   Parameter = EventArgs.Y;
                                  </Parameter>
                            </RecordedCommand>
                     </Event>
              </Events>
       </Record>
       <Replay>
              <Methods>
                     <Method name="SetValue">                    
                      <Parameters>
                                   <Parameter type="int" name="X"/>
                                   <Parameter type="int" name="Y"/>
                            </Parameters>
                            <MethodBody>

                                   System.Windows.Forms.MessageBox.Show("Mouse Position at Record Time");

                            </MethodBody>
                     </Method>
              </Methods>
       </Replay>
</Customization>

基本上是按QTP的帮助文档描述,以及它提供的一个小例子来写的。如果完全按其在NETExtensibility.chm文件中的“Example of a Control Definition XML File”这一节的例子来写则完全不能进行录制方面的扩展,它的例子如下:

原文转自:http://www.ltesting.net