Skip to content

Instantly share code, notes, and snippets.

@onuralp
Last active January 6, 2021 17:43
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save onuralp/a659641f0eac24c4e732422e0d0e80ce to your computer and use it in GitHub Desktop.
Save onuralp/a659641f0eac24c4e732422e0d0e80ce to your computer and use it in GitHub Desktop.
Jenkins Shared lib function for VSTest Test Runner and Code Coverage Report

These two groovy function helps you to run unit tests and generate coverage reports by using Microsoft.TestPlatform and ReportGenerator

If you use VS 2017 MS Fakes, OpenCover and dotCover doesn't work because of a Windows Security issue. See: OpenCover/opencover#831

However Vstest works fine.

#!groovy
// I suggest you to add those functions as Shared Library https://jenkins.io/doc/book/pipeline/shared-libraries/
@Library('your-shared-lib') _
pipeline {
stages {
//..
stage('Run Unit Tests') {
steps {
vstestRunner(
pattern: 'Tests/Onuralp.*/bin/Release/Onuralp.*.Tests.dll',
settingsFile: 'test.runsettings' // it is optional
)
}
}
}
post {
always {
vstestPublisher(
testResultsPattern: 'TestResults/*.trx',
currentBuild: currentBuild
)
}
}
}
/*
*==========================================================
* Runs MSTestPublisher
*
* call as:
* vstestPublisher(
* testResultsPattern: '*nunit-result.xml',
* currentBuild: currentBuild
* )
*==========================================================
*/
def call(Map parameters = [:]) {
assert parameters.testResultsPattern != null && parameters.testResultsPattern != 'null' : "testResultsPattern parameter can not be null!"
assert parameters.currentBuild != null && parameters.currentBuild != 'null' : "currentBuild parameter can not be null!"
println """
The function was called as:
vstestPublisher(
testResultsPattern: ${parameters.testResultsPattern}
currentBuild: ${parameters.currentBuild}
)
"""
step([
$class: 'MSTestPublisher',
testResultsFile: parameters.testResultsPattern,
failOnError: false,
keepLongStdio: true
])
// feel free to remove it If you don't need
if(parameters.currentBuild.result == 'UNSTABLE') {
echo "Build result is ${parameters.currentBuild.result} It'll replace with FAILURE"
parameters.currentBuild.result = 'FAILURE'
}
}
/*
*==========================================================
* Find test dlls and run them with nunit console runner
* And also generates xml reports as nunit-result_*.xml
*
* call as:
* vstestRunner(
* pattern: 'SomeFolderNames/OrGlobPatterns/*.Tests.dll',
* pattern: 'test.runsettings' (optional)
* )
*==========================================================
*/
def call(Map parameters = [:]) {
assert parameters.pattern != null && parameters.pattern != 'null' : "pattern parameter can not be null!"
if(parameters.settingsFile != null && parameters.settingsFile != 'null') {
parameters.settingsFile = " /Settings:${parameters.settingsFile} "
} else {
parameters.settingsFile = ''
}
def files = findFiles(glob: parameters.pattern)
def testFiles = files.join('\t ')
opencoverVersion = '4.6.519'
opencoverConsole = "OpenCover.4.6.519/tools/OpenCover.Console.exe"
opencovertocoberturaVersion = '0.2.6.0'
opencovertocoberturaConsole = 'OpenCoverToCoberturaConverter.0.2.6.0/tools/OpenCoverToCoberturaConverter.exe'
println """
The function was called as:
vstestRunner(
pattern: ${parameters.pattern}
)
"""
echo 'Installing Microsoft.TestPlatform'
bat "nuget install Microsoft.TestPlatform -Version 15.8.0 -Source https://www.nuget.org/api/v2/"
echo 'Installing ReportGenerator'
bat "nuget install ReportGenerator -Version 3.1.2 -Source https://www.nuget.org/api/v2/"
echo "Removing report files if any"
powershell 'Remove-Item coverage-reports/*,TestResults/*.trx,TestCoverage.coverage,TestCoverage.coveragexml -Force -ErrorAction SilentlyContinue;'
bat "Microsoft.TestPlatform.15.8.0\\tools\\net451\\Common7\\IDE\\Extensions\\TestPlatform\\vstest.console.exe $testFiles ${parameters.settingsFile} /Logger:trx /EnableCodeCoverage"
powershell """
\$env:CodeCoverageExe = "Microsoft.TestPlatform.15.8.0\\tools\\net451\\Team Tools\\Dynamic Code Coverage Tools\\amd64\\CodeCoverage.exe"
# copy and rename the *.coverage to the DefaultWorkingDirectory and rename it to TestCoverage.coverage
Get-ChildItem -Path \$env:WORKSPACE/TestResults -Filter *.coverage -Recurse -ErrorAction SilentlyContinue -Force | %{Join-Path -Path \$_.Directory -ChildPath \$_.Name } | Copy-Item -Destination \$env:WORKSPACE\\TestCoverage.coverage
# convert binary to xml
& "\$env:CodeCoverageExe" analyze /output:\$env:WORKSPACE\\TestCoverage.coveragexml \$env:WORKSPACE\\TestCoverage.coverage
"""
bat """
ReportGenerator.3.1.2\\tools\\ReportGenerator.exe "-reports:TestCoverage.coveragexml" "-targetdir:.\\coverage-reports" "-assemblyfilters:-nunit3.*;-nunit.*;-moq.*"
""".trim()
publishHTML(
target: [
allowMissing: false,
keepAll: true,
reportDir: 'coverage-reports',
reportFiles: 'index.htm',
reportName: 'Code Coverage Report'
]
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment