軟件測試工具中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