Android自动化HTML报告

(一)我们在进行android自动化测试的时候,往往没有html的报告,很纠结.那下面我们来看一下怎么生成html的报告
条件:
       一,android的开发环境
       二,testutils.jar包(http://code.google.com/p/nbandroid-utils/)

操作步骤如下:

      1.将 testuntils.jar 加 到 Test Project Libraries 中 , 右 键 Test Project > Build path > Configure Build Path > Add External JARs > testutils.jar > OK
      
      2.修改 AndroidManifest.xml, <instrumentation android:targetPackage="com.xxx.xxxx" android:name="android.test.InstrumentationTestRunner" /> ↓ <instrumentation android:targetPackage="com.xxx.xxxx" android:name="com.neenbedankt.android.test.InstrumentationTestRunner" />

      3.右键 Test Project > Run as > Run Configurations > 在 Instrumentation runner: 选择 com.neenbedankt.android.test.InstrumentationTestRunner > Apply

      4.右键 Test Project > Run as > Android JUnit testing,,android junit 完成后 test result 会在生成在 模拟器 data/data/com.xxx.xxxx/files/TEST-all.xml
  
      5.使用 adb pull 命令将 Test result 导出到 PC 本地 adb pull data/data/com.xxx.xxxx/files/TEST-all.xml d:\TestResult

(二)如何用testutils.jar这个包生成我们的结果文件,文件的类型是xml,如下图:
    
     这个xml的结果,我们发给领导,敢问哪个领导看着不目瞪口呆?现在各个网站没有找到andriod的html报告,下面是我自己的方法去解析生成的html报告。

     需要:
             1.自动化case标题和功能case标题对应的xml文件:如下图

             2.autoit v3软件:http://www.autoitscript.com/site/autoit/downloads/
    
    下面:我们需要用autoit写脚本去解析这两个xml,组合成我们需要的报告.报告如下图:
     

    autoit脚本如下:
   

  1. Dim $xmlReportFilePath="TEST-all.xml"   ;xml格式的report存放路径 @WorkingDir&"\\"&
  2. Dim $xmlConfigFilePath="TEST-config.xml"    ;xml格式的用例配置文件存放路径   @WorkingDir&"\\"&
  3. Dim $testCaseCount          ;测试用例的总数
  4. Dim $passCaseCount          ;通过的测试用例数
  5. Dim $faileCaseCount         ;失败的测试用例数
  6. Dim $autoTestName           ;自动化用例名称
  7. Dim $functionTestName       ;功能用例名称
  8. dim $executeTime            ;执行时间
  9. Dim $failedMessage          ;失败原因
  10. Dim $htmlBeginStr
  11. Dim $xDoc,$xNodes,$Node
  12. Dim $configCaseCount


  13. $htmlBeginStr='<!DOCTYPE html>'& _
  14. '<html>'& _
  15. '<head>'& _
  16. '<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />'& _
  17. '<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />'& _
  18. '<link rel="stylesheet" type="text/css" href="static/css/index.css" />'& _
  19. '<title>xxx QA Test Report</title>'& _
  20. '</head>'& _
  21. '<body>'& _
  22. '<div class="block fixedTop tm bdrb">'& _
  23. '<div class="blockuk topBar">'& _
  24. '<table class="titleTab tabp100">'& _
  25. '<thead>'& _
  26. '<td width="20%" class="txtl">'& _
  27. '<img src="static/images/homeLogo.png" align="absmiddle"/></td>'& _
  28. '<td width="30%" class="txtl" id="testTitle">'& _
  29. 'xxx QA Test Report</td>'& _
  30. '<td width="" class="txtr" id="tips">'
  31. ;....................................................................................
  32. ;....函数功能:初始化xml
  33. ;....参    数: xml路径
  34. ;....返 回 值:  无
  35. ;....................................................................................
  36. Func initXml($xmlPath)
  37.    $xDoc=ObjCreate("MSXML2.DOMDocument")
  38.    $xDoc.load($xmlPath)
  39.    
  40. EndFunc

  41. ;....................................................................................
  42. ;....函数功能:得到节点总数
  43. ;....参    数: 
  44. ;....返 回 值:  无
  45. ;....................................................................................
  46. Func getNodeCount($nodeName)
  47.    $xNodes=$xDoc.documentElement.selectNodes(".//"&$nodeName)
  48.    $testCaseCount=$xNodes.length
  49. EndFunc        

  50. Func getConfigCaseCount($nodeName)
  51.    $xNodes=$xDoc.documentElement.selectNodes(".//"&$nodeName)
  52.    $configCaseCount=$xNodes.length
  53. EndFunc        
  54. ;....................................................................................
  55. ;....函数功能:得到节点总数
  56. ;....参    数: 
  57. ;....返 回 值:  无
  58. ;....................................................................................
  59. Func getCoverage($passCount,$caseCount)
  60.    Return Round($passCount/$caseCount,2)*100&"%"
  61. EndFunc

  62. ;....................................................................................
  63. ;....函数功能:得到用例数
  64. ;....参    数: 
  65. ;....返 回 值:  无
  66. ;....................................................................................
  67. Func getCaseCount($nodeName)
  68.    Dim $nodeCount=0
  69.    Dim $i
  70.    getNodeCount($nodeName)
  71.    For $i=0 To $testCaseCount-1
  72.           if $xNodes($i).ChildNodes.length>0 Then
  73.                  $nodeCount=$nodeCount+1
  74.           EndIf
  75.                  
  76.    Next             
  77.           $passCaseCount=$testCaseCount-$nodeCount
  78.           $faileCaseCount=$nodeCount
  79. EndFunc
  80. ;....................................................................................
  81. ;....函数功能:得到用例数
  82. ;....参    数: 
  83. ;....返 回 值:  无
  84. ;....................................................................................
  85. Func getText($nodeName)
  86.    Return $nodeName.childNodes(0).text
  87. EndFunc

  88. ;....................................................................................
  89. ;....函数功能:得到用例数
  90. ;....参    数: 
  91. ;....返 回 值:  无
  92. ;....................................................................................
  93. Func getCountStr()
  94.    Dim $countStr
  95.    $countStr='用例总数:<span class="tipsNum">'&$testCaseCount&'</span>  '& _
  96.    '用例通过:<span class="tipsNum">'&$passCaseCount&'</span>  '& _
  97.    '用例失败:<span class="tipsNum red">'&$faileCaseCount&'</span>  '& _
  98.    '通过率:<span class="tipsNum">'&getCoverage($passCaseCount,$testCaseCount)&'</span></td>'
  99.    $htmlBeginStr=$htmlBeginStr&$countStr& _
  100.    '</thead>'& _
  101.    '</table>'& _
  102.    '</div>'& _
  103.    '</div>'& _
  104.    '<div class="clear"></div>' & _
  105.    '<div class="block" id="listCon">'& _
  106.           '<div class="blockuk">'& _
  107.                  '<table class="caseTab tabp100">' & _
  108.                         '<thead class="uiHeader">'& _
  109.                            '<tr>'& _
  110.                                   '<td class="wd300">用例名称</td>'& _
  111.                                   '<td class="wd150">功能名称</td>'& _
  112.                                   '<td class="wd85">执行结果</td>'& _
  113.                                   '<td class="wd85">执行时间</td>'& _
  114.                                   '<td class="wd388">失败原因</td>'& _
  115.                            '</tr>'& _
  116.                            '</thead>'& _
  117.                            '<tbody>'                           
  118. EndFunc



  119. Func getAttributes($nodeName,$attributeName)
  120.           Return $nodeName.attributes.getNamedItem($attributeName).nodeValue
  121. EndFunc

  122. Func getCaseDetails()
  123.    Global $caseDetails[$testCaseCount]
  124.    For $i=0 To $testCaseCount-1
  125.           if $xNodes($i).ChildNodes.length>0 Then
  126.                  $caseDetails[$i]=getAttributes($xNodes($i),"name")&"#"& _
  127.                  "failed"&"#"& _
  128.                  getAttributes($xNodes($i).ChildNodes(0),"message")&"#"& _
  129.                  "-"        
  130.           Else
  131.                  $caseDetails[$i]=getAttributes($xNodes($i),"name")&"#"& _
  132.                  "pass"&"#"& _
  133.                  getAttributes($xNodes($i),"time")&"#"& _
  134.                  "-"
  135.           EndIf
  136.    Next
  137. EndFunc

  138. Func getCaseConfig()
  139.    Global $caseConfig[$configCaseCount]
  140.    For $i=0 To $configCaseCount-1
  141.           $caseConfig[$i]=getAttributes($xNodes($i),"name")&"#"& _
  142.           getText($xNodes($i))
  143.    Next
  144. EndFunc


  145. Func getSplit($str,$tag,$strNum)
  146.    Dim $arr=StringSplit($str,$tag)
  147.    Return $arr[$strNum]
  148. EndFunc





  149. Func formatCaseDetails()
  150.    initXml($xmlReportFilePath)
  151.    getCaseCount("testcase")
  152.    getCountStr()
  153.    getCaseDetails()
  154.    initXml($xmlConfigFilePath)
  155.    getConfigCaseCount("testcase")
  156.    getCaseConfig()
  157.    Global $formatCaseDetails[$testCaseCount]
  158.    For $i =0 To $testCaseCount-1
  159.           For $j=0 To $configCaseCount-1
  160.                  If StringInStr($caseDetails[$i],getSplit($caseConfig[$j],"#",1)) <> 0 Then
  161.                         $formatCaseDetails[$i]=$caseDetails[$i]&"#"&getSplit($caseConfig[$j],"#",2)
  162.                         ExitLoop
  163.                  ElseIf $j==$configCaseCount-1 Then
  164.                         $formatCaseDetails[$i]=$caseDetails[$i]&"#"&"-"
  165.                  EndIf
  166.           Next
  167.    Next
  168. EndFunc

  169. Func createHtml()
  170.    Dim $caseDetailsStr
  171.    For $i=0 To $testCaseCount-1
  172.           If getSplit($formatCaseDetails[$i],"#",2)=="pass" Then
  173.           $caseDetailsStr=$caseDetailsStr&'<tr>'&'<td class="wd300">'&getSplit($formatCaseDetails[$i],"#",1)&'</td>'& _
  174.           '<td class="wd150">'&getSplit($formatCaseDetails[$i],"#",5)&'</td>'& _
  175.           '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",2)&'</td>'& _
  176.           '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",3)&'</td>'& _
  177.           '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",4)&'</td>'& _
  178.           '</tr>'
  179.           Else
  180.                  $caseDetailsStr=$caseDetailsStr&'<tr>'&'<td class="wd300">'&getSplit($formatCaseDetails[$i],"#",1)&'</td>'& _
  181.                  '<td class="wd150">'&getSplit($formatCaseDetails[$i],"#",5)&'</td>'& _
  182.                  '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",2)&'</td>'& _
  183.                  '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",4)&'</td>'& _
  184.                  '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",3)&'</td>'& _
  185.                  '</tr>'
  186.           EndIf
  187.    Next
  188.    $htmlBeginStr=$htmlBeginStr&$caseDetailsStr& _
  189.    '</tbody>'& _
  190.    '</table>'& _
  191.    '</div>'& _
  192.    '</div>'& _
  193.    '</body>'& _
  194.    '</html>'

  195. EndFunc

  196. Func output()
  197.    Dim $fso,$oFile,$pFile
  198.    $pFile="index.html";@WorkingDir&"\\"&
  199.    $fso=ObjCreate("Scripting.FileSystemObject")
  200.    $oFile=$fso.createTextFile($pFile,True,False)
  201.    $oFile.write($htmlBeginStr)
  202. EndFunc

  203. formatCaseDetails()
  204. createHtml()
  205. output()
复制代码

以上是autoit脚本...这一节只是展示脚本和效果

 

(三) 上节已经说了报告的实现,这一节我们来讲一下ant如何用target来走通这一流程
build.xml文件中需要添加这两个target
  1. <target name="mkzip" depends="cmd">  
  2.                         <tstamp>
  3.                                 <format property="buildtime" pattern="yyyyMMddHHmmss"/>
  4.                         </tstamp>
  5.                          <jar destfile="result/test-report-${buildtime}.zip">   
  6.                                 <fileset dir="${basedir}/result">   
  7.                                    <include name="**/*.html"/>   
  8.                                    <include name="**/*.css"/>   
  9.                                    <include name="**/*.png"/>   
  10.                                 </fileset>   
  11.                          </jar>   
  12.                 </target>   
  13.          
  14.          
  15.                 <target name="cmd" depends="pull-test-file-to-local">  
  16.                         <!-- 1.直截执行一句命令行 -->  
  17.                         <!-- arg line 适合于参数中没有空格的情况 -->  
  18.                         <echo message="${basedir}\result" />                
  19.                         <exec executable="cmd" failοnerrοr="true">  
  20.                                 <arg line="/c ${basedir}/result/FormatReport.exe" />  
  21.                         </exec>  
  22.                         <sleep seconds="2"></sleep> 
  23.                 </target>  
复制代码
加上以上两个target即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值