軟件測試工具中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.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97