Skip to content

Add CoverletReport MSBuild item in the CoverageResultTask MSBuild task #932

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Documentation/MSBuildIntegration.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,14 @@ To specify a directory where all results will be written to (especially if using
dotnet test /p:CollectCoverage=true /p:CoverletOutput='./results/'
```

The coverlet MSBuild task sets the `CoverletReport` MSBuild item so that you can easily use the produced coverlet reports. For example, using [ReportGenerator](https://github.com/danielpalme/ReportGenerator#usage--command-line-parameters) to generate an html coverage report.

```xml
<Target Name="GenerateHtmlCoverageReport" AfterTargets="GenerateCoverageResultAfterTest">
<ReportGenerator ReportFiles="@(CoverletReport)" TargetDirectory="../html-coverage-report" />
</Target>
```

### TeamCity Output

Coverlet can output basic code coverage statistics using [TeamCity service messages](https://confluence.jetbrains.com/display/TCD18/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ServiceMessages).
Expand Down
12 changes: 11 additions & 1 deletion src/coverlet.msbuild.tasks/CoverageResultTask.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
Expand All @@ -8,6 +9,7 @@
using Coverlet.Core.Enums;
using Coverlet.Core.Reporters;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Microsoft.Extensions.DependencyInjection;

namespace Coverlet.MSbuild.Tasks
Expand Down Expand Up @@ -36,6 +38,9 @@ public class CoverageResultTask : BaseTask

public string CoverletMultiTargetFrameworksCurrentTFM { get; set; }

[Output]
public ITaskItem[] ReportItems { get; set; }

public CoverageResultTask()
{
_logger = new MSBuildLogger(Log);
Expand Down Expand Up @@ -87,6 +92,7 @@ public override bool Execute()
}

var formats = OutputFormat.Split(',');
var coverageReportPaths = new List<ITaskItem>(formats.Length);
foreach (var format in formats)
{
var reporter = new ReporterFactory(format).CreateReporter();
Expand All @@ -110,10 +116,14 @@ public override bool Execute()
fileSystem,
ServiceProvider.GetService<IConsole>(),
result);
writer.WriteReport();
var path = writer.WriteReport();
var metadata = new Dictionary<string, string> { ["Format"] = format };
coverageReportPaths.Add(new TaskItem(path, metadata));
}
}

ReportItems = coverageReportPaths.ToArray();

var thresholdTypeFlags = ThresholdTypeFlags.None;
var thresholdStat = ThresholdStatistic.Minimum;

Expand Down
3 changes: 2 additions & 1 deletion src/coverlet.msbuild.tasks/ReportWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public ReportWriter(string coverletMultiTargetFrameworksCurrentTFM, string direc
=> (_coverletMultiTargetFrameworksCurrentTFM, _directory, _output, _reporter, _fileSystem, _console, _result) =
(coverletMultiTargetFrameworksCurrentTFM, directory, output, reporter, fileSystem, console, result);

public void WriteReport()
public string WriteReport()
{
string filename = Path.GetFileName(_output);

Expand Down Expand Up @@ -48,6 +48,7 @@ public void WriteReport()
string report = Path.Combine(_directory, filename);
_console.WriteLine($" Generating report '{report}'");
_fileSystem.WriteAllText(report, _reporter.Report(_result));
return report;
}
}
}
4 changes: 3 additions & 1 deletion src/coverlet.msbuild.tasks/coverlet.msbuild.targets
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@
ThresholdType="$(ThresholdType)"
ThresholdStat="$(ThresholdStat)"
InstrumenterState="$(InstrumenterState)"
CoverletMultiTargetFrameworksCurrentTFM="$(_coverletMultiTargetFrameworksCurrentTFM)" />
CoverletMultiTargetFrameworksCurrentTFM="$(_coverletMultiTargetFrameworksCurrentTFM)">
<Output TaskParameter="ReportItems" ItemName="CoverletReport" />
</Coverlet.MSbuild.Tasks.CoverageResultTask>
</Target>

<Target Name="GenerateCoverageResultAfterTest"
Expand Down
11 changes: 3 additions & 8 deletions test/coverlet.core.tests/Reporters/Reporters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,6 @@ public class Reporters
public void Msbuild_ReportWriter(string coverletMultiTargetFrameworksCurrentTFM, string coverletOutput, string reportFormat, string expectedFileName)
{
Mock<IFileSystem> fileSystem = new Mock<IFileSystem>();
fileSystem.Setup(f => f.WriteAllText(It.IsAny<string>(), It.IsAny<string>()))
.Callback((string path, string contents) =>
{
// Path.Combine depends on OS so we can change only win side to avoid duplication
Assert.Equal(path.Replace('/', Path.DirectorySeparatorChar), expectedFileName.Replace('/', Path.DirectorySeparatorChar));
});

Mock<IConsole> console = new Mock<IConsole>();

ReportWriter reportWriter = new ReportWriter(
Expand All @@ -49,7 +42,9 @@ public void Msbuild_ReportWriter(string coverletMultiTargetFrameworksCurrentTFM,
console.Object,
new CoverageResult() { Modules = new Modules() });

reportWriter.WriteReport();
var path = reportWriter.WriteReport();
// Path.Combine depends on OS so we can change only win side to avoid duplication
Assert.Equal(path.Replace('/', Path.DirectorySeparatorChar), expectedFileName.Replace('/', Path.DirectorySeparatorChar));
}
}
}