(一)我们在进行android自动化测试的时候,往往没有html的报告,很纠结.那下面我们来看一下怎么生成html的报告 条件: 一,android的开发环境 二,testutils.jar包 操作步骤如下: 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软件:
下面:我们需要用autoit写脚本去解析这两个xml,组合成我们需要的报告.报告如下图:
autoit脚本如下:
- Dim $xmlReportFilePath="TEST-all.xml" ;xml格式的report存放路径 @WorkingDir&"\\"&
- Dim $xmlConfigFilePath="TEST-config.xml" ;xml格式的用例配置文件存放路径 @WorkingDir&"\\"&
- Dim $testCaseCount ;测试用例的总数
- Dim $passCaseCount ;通过的测试用例数
- Dim $faileCaseCount ;失败的测试用例数
- Dim $autoTestName ;自动化用例名称
- Dim $functionTestName ;功能用例名称
- dim $executeTime ;执行时间
- Dim $failedMessage ;失败原因
- Dim $htmlBeginStr
- Dim $xDoc,$xNodes,$Node
- Dim $configCaseCount
-
-
- $htmlBeginStr='<!DOCTYPE html>'& _
- '<html>'& _
- '<head>'& _
- '<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />'& _
- '<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />'& _
- '<link rel="stylesheet" type="text/css" href="static/css/index.css" />'& _
- '<title>xxx QA Test Report</title>'& _
- '</head>'& _
- '<body>'& _
- '<div class="block fixedTop tm bdrb">'& _
- '<div class="blockuk topBar">'& _
- '<table class="titleTab tabp100">'& _
- '<thead>'& _
- '<td width="20%" class="txtl">'& _
- '<img src="static/images/homeLogo.png" align="absmiddle"/></td>'& _
- '<td width="30%" class="txtl" id="testTitle">'& _
- 'xxx QA Test Report</td>'& _
- '<td width="" class="txtr" id="tips">'
- ;....................................................................................
- ;....函数功能:初始化xml
- ;....参 数: xml路径
- ;....返 回 值: 无
- ;....................................................................................
- Func initXml($xmlPath)
- $xDoc=ObjCreate("MSXML2.DOMDocument")
- $xDoc.load($xmlPath)
-
- EndFunc
-
- ;....................................................................................
- ;....函数功能:得到节点总数
- ;....参 数:
- ;....返 回 值: 无
- ;....................................................................................
- Func getNodeCount($nodeName)
- $xNodes=$xDoc.documentElement.selectNodes(".//"&$nodeName)
- $testCaseCount=$xNodes.length
- EndFunc
-
- Func getConfigCaseCount($nodeName)
- $xNodes=$xDoc.documentElement.selectNodes(".//"&$nodeName)
- $configCaseCount=$xNodes.length
- EndFunc
- ;....................................................................................
- ;....函数功能:得到节点总数
- ;....参 数:
- ;....返 回 值: 无
- ;....................................................................................
- Func getCoverage($passCount,$caseCount)
- Return Round($passCount/$caseCount,2)*100&"%"
- EndFunc
-
- ;....................................................................................
- ;....函数功能:得到用例数
- ;....参 数:
- ;....返 回 值: 无
- ;....................................................................................
- Func getCaseCount($nodeName)
- Dim $nodeCount=0
- Dim $i
- getNodeCount($nodeName)
- For $i=0 To $testCaseCount-1
- if $xNodes($i).ChildNodes.length>0 Then
- $nodeCount=$nodeCount+1
- EndIf
-
- Next
- $passCaseCount=$testCaseCount-$nodeCount
- $faileCaseCount=$nodeCount
- EndFunc
- ;....................................................................................
- ;....函数功能:得到用例数
- ;....参 数:
- ;....返 回 值: 无
- ;....................................................................................
- Func getText($nodeName)
- Return $nodeName.childNodes(0).text
- EndFunc
-
- ;....................................................................................
- ;....函数功能:得到用例数
- ;....参 数:
- ;....返 回 值: 无
- ;....................................................................................
- Func getCountStr()
- Dim $countStr
- $countStr='用例总数:<span class="tipsNum">'&$testCaseCount&'</span> '& _
- '用例通过:<span class="tipsNum">'&$passCaseCount&'</span> '& _
- '用例失败:<span class="tipsNum red">'&$faileCaseCount&'</span> '& _
- '通过率:<span class="tipsNum">'&getCoverage($passCaseCount,$testCaseCount)&'</span></td>'
- $htmlBeginStr=$htmlBeginStr&$countStr& _
- '</thead>'& _
- '</table>'& _
- '</div>'& _
- '</div>'& _
- '<div class="clear"></div>' & _
- '<div class="block" id="listCon">'& _
- '<div class="blockuk">'& _
- '<table class="caseTab tabp100">' & _
- '<thead class="uiHeader">'& _
- '<tr>'& _
- '<td class="wd300">用例名称</td>'& _
- '<td class="wd150">功能名称</td>'& _
- '<td class="wd85">执行结果</td>'& _
- '<td class="wd85">执行时间</td>'& _
- '<td class="wd388">失败原因</td>'& _
- '</tr>'& _
- '</thead>'& _
- '<tbody>'
- EndFunc
-
-
-
- Func getAttributes($nodeName,$attributeName)
- Return $nodeName.attributes.getNamedItem($attributeName).nodeValue
- EndFunc
-
- Func getCaseDetails()
- Global $caseDetails[$testCaseCount]
- For $i=0 To $testCaseCount-1
- if $xNodes($i).ChildNodes.length>0 Then
- $caseDetails[$i]=getAttributes($xNodes($i),"name")&"#"& _
- "failed"&"#"& _
- getAttributes($xNodes($i).ChildNodes(0),"message")&"#"& _
- "-"
- Else
- $caseDetails[$i]=getAttributes($xNodes($i),"name")&"#"& _
- "pass"&"#"& _
- getAttributes($xNodes($i),"time")&"#"& _
- "-"
- EndIf
- Next
- EndFunc
-
- Func getCaseConfig()
- Global $caseConfig[$configCaseCount]
- For $i=0 To $configCaseCount-1
- $caseConfig[$i]=getAttributes($xNodes($i),"name")&"#"& _
- getText($xNodes($i))
- Next
- EndFunc
-
-
- Func getSplit($str,$tag,$strNum)
- Dim $arr=StringSplit($str,$tag)
- Return $arr[$strNum]
- EndFunc
-
-
-
-
-
- Func formatCaseDetails()
- initXml($xmlReportFilePath)
- getCaseCount("testcase")
- getCountStr()
- getCaseDetails()
- initXml($xmlConfigFilePath)
- getConfigCaseCount("testcase")
- getCaseConfig()
- Global $formatCaseDetails[$testCaseCount]
- For $i =0 To $testCaseCount-1
- For $j=0 To $configCaseCount-1
- If StringInStr($caseDetails[$i],getSplit($caseConfig[$j],"#",1)) <> 0 Then
- $formatCaseDetails[$i]=$caseDetails[$i]&"#"&getSplit($caseConfig[$j],"#",2)
- ExitLoop
- ElseIf $j==$configCaseCount-1 Then
- $formatCaseDetails[$i]=$caseDetails[$i]&"#"&"-"
- EndIf
- Next
- Next
- EndFunc
-
- Func createHtml()
- Dim $caseDetailsStr
- For $i=0 To $testCaseCount-1
- If getSplit($formatCaseDetails[$i],"#",2)=="pass" Then
- $caseDetailsStr=$caseDetailsStr&'<tr>'&'<td class="wd300">'&getSplit($formatCaseDetails[$i],"#",1)&'</td>'& _
- '<td class="wd150">'&getSplit($formatCaseDetails[$i],"#",5)&'</td>'& _
- '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",2)&'</td>'& _
- '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",3)&'</td>'& _
- '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",4)&'</td>'& _
- '</tr>'
- Else
- $caseDetailsStr=$caseDetailsStr&'<tr>'&'<td class="wd300">'&getSplit($formatCaseDetails[$i],"#",1)&'</td>'& _
- '<td class="wd150">'&getSplit($formatCaseDetails[$i],"#",5)&'</td>'& _
- '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",2)&'</td>'& _
- '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",4)&'</td>'& _
- '<td class="th85">'&getSplit($formatCaseDetails[$i],"#",3)&'</td>'& _
- '</tr>'
- EndIf
- Next
- $htmlBeginStr=$htmlBeginStr&$caseDetailsStr& _
- '</tbody>'& _
- '</table>'& _
- '</div>'& _
- '</div>'& _
- '</body>'& _
- '</html>'
-
- EndFunc
-
- Func output()
- Dim $fso,$oFile,$pFile
- $pFile="index.html";@WorkingDir&"\\"&
- $fso=ObjCreate("Scripting.FileSystemObject")
- $oFile=$fso.createTextFile($pFile,True,False)
- $oFile.write($htmlBeginStr)
- EndFunc
-
- formatCaseDetails()
- createHtml()
- output()
以上是autoit脚本...这一节只是展示脚本和效果
(三) 上节已经说了报告的实现,这一节我们来讲一下ant如何用target来走通这一流程
build.xml文件中需要添加这两个target
- <target name="mkzip" depends="cmd">
- <tstamp>
- <format property="buildtime" pattern="yyyyMMddHHmmss"/>
- </tstamp>
- <jar destfile="result/test-report-${buildtime}.zip">
- <fileset dir="${basedir}/result">
- <include name="**/*.html"/>
- <include name="**/*.css"/>
- <include name="**/*.png"/>
- </fileset>
- </jar>
- </target>
-
-
- <target name="cmd" depends="pull-test-file-to-local">
- <!-- 1.直截执行一句命令行 -->
- <!-- arg line 适合于参数中没有空格的情况 -->
- <echo message="${basedir}\result" />
- <exec executable="cmd" failοnerrοr="true">
- <arg line="/c ${basedir}/result/FormatReport.exe" />
- </exec>
- <sleep seconds="2"></sleep>
- </target>