xUnit.net-dotCover/MRPP_xunit_dotcover.xml (51 lines of code) (raw):

<?xml version="1.0" encoding="UTF-8"?> <meta-runner name="xUnit.net + dotCover 💕"> <description>Run xUnit.net tests with dotCover coverage: http://www.wwwlicious.com/2015/09/25/teamcity-dotcover-xunit-at-last/</description> <settings> <parameters> <param name="xUnitNet.nugetSource" value="http://www.nuget.org/api/v2/" spec="text description='The nuget source url for the xunit runner' display='normal' label='Xunit Runner Nuget Source'" /> <param name="xUnitNet.nugetExe" value="%teamcity.tool.NuGet.CommandLine.DEFAULT%" spec="text description='The path to the nuget package on the agent' display='normal' label='Nuget Package Path'" /> <param name="xUnitNet.executable" value="xunit.console.exe" spec="text description='The xunit runner executable to use in the nuget package' display='normal' label='Xunit Runner Executable'" /> <param name="xUnitNet.executable.args" value="" spec="text description='Custom xunit runner arguments' display='normal' label='Xunit Runner Executable additional arguments'" /> <param name="xUnitNet.executable.legacymode" value="false" spec="checkbox checkedValue='true' description='For mixed mode assemblies, enables xunit runner to use legacy activiation' uncheckedValue='false' label='Enable .Net V2 Legacy Activation' display='normal'" /> <param name="xUnitNet.assembliesPath" value="*/bin/*tests.dll" spec="text description='The assemblies to test; relative to the working directory. Supports multiple paths separated by comma(,) or newline. Asterix wildcard (*) is supported here' display='normal' label='Assemblies to test:'" /> <param name="xUnitNet.assembliesExcludePath" value="" spec="text description='The assemblies to exclude; Supports multiple filenames separated by comma(,) or newline. Asterix wildcard (*) is supported here' display='normal' label='Assemblies to exclude:'" /> <param name="xUnitNet.trait" value="" spec="text description='only run tests with matching name/value traits, one name=value per line (e.x. name=value)' validationMode='any' label='Include Traits' display='normal'" /> <param name="xUnitNet.notrait" value="Category=Integration" spec="text description='do not run tests with matching name/value traits, one name=value per line (e.x. name=value)' validationMode='any' label='Exclude Traits' display='normal'" /> <param name="xUnitNet.dotCover.enable" value="true" spec="checkbox checkedValue='true' description='Enables or disables running test coverage with dotCover' uncheckedValue='false' label='Enable dotCover coverage' display='normal'" /> <param name="xUnitNet.dotCover.Filters" spec="text description='Specifies coverage filters using the config format. Documentation http://www.jetbrains.com/dotcover/help/dotCover__Console_Runner_Commands.html' label='dotCover Filters' validationMode='any' display='normal'"><![CDATA[<!-- Coverage filters. It's possible to use asterisks as wildcard symbols. --> <Filters> <IncludeFilters> <FilterEntry> <ModuleMask>*</ModuleMask> <ClassMask>*</ClassMask> <FunctionMask>*</FunctionMask> </FilterEntry> </IncludeFilters> <ExcludeFilters> <FilterEntry> <ModuleMask>*Tests</ModuleMask> </FilterEntry> </ExcludeFilters> </Filters>]]></param> <param name="xUnitNet.dotCover.AttributeFilters" spec="text description='Specifies attribute filters using the config format. Documentation http://www.jetbrains.com/dotcover/help/dotCover__Console_Runner_Commands.html' validationMode='any' label='dotCover AttributeFilters' display='normal'"><![CDATA[<!-- Attribute filters. It's possible to use asterisks as wildcard symbols. --> <AttributeFilters> <AttributeFilterEntry>System.CodeDom.Compiler.GeneratedCodeAttribute</AttributeFilterEntry> <AttributeFilterEntry>System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute</AttributeFilterEntry> <AttributeFilterEntry>System.ObsoleteAttribute</AttributeFilterEntry> </AttributeFilters>]]></param> <param name="xUnitNet.dotCover.exportReport" value="false" spec="checkbox checkedValue='true' description='If enabled, it will add a report to the build artifacts' uncheckedValue='false' label='Export dotCover report' display='normal'" /> <param name="xUnitNet.dotCover.skipProcesses" value="" spec="text description='Comma or semicolon delimited list of processes to skip coverage on. Example: sqlservr.exe;pwsh.exe' validationMode='any' label='Skip Processes' display='normal'" /> <param name="xUnitNet.dotCover.reportType" value="html" spec="select display='normal' description='The dotCover report type' label='ReportType' data_2='JSON' data_1='HTML' data_4='NDependXML' data_3='XML'" /> <param name="xUnitNet.dotCover.reportOutputFile" value="dotCoverReport.html" spec="text description='the name of the report file to output' validationMode='any' label='Report FileName' display='normal'" /> </parameters> <build-runners> <runner name="Install Test runner, Create config, Run tests, Update coverage" type="jetbrains_powershell"> <parameters> <param name="jetbrains_powershell_execution" value="PS1" /> <param name="jetbrains_powershell_noprofile" value="true" /> <param name="jetbrains_powershell_errorToError" value="error" /> <param name="jetbrains_powershell_script_mode" value="CODE" /> <param name="jetbrains_powershell_bitness" value="x86" /> <param name="teamcity.step.mode" value="default" /> <param name="jetbrains_powershell_script_code"><![CDATA[[CmdletBinding()] param ( [string] $workingDir = "%teamcity.build.workingDir%", [string] $nugetExe = "%xUnitNet.nugetExe%\tools\nuget.exe", [string] $xUnitNuget = "%xUnitNet.nugetSource%", [string] $xUnitExe = "%xUnitNet.executable%", [string] $dotCoverExecutable = "%teamcity.tool.JetBrains.dotCover.CommandLineTools.bundled%", [boolean] $xunitLegacy = [System.Convert]::ToBoolean("%xUnitNet.executable.legacymode%"), [Parameter()] [ValidateNotNullOrEmpty()] [string] $assemblyFilter = "%xUnitNet.assembliesPath%", [string] $assemblyExcludeFilter = "%xUnitNet.assembliesExcludePath%", [string] $traits = "%xUnitNet.trait%", [string] $notraits = "%xUnitNet.notrait%", [boolean] $dotCoverEnabled = [System.Convert]::ToBoolean("%xUnitNet.dotCover.enable%"), [boolean] $dotCoverReportEnabled = [System.Convert]::ToBoolean("%xUnitNet.dotCover.exportReport%"), [string] $dotCoverReportType = "%xUnitNet.dotCover.reportType%", [string] $dotCoverReportFile = "%xUnitNet.dotCover.reportOutputFile%", [string] $dotCoverFilter = "%xUnitNet.dotCover.Filters%", [string] $dotCoverSkipProcesses = "%xUnitNet.dotCover.skipProcesses%", [string] $dotCoverAttributeFilter = "%xUnitNet.dotCover.AttributeFilters%", [string] $xunitArgs = "%xUnitNet.executable.args%" ) $ErrorActionPreference = "Stop" try { ## get xunit runner from nuget package feed Invoke-Expression "$nugetExe install xunit.runner.console -source $xUnitNuget" $xunit = Join-Path $workingDir "xunit.runner.console.*\tools\$xUnitExe" | Resolve-Path if (-not $xunit) { # Try finding xunit under framework specific folder $xunit = Join-Path $workingDir "xunit.runner.console.*\tools\net4*\$xUnitExe" | Resolve-Path } if (-not $xunit) { throw New-Object System.Exception "Cannot find $xUnitExe after installing via nuget" } ## modify runner config if legacy v2 runtime activation mode required if ($xunitLegacy) { Write-Output "Setting xunit to run with legacy activation policy" $config = [string]$xunit + ".config" $doc = (Get-Content $config) -as [Xml] $doc.configuration.startup.SetAttribute("useLegacyV2RuntimeActivationPolicy", "true") $doc.Save($config) } ## Process Assemblies to be Excluded ## split string into array if multiple wildcard path separated by comma(,) or newline $assemblyExcludeFilterPaths = @() $excludedAssemblies = @("") if ($assemblyExcludeFilter) { $assemblyExcludeFilterPaths = $assemblyExcludeFilter.Trim() -split {$_ -eq "," -or $_ -eq "`n" } } foreach ($filterExcludePath in $assemblyExcludeFilterPaths) { ## Concatenate each Assembly into the array $excludedAssemblies += , $filterExcludePath.Trim() } ##split string into array if multiple wildcard path separated by comma(,) or newline $assemblyFilterPaths = $assemblyFilter.Trim() -split {$_ -eq "," -or $_ -eq "`n" } $assemblies = @() foreach ($filterPath in $assemblyFilterPaths) { ## Search for the assemblies using wildcard pattern (Also filter out excluded assemblies) $assembliesFromPath = (Get-ChildItem $filterPath.Trim() -Recurse -Exclude $excludedAssemblies.Trim() | Select-Object -ExpandProperty FullName) $assemblies += $assembliesFromPath } if (-not $assemblies) { $cwd = Get-Location $message = "No test assemblies found; cwd = $cwd ; assembly filter = $assemblyFilter" Write-Error $message throw New-Object System.Exception $message } else { Write-Output "Found test assemblies: " $assemblies } ## create single-line correctly formatted xunit argument ## the type will be a string for a single-line path without a wildcard. if ($assemblies.GetType() -eq [String]) { $assemblies = [String[]] $assemblies } # split multi-line xunit args into single line and correctly format $assemblyArg = "`"" + [String]::Join("`" `"", $assemblies) + "`"" if ($traits.Length -gt 0) { $traitArg = ($traits.Trim().Split("`r`n") | Where-Object {$_ -ne ""} | ForEach-Object { "-trait """ + $_ + """"}) -join " " } if ($notraits.Length -gt 0) { $notraitArg = ($notraits.Trim().Split("`r`n") | Where-Object {$_ -ne ""} | ForEach-Object { "-notrait """ + $_ + """"}) -join " " } $xunitArg = $assemblyArg, $traitArg, $notraitArg, $xunitArgs -join " " ## filenames $outputFile = "xunitcoverage.dcvr" $settingsFileName = "coverage_settings.xml" $coverageLogFileName = "dotCoverXunitLog.txt" Write-Output "##teamcity[message text='Run test coverage: $dotCoverEnabled']" ## do we run coverage? if ($dotCoverEnabled) { ## generate coverage settings file $settingsXml = @" <?xml version="1.0" encoding="utf-8"?> <CoverageParams> <TargetExecutable>$xunit</TargetExecutable> <TargetArguments>$xunitArg</TargetArguments> <TargetWorkingDir>$workingDir</TargetWorkingDir> <Output>$outputFile</Output> $dotCoverFilter $dotCoverAttributeFilter </CoverageParams> "@ # Avoid BOM http://stackoverflow.com/questions/5596982/using-powershell-to-write-a-file-in-utf-8-without-the-bom $encoding = New-Object System.Text.UTF8Encoding -ArgumentList $false # no byte order mark [System.IO.File]::WriteAllText($settingsFileName, $settingsXml, $encoding) Write-Output "Wrote coverage parameters file to ${settingsFileName}: $settingsXml" ## Add process filters if specified if ($dotCoverSkipProcesses) { $processFilters = "/ProcessFilters=-:$([System.String]::Join(';-:', $dotCoverSkipProcesses.Split(@(',',';'), [System.StringSplitOptions]::RemoveEmptyEntries)))" } ## Run coverage $dotCover = Join-Path $dotCoverExecutable "dotCover.exe" $dotCoverArgs = " cover $settingsFileName /LogFile=$coverageLogFileName /ReturnTargetExitCode $processFilters" Write-Output "##teamcity[message text='dotCoverExecutable: $dotCoverExecutable']" Write-Output "##teamcity[message text='dotCoverArgs: $dotCoverArgs']" $command = "$dotCover $dotCoverArgs" Write-Output "Executing dotCover via command: $command" Invoke-Expression $command if ($LASTEXITCODE -ne 0) { throw New-Object System.Exception "dotCover run failed with error code $LASTEXITCODE" } ## Report coverage results and output build artifacts Write-Host "##teamcity[dotNetCoverage dotcover_home='$dotCoverExecutable']" Write-Output "##teamcity[importData type='dotNetCoverage' tool='dotcover' path='$outputFile']" Write-Output "##teamcity[publishArtifacts '$settingsFileName']" Write-Output "##teamcity[publishArtifacts '$coverageLogFileName']" Write-Output "##teamcity[publishArtifacts '$outputFile']" ## Optional generate report if ($dotCoverReportEnabled) { $reportCommand = "$dotCover report /source=$outputFile /output=$dotCoverReportFile /reportType=$dotCoverReportType" Write-Output "Creating dotCover report via command: $reportCommand" Invoke-Expression $reportCommand Write-Output "##teamcity[publishArtifacts '$dotCoverReportFile']" } } else { ## run xunit without coverage $xunitOnlyCommand = "$xunit $xunitArg" Write-Output "Running unit tests without coverage via command: $xunitOnlyCommand" Invoke-Expression $xunitOnlyCommand } } catch { Write-Output "##teamcity[buildStatus text='$_' status='FAILURE']" Write-Output "##teamcity[message text='$_' status='ERROR']" exit 1 }]]></param> </parameters> </runner> </build-runners> <requirements /> </settings> </meta-runner>