如何在HP ALM中上传测试结果并修正Java+Selenium脚本结果误报
搞定HP ALM Vapi-XP里TestNG测试结果不准的问题
嘿,我之前也踩过这个坑——ALM完全不管TestNG实际跑没跑失败,就盯着批处理的返回码瞎标状态。咱们一步步把它掰正:
先让批处理返回真实的TestNG结果
首先你的RunVapi.bat大概率没把TestNG的失败结果传出来。默认情况下TestNG就算测试全挂了,Java进程可能还是返回0(成功),所以得让批处理把TestNG的真实执行状态带回去。
修改你的批处理,加上捕获退出码的逻辑:
@echo off REM 运行TestNG测试(替换成你实际的类路径和测试配置) java -cp "C:\PSelenium\lib\*;C:\PSelenium\bin" org.testng.TestNG testng.xml REM 捕获TestNG的退出码 SET TEST_EXIT_CODE=%ERRORLEVEL% REM 把结果返回给调用的VBS脚本 EXIT /B %TEST_EXIT_CODE%
手动跑一遍这个批处理,跑完后输echo %ERRORLEVEL%,如果测试失败应该返回非0,成功返回0,这一步必须先搞定。
让Vapi-XP脚本告诉ALM真实状态
你现在的VBS代码只是打印了result,但没通知ALM改状态!ALM的Vapi-XP需要用TDResult对象来设置测试的最终状态。把你的代码改成这样:
mycommand = "C:\PSelenium\RunVapi.bat" TDOutput.Print "Starting test execution: " & mycommand result = run(mycommand, 0, true) TDOutput.Print "Batch script exit code: " & result ' 根据退出码设置ALM测试状态 If result = 0 Then TDResult.SetStatus 1 ' 1对应ALM里的"Passed"状态 TDOutput.Print "ALM test marked as PASS" Else TDResult.SetStatus 2 ' 2对应ALM里的"Failed"状态 TDOutput.Print "ALM test marked as FAIL" End If
这里的状态码对应ALM的内置值:1=Passed,2=Failed,3=Not Completed,要是需要其他状态可以查ALM的文档调参数。
进阶:把TestNG的详细失败日志传到ALM
要是想在ALM里看到具体哪个测试用例挂了、报错信息是什么,可以让VBS解析TestNG生成的XML报告,把细节输出到TDOutput里。加一段解析代码:
' 解析TestNG的测试报告(路径改成你实际的报告路径) Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0") xmlDoc.async = False xmlDoc.Load("C:\PSelenium\test-output\testng-results.xml") If xmlDoc.parseError.errorCode <> 0 Then TDOutput.Print "Warning: Failed to parse TestNG report - " & xmlDoc.parseError.reason Else ' 获取失败用例数 failedCount = xmlDoc.SelectSingleNode("//testng-results/@failed").Text If failedCount > 0 Then TDOutput.Print "=====================================" TDOutput.Print "Failed test cases count: " & failedCount TDOutput.Print "=====================================" ' 遍历所有失败的测试方法 Set failedTests = xmlDoc.SelectNodes("//test-method[@status='FAIL']") For Each testMethod In failedTests testName = testMethod.GetAttribute("name") ' 获取错误信息(如果有的话) Set errorMsgNode = testMethod.SelectSingleNode("exception/message") errorMsg = IIf(errorMsgNode Is Nothing, "No error message", errorMsgNode.Text) TDOutput.Print "Failed test: " & testName & vbCrLf & "Error: " & errorMsg Next End If End If
这样ALM的测试执行日志里就能看到详细的失败信息,不用再去服务器上找日志了。
几个要注意的小细节
- 批处理的路径、TestNG的类路径、报告路径都要用绝对路径,别用相对路径,ALM的运行环境可能和你本地不一样。
- 确保ALM的Vapi-XP脚本有读取TestNG报告文件的权限,不然解析会失败。
- 如果TestNG还是不返回非0退出码,就在TestNG里加个监听器,在
onFinish方法里检查失败用例数,有失败就调用System.exit(1)。
内容的提问来源于stack exchange,提问作者Maxxii_m
相关产品推荐
相关产品推荐

