51Testing软件测试论坛

标题: 请教如何解析QTP自动生成的测试报告 [打印本页]

作者: snowwen    时间: 2010-1-27 13:33
标题: 请教如何解析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
                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

请教如何获取测试报告里Passed或Failed的字符串呢?
作者: zzxxbb112    时间: 2010-1-27 13:39
如果想做自定义报告,pass和fail完全可以测试脚本中做验证点判断实现,不一定要读QTP的结果文件。。。
觉得麻烦直接封装函数,或者重写REPORT方法~
作者: snowwen    时间: 2010-1-27 13:43
原帖由 zzxxbb112 于 2010-1-27 13:39 发表
如果想做自定义报告,pass和fail完全可以测试脚本中做验证点判断实现,不一定要读QTP的结果文件。。。
觉得麻烦直接封装函数,或者重写REPORT方法~

谢谢!
但是还有种异常错误的情况,如找不到对象这样的异常该怎么捕获呢?
作者: zzxxbb112    时间: 2010-1-27 13:51
1.可以exist函数判断  根据它的返回值捕捉~
如果觉得每次写很繁琐,可以写进注册函数~
写入自定义日志也可以~可以方便查找~

2.场景恢复
作者: yujie6832    时间: 2010-1-27 14:07
其实要写入EXCEL测试结果,在你的自动化设计阶段就应该考虑进去

然后在写脚本的时候,就有很多验证点,凡是验证点不通过的则退出脚本,或者有的不严重的可以继续执行下去,但是写一个小小的程序,假设如果发生过错误的,就把标识符变量改成1,脚本的最后写个判断,IF OBJECT=1,则将FAILD写入EXCEL反之一样,给一个思路,其实脚本可以写的很活,写脚本前一定要经过设计
作者: yujie6832    时间: 2010-1-27 14:08
赞同2楼,没必要那么烦,去调XML里的节点内容
作者: snowwen    时间: 2010-1-27 16:00
多谢两位!
又学到了东西~
作者: yujie6832    时间: 2010-1-27 20:08
呵呵,帮忙解决问题是一种态度
作者: superliming    时间: 2010-2-3 13:02
呵呵
作者: gonow85    时间: 2012-5-29 10:20
1.前提:
我框架的大概是以下逻辑:
每一个用例脚本都写在vbs中以单个函数的形式存在(即:一个用例对应一个函数名,用例根据分类不同存在于不同的vbs文件中)。
运行所有的用例时,调一次QTP的Test,在Test的Action中使用Execute   functionName来循环执行我要执行的所有用例。
2.我现在想把每次运行时,每个用例的名称和运行结果写入Excle,如以下形式:
A   B        C
01  Login    Pass
02  Order    Fail
03  LogOut   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
zzxxbb和yujie两位,能不能帮我指点下思路?




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2