如何使用jenkins管道发布dotnet核心测试?

时间:2018-03-28 17:50:16

标签: .net jenkins .net-core nunit jenkins-pipeline

我试图用jenkins-pipeline发布测试结果,

使用这个管道脚本,我设法完成构建并生成" xml"输出:

node {
stage 'Checkout'
    checkout scm

stage 'Build'
    bat "\"C:/Program Files/dotnet/dotnet.exe\" restore \"${workspace}/MyProg.sln\""
    bat "\"C:/Program Files/dotnet/dotnet.exe\" build \"${workspace}/MyProg.sln\""

stage 'UnitTests'
    bat returnStatus: true, script: "\"C:/Program Files/dotnet/dotnet.exe\" test \"${workspace}/MyProg.sln\" --logger \"trx;LogFileName=unit_tests.xml\" --no-build"
    nunit testResultsPattern: 'Tests\\*Test*\\TestResults\\unit_tests.xml'
}

但是在" UnitTest"阶段我得到这个错误:

  

"发布NUnit测试结果报告无法读取XSL XML文件。   请将此问题报告给插件作者"

当我使用"正常"步骤构建(没有pipline框架)测试发布。 使用:

  • DotNet Core 2.0
  • Jenkins 2.111
  • NUnit插件0.23

附加一个XML:



<?xml version="1.0" encoding="UTF-8"?>
<TestRun id="201fdc5c-9a47-461b-a56c-1aec8778053d" name="golano1@VM-CCT-BUILD3 2018-03-28 17:36:50" runUser="CORP\golano1" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Times creation="2018-03-28T17:36:50.5380380+03:00" queuing="2018-03-28T17:36:50.5380497+03:00" start="2018-03-28T17:36:38.1418862+03:00" finish="2018-03-28T17:36:55.6498820+03:00" />
  <TestSettings name="default" id="3e9b0993-3888-4428-bd08-e217e3b54831">
    <Deployment runDeploymentRoot="golano1_VM-CCT-BUILD3 2018-03-28 17_36_50" />
  </TestSettings>
  <Results>
    <UnitTestResult executionId="77a19978-2bbb-4bcb-afaa-d5be4384e0d1" testId="a08b2ec5-a68d-434b-a35f-6c65159eee8f" testName="TestSentinalOneBigFile_Failed" computerName="VM-CCT-BUILD3" duration="00:00:05.0340000" startTime="2018-03-28T17:36:45.0000000+03:00" endTime="2018-03-28T17:36:50.0000000+03:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="77a19978-2bbb-4bcb-afaa-d5be4384e0d1" />
    <UnitTestResult executionId="49fb4bd0-d650-4ed4-b0f2-40241b138f40" testId="15590544-6d25-4b07-9736-91fc3089eb1d" testName="TestSentinalOneFullScanOfSingleFile_Success" computerName="VM-CCT-BUILD3" duration="00:00:05.0130000" startTime="2018-03-28T17:36:50.0000000+03:00" endTime="2018-03-28T17:36:55.0000000+03:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="49fb4bd0-d650-4ed4-b0f2-40241b138f40" />
  </Results>
  <TestDefinitions>
    <UnitTest name="TestSentinalOneBigFile_Failed" storage="c:\jenkins\workspace\testfolder\pg_branchbuild\tests\sentinalonetests\bin\debug\netcoreapp2.0\sentinalonetests.dll" id="a08b2ec5-a68d-434b-a35f-6c65159eee8f">
      <Execution id="77a19978-2bbb-4bcb-afaa-d5be4384e0d1" />
      <TestMethod codeBase="C:\Jenkins\workspace\TestFolder\PG_BranchBuild\Tests\SentinaloneTests\bin\Debug\netcoreapp2.0\SentinaloneTests.dll" executorUriOfAdapter="executor://nunit3testexecutor/" className="SentinaloneTests.SentinaloneEngineConnectorTest" name="TestSentinalOneBigFile_Failed" />
    </UnitTest>
    <UnitTest name="TestSentinalOneFullScanOfSingleFile_Success" storage="c:\jenkins\workspace\testfolder\pg_branchbuild\tests\sentinalonetests\bin\debug\netcoreapp2.0\sentinalonetests.dll" id="15590544-6d25-4b07-9736-91fc3089eb1d">
      <Execution id="49fb4bd0-d650-4ed4-b0f2-40241b138f40" />
      <TestMethod codeBase="C:\Jenkins\workspace\TestFolder\PG_BranchBuild\Tests\SentinaloneTests\bin\Debug\netcoreapp2.0\SentinaloneTests.dll" executorUriOfAdapter="executor://nunit3testexecutor/" className="SentinaloneTests.SentinaloneEngineConnectorTest" name="TestSentinalOneFullScanOfSingleFile_Success" />
    </UnitTest>
  </TestDefinitions>
  <TestEntries>
    <TestEntry testId="a08b2ec5-a68d-434b-a35f-6c65159eee8f" executionId="77a19978-2bbb-4bcb-afaa-d5be4384e0d1" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
    <TestEntry testId="15590544-6d25-4b07-9736-91fc3089eb1d" executionId="49fb4bd0-d650-4ed4-b0f2-40241b138f40" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
  </TestEntries>
  <TestLists>
    <TestList name="Results Not in a List" id="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
    <TestList name="All Loaded Results" id="19431567-8539-422a-85d7-44ee4e166bda" />
  </TestLists>
  <ResultSummary outcome="Completed">
    <Counters total="2" executed="2" passed="2" failed="0" error="0" timeout="0" aborted="0" inconclusive="0" passedButRunAborted="0" notRunnable="0" notExecuted="0" disconnected="0" warning="0" completed="0" inProgress="0" pending="0" />
    <Output>
      <StdOut>NUnit Adapter 3.8.0.0: Test execution startedRunning all tests in C:\Jenkins\workspace\TestFolder\PG_BranchBuild\Tests\SentinaloneTests\bin\Debug\netcoreapp2.0\SentinaloneTests.dllNUnit3TestExecutor converted 2 of 2 NUnit test casesNUnit Adapter 3.8.0.0: Test execution complete</StdOut>
    </Output>
  </ResultSummary>
</TestRun>
&#13;
&#13;
&#13;

我做错了什么?

还试过:

step([$class: 'NUnitPublisher', testResultsPattern: 'Tests\\FilesScannerTests\\TestResults\\unit_tests.xml', debug: false, keepJUnitReports: true, skipJUnitArchiver:false, failIfNoResults: true])

但它也没有成功......

3 个答案:

答案 0 :(得分:1)

我设法使用“ MSTestPublisher ”类,

所以最后的管道是:

node {
stage 'Checkout'
    checkout scm

stage 'Build'
    bat "\"C:/Program Files/dotnet/dotnet.exe\" restore \"${workspace}/MyProg.sln\""
    bat "\"C:/Program Files/dotnet/dotnet.exe\" build \"${workspace}/MyProg.sln\""

stage 'UnitTests'
    bat returnStatus: true, script: "\"C:/Program Files/dotnet/dotnet.exe\" test \"${workspace}/MyProg.sln\" --logger \"trx;LogFileName=unit_tests.xml\" --no-build"
    step([$class: 'MSTestPublisher', testResultsFile:"**/unit_tests.xml", failOnError: true, keepLongStdio: true])
}

我已经上传了一些我在GitHub上发布的示例供大家使用和贡献,请随时查看:

https://github.com/avrum/JenkinsFileFor.NETCore

那些pipline jenkinsfile会将这个pipline模板添加到你的构建中:

Example Jenkins Pipeline|Solid

答案 1 :(得分:0)

Jenkinsfile声明性管道

....
stages {
     stage('UnitTests') {
        steps {
            bat "nunit3-console.exe ${env.WORKSPACE}/<TestProject>/bin/Release/<TestProject>.dll --result=nunit3.xml"
        }
    }
}
post { 
    always {
         nunit testResultsPattern: 'nunit3.xml'
    }
}

答案 2 :(得分:0)

使用xUnit插件(https://plugins.jenkins.io/xunit)效果很好。

运行生成 trx 输出的测试:

sh "dotnet test Tests/unit/ --logger:\"trx;LogFileName=results_Unit.testresults\""
sh "dotnet test Tests/Integration/ --logger:\"trx;LogFileName=results_Integration.testresults\""

并使用 MSTest 和模式发布运行xUnit:

xunit([MSTest(deleteOutputFiles: true, failIfNotNew: true, pattern: '**/*.testresults', skipNoTestFiles: false, stopProcessingIfError: true)])

我使用声明性语法,因此将最后一步放在post always节中。例如:

pipeline {
   agent any
   stages {
      stage('Build')
      {
         steps {
           sh "dotnet build"
         }
      }
      stage("run tests") {
         steps {
           sh "dotnet test Tests/unit/ --logger:\"trx:LogFileName=unit.testresults\""
         }
      }
   }
   post {
     always {
       xunit([MSTest(deleteOutputFiles: true, failIfNotNew: true, pattern: '**/*.testresults', skipNoTestFiles: false, stopProcessingIfError: true)])
     }
   }
}