Jenkins使用groovy脚本构建测试用例通过失败计数

Jenkins使用groovy脚本构建测试用例通过失败计数,groovy,junit,jenkins,hudson,Groovy,Junit,Jenkins,Hudson,我想使用groovy脚本获取构建的总测试用例通过和失败计数。我正在使用Junit测试结果。我使用的是多配置项目,那么有没有办法在每个配置的基础上找到这些信息?我认为您可以通过以下方式来完成: import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; File fXmlFile = new File("junit-t

我想使用groovy脚本获取构建的总测试用例通过和失败计数。我正在使用Junit测试结果。我使用的是多配置项目,那么有没有办法在每个配置的基础上找到这些信息?

我认为您可以通过以下方式来完成:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

File fXmlFile = new File("junit-tests.xml");

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();

println("Total : " + doc.getDocumentElement().getAttribute("tests"))
println("Failed : " +doc.getDocumentElement().getAttribute("failures"))
println("Errors : " +doc.getDocumentElement().getAttribute("errors"))

我想你可以用这样的方法来做:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

File fXmlFile = new File("junit-tests.xml");

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();

println("Total : " + doc.getDocumentElement().getAttribute("tests"))
println("Failed : " +doc.getDocumentElement().getAttribute("failures"))
println("Errors : " +doc.getDocumentElement().getAttribute("errors"))
如果使用该插件,可以直接从构建ie访问Jenkins TestResultAction

import hudson.model.*

def build = manager.build

int total = build.getTestResultAction().getTotalCount()
int failed = build.getTestResultAction().getFailCount()
int skipped = build.getTestResultAction().getSkipCount()
// can also be accessed like build.testResultAction.failCount

manager.listener.logger.println('Total: ' + total)
manager.listener.logger.println('Failed: ' + failed)
manager.listener.logger.println('Skipped: ' + skipped)
manager.listener.logger.println('Passed: ' + (total - failed - skipped))
用于附加TestResultAction方法/属性的API

如果要从其他作业访问矩阵生成,可以执行以下操作:

def job = Jenkins.instance.getItemByFullName('MyJobName/MyAxisName=MyAxisValue');
def build = job.getLastBuild()
...
如果使用该插件,可以直接从构建ie访问Jenkins TestResultAction

import hudson.model.*

def build = manager.build

int total = build.getTestResultAction().getTotalCount()
int failed = build.getTestResultAction().getFailCount()
int skipped = build.getTestResultAction().getSkipCount()
// can also be accessed like build.testResultAction.failCount

manager.listener.logger.println('Total: ' + total)
manager.listener.logger.println('Failed: ' + failed)
manager.listener.logger.println('Skipped: ' + skipped)
manager.listener.logger.println('Passed: ' + (total - failed - skipped))
用于附加TestResultAction方法/属性的API

如果要从其他作业访问矩阵生成,可以执行以下操作:

def job = Jenkins.instance.getItemByFullName('MyJobName/MyAxisName=MyAxisValue');
def build = job.getLastBuild()
...
对于管道(工作流)作业类型,逻辑与AlexS对大多数其他作业类型的回答略有不同:

build.getActions(hudson.tasks.junit.TestResultAction).each {action ->
    action.getTotalCount()
    action.getFailCount()
    action.getSkipCount()
}
(见附件)

作业没有getTestResultAction()方法

我使用这种逻辑来消除歧义:

if (build.respondsTo('getTestResultAction')) {
   //normal logic, see answer by AlexS     

} else {
   // pipeline logic above
}
对于管道(工作流)作业类型,逻辑与AlexS对大多数其他作业类型的回答略有不同:

build.getActions(hudson.tasks.junit.TestResultAction).each {action ->
    action.getTotalCount()
    action.getFailCount()
    action.getSkipCount()
}
(见附件)

作业没有getTestResultAction()方法

我使用这种逻辑来消除歧义:

if (build.respondsTo('getTestResultAction')) {
   //normal logic, see answer by AlexS     

} else {
   // pipeline logic above
}

我还收集JUnitXML测试结果,并使用Groovy构建后插件检查通过/失败/跳过计数。确保生成后操作的顺序在groovy生成后脚本之前包含junit xml

此示例脚本显示如何获取测试结果、使用结果计数设置生成描述以及version.txt文件中的版本信息,以及如何在跳过所有测试的情况下将总体生成结果更改为不稳定

def currentBuild = Thread.currentThread().executable
// must be run groovy post-build action AFTER harvest junit xml  
testResult1 = currentBuild.testResultAction

currentBuild.setDescription(currentBuild.getDescription() + "\n pass:"+testResult1.result.passCount.toString()+", fail:"+testResult1.result.failCount.toString()+", skip:"+testResult1.result.skipCount.toString())

// if no pass, no fail all skip then set result to unstable
if (testResult1.result.passCount == 0 && testResult1.result.failCount == 0 && testResult1.result.skipCount > 0) {
   currentBuild.result = hudson.model.Result.UNSTABLE
}

currentBuild.setDescription(currentBuild.getDescription() + "\n" + currentBuild.result.toString())

def ws = manager.build.workspace.getRemote()
myFile = new File(ws + "/VERSION.txt")
desc = myFile.readLines()
currentBuild.setDescription(currentBuild.getDescription() + "\n" + desc)

我还收集JUnitXML测试结果,并使用Groovy构建后插件检查通过/失败/跳过计数。确保生成后操作的顺序在groovy生成后脚本之前包含junit xml

此示例脚本显示如何获取测试结果、使用结果计数设置生成描述以及version.txt文件中的版本信息,以及如何在跳过所有测试的情况下将总体生成结果更改为不稳定

def currentBuild = Thread.currentThread().executable
// must be run groovy post-build action AFTER harvest junit xml  
testResult1 = currentBuild.testResultAction

currentBuild.setDescription(currentBuild.getDescription() + "\n pass:"+testResult1.result.passCount.toString()+", fail:"+testResult1.result.failCount.toString()+", skip:"+testResult1.result.skipCount.toString())

// if no pass, no fail all skip then set result to unstable
if (testResult1.result.passCount == 0 && testResult1.result.failCount == 0 && testResult1.result.skipCount > 0) {
   currentBuild.result = hudson.model.Result.UNSTABLE
}

currentBuild.setDescription(currentBuild.getDescription() + "\n" + currentBuild.result.toString())

def ws = manager.build.workspace.getRemote()
myFile = new File(ws + "/VERSION.txt")
desc = myFile.readLines()
currentBuild.setDescription(currentBuild.getDescription() + "\n" + desc)

在测试报告中,我还想添加错误测试用例作为第四类。有可能吗?@limonik,Jenkins Junit插件似乎将“错误”和“失败”捆绑到一个概念中(虽然我在这里可能是错的),所以我不认为你可以开箱即用。在测试报告中,我还想添加错误测试用例作为第四类。有可能吗?@limonik,Jenkins Junit插件似乎将“错误”和“失败”捆绑在一个概念中(虽然我在这里可能是错的),所以我不认为你可以开箱即用。