snowwen 发表于 2010-1-27 13:33:32

请教如何解析QTP自动生成的测试报告

我想获取QTP自动生成的测试报告(test目录/Res*/Report/Results.xml)里的Passed或Failed的字符串,然后写到excel里去
但是QTP的这个xml结果文件格式好像不是传统的<节点>值<节点>这样的结构,我用以下解析xml文档的vbs函数时报错“文档格式不正确,原因是:根据DTD/Schema,元素内容无效”

下面是网上找的xml文档的vbs代码,解析<节点>值<节点>这样的没问题:
'==================================================================
'   Author: songfun
'
'Description :Read XML
'==================================================================
Dim strXML

GetXml "D:\snow\QTP\for topkick\FTP_Upload\Res11\Report\Results.xml","Action"'这个函数的第一个参数表示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
                IfxmlNode.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

请教如何获取测试报告里Passed或Failed的字符串呢?

zzxxbb112 发表于 2010-1-27 13:39:59

如果想做自定义报告,pass和fail完全可以测试脚本中做验证点判断实现,不一定要读QTP的结果文件。。。
觉得麻烦直接封装函数,或者重写REPORT方法~

snowwen 发表于 2010-1-27 13:43:56

原帖由 zzxxbb112 于 2010-1-27 13:39 发表 http://bbs.51testing.com/images/common/back.gif
如果想做自定义报告,pass和fail完全可以测试脚本中做验证点判断实现,不一定要读QTP的结果文件。。。
觉得麻烦直接封装函数,或者重写REPORT方法~
谢谢!
但是还有种异常错误的情况,如找不到对象这样的异常该怎么捕获呢?

zzxxbb112 发表于 2010-1-27 13:51:36

1.可以exist函数判断根据它的返回值捕捉~
如果觉得每次写很繁琐,可以写进注册函数~
写入自定义日志也可以~可以方便查找~

2.场景恢复

yujie6832 发表于 2010-1-27 14:07:22

其实要写入EXCEL测试结果,在你的自动化设计阶段就应该考虑进去

然后在写脚本的时候,就有很多验证点,凡是验证点不通过的则退出脚本,或者有的不严重的可以继续执行下去,但是写一个小小的程序,假设如果发生过错误的,就把标识符变量改成1,脚本的最后写个判断,IF OBJECT=1,则将FAILD写入EXCEL反之一样,给一个思路,其实脚本可以写的很活,写脚本前一定要经过设计

yujie6832 发表于 2010-1-27 14:08:13

赞同2楼,没必要那么烦,去调XML里的节点内容

snowwen 发表于 2010-1-27 16:00:53

多谢两位!
又学到了东西~

yujie6832 发表于 2010-1-27 20:08:26

呵呵,帮忙解决问题是一种态度:lol

superliming 发表于 2010-2-3 13:02:20

呵呵

gonow85 发表于 2012-5-29 10:20:28

1.前提:
我框架的大概是以下逻辑:
每一个用例脚本都写在vbs中以单个函数的形式存在(即:一个用例对应一个函数名,用例根据分类不同存在于不同的vbs文件中)。
运行所有的用例时,调一次QTP的Test,在Test的Action中使用Execute   functionName来循环执行我要执行的所有用例。
2.我现在想把每次运行时,每个用例的名称和运行结果写入Excle,如以下形式:
A   B      C
01Login    Pass
02Order    Fail
03LogOut   Pass
3.我的实现方式和所遇到的问题:
法一: qtApp.Test.LastRunResults.Status   
   因为我执行我的用例脚本(实质为:函数)的实现办法为:调一次QTP的Test,在Test的Action中使用Execute   functionName来循环执行我要执行的所有用例。
   所以导致我获取到的qtApp.Test.LastRunResults.Status 永远为running(除非是QTP弹出的错误,才为Fail)
   (******难道真的无法获取到每个测试用例(即函数的)的LastRunResults.Status吗??如果可以的话能否指点下思路???******)

法二:借助函数中的Exist或者检查点等写一个阀值来
   比如函数Test的阀值PF(PF作为函数的返回值来使用):
   Public Function Test()
   If   1= 1 Then
          Reporter.ReportEvent micPass,"提示信息: 成功!","进行数据库表检查!"
               PF = "pass"
          Else
       Reporter.ReportEvent micPass ,"提示信息: 失败!","进行数据库表检查出错!"
           PF = "fail"
   End If
   Test = PF
   End Function
   遇到的问题时因为我使用Execute   functionName来执行用例,所以获取不到函数的返回值。
   (******函数的返回值在哪,为甚么我获取不到函数的返回值??怎么获取函数的返回值????******)

   最后我只能把PF写到环境变量Result里,直接通过获取函数的环境变量来获取函数的返回值,见下:
   Public Function Test()
   If   1= 1 Then
          Reporter.ReportEvent micPass,"提示信息: 成功!","进行数据库表检查!"
               PF = "pass"
          Else
       Reporter.ReportEvent micPass ,"提示信息: 失败!","进行数据库表检查出错!"
           PF = "fail"
   End If
   Test = PF
       Environment("Result") = Test
   End Function
   (******不知道我这么解决是否正确?如果不正确的话能否指点下??******)

gonow85 发表于 2012-5-29 20:18:55

zzxxbb和yujie两位,能不能帮我指点下思路?
页: [1]
查看完整版本: 请教如何解析QTP自动生成的测试报告