Skip to content

Commit 46b4125

Browse files
authored
Add CoverletReport MSBuild item in the CoverageResultTask MSBuild task (#932)
So that the coverlet reports can be easily used by other MSBuild tasks. 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> ```
1 parent c77b85c commit 46b4125

File tree

5 files changed

+27
-11
lines changed

5 files changed

+27
-11
lines changed

Documentation/MSBuildIntegration.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ To specify a directory where all results will be written to (especially if using
4444
dotnet test /p:CollectCoverage=true /p:CoverletOutput='./results/'
4545
```
4646

47+
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.
48+
49+
```xml
50+
<Target Name="GenerateHtmlCoverageReport" AfterTargets="GenerateCoverageResultAfterTest">
51+
<ReportGenerator ReportFiles="@(CoverletReport)" TargetDirectory="../html-coverage-report" />
52+
</Target>
53+
```
54+
4755
### TeamCity Output
4856

4957
Coverlet can output basic code coverage statistics using [TeamCity service messages](https://confluence.jetbrains.com/display/TCD18/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ServiceMessages).

src/coverlet.msbuild.tasks/CoverageResultTask.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.IO;
34
using System.Linq;
45
using System.Text;
@@ -8,6 +9,7 @@
89
using Coverlet.Core.Enums;
910
using Coverlet.Core.Reporters;
1011
using Microsoft.Build.Framework;
12+
using Microsoft.Build.Utilities;
1113
using Microsoft.Extensions.DependencyInjection;
1214

1315
namespace Coverlet.MSbuild.Tasks
@@ -36,6 +38,9 @@ public class CoverageResultTask : BaseTask
3638

3739
public string CoverletMultiTargetFrameworksCurrentTFM { get; set; }
3840

41+
[Output]
42+
public ITaskItem[] ReportItems { get; set; }
43+
3944
public CoverageResultTask()
4045
{
4146
_logger = new MSBuildLogger(Log);
@@ -87,6 +92,7 @@ public override bool Execute()
8792
}
8893

8994
var formats = OutputFormat.Split(',');
95+
var coverageReportPaths = new List<ITaskItem>(formats.Length);
9096
foreach (var format in formats)
9197
{
9298
var reporter = new ReporterFactory(format).CreateReporter();
@@ -110,10 +116,14 @@ public override bool Execute()
110116
fileSystem,
111117
ServiceProvider.GetService<IConsole>(),
112118
result);
113-
writer.WriteReport();
119+
var path = writer.WriteReport();
120+
var metadata = new Dictionary<string, string> { ["Format"] = format };
121+
coverageReportPaths.Add(new TaskItem(path, metadata));
114122
}
115123
}
116124

125+
ReportItems = coverageReportPaths.ToArray();
126+
117127
var thresholdTypeFlags = ThresholdTypeFlags.None;
118128
var thresholdStat = ThresholdStatistic.Minimum;
119129

src/coverlet.msbuild.tasks/ReportWriter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public ReportWriter(string coverletMultiTargetFrameworksCurrentTFM, string direc
2020
=> (_coverletMultiTargetFrameworksCurrentTFM, _directory, _output, _reporter, _fileSystem, _console, _result) =
2121
(coverletMultiTargetFrameworksCurrentTFM, directory, output, reporter, fileSystem, console, result);
2222

23-
public void WriteReport()
23+
public string WriteReport()
2424
{
2525
string filename = Path.GetFileName(_output);
2626

@@ -48,6 +48,7 @@ public void WriteReport()
4848
string report = Path.Combine(_directory, filename);
4949
_console.WriteLine($" Generating report '{report}'");
5050
_fileSystem.WriteAllText(report, _reporter.Report(_result));
51+
return report;
5152
}
5253
}
5354
}

src/coverlet.msbuild.tasks/coverlet.msbuild.targets

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@
6666
ThresholdType="$(ThresholdType)"
6767
ThresholdStat="$(ThresholdStat)"
6868
InstrumenterState="$(InstrumenterState)"
69-
CoverletMultiTargetFrameworksCurrentTFM="$(_coverletMultiTargetFrameworksCurrentTFM)" />
69+
CoverletMultiTargetFrameworksCurrentTFM="$(_coverletMultiTargetFrameworksCurrentTFM)">
70+
<Output TaskParameter="ReportItems" ItemName="CoverletReport" />
71+
</Coverlet.MSbuild.Tasks.CoverageResultTask>
7072
</Target>
7173

7274
<Target Name="GenerateCoverageResultAfterTest"

test/coverlet.core.tests/Reporters/Reporters.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,6 @@ public class Reporters
3030
public void Msbuild_ReportWriter(string coverletMultiTargetFrameworksCurrentTFM, string coverletOutput, string reportFormat, string expectedFileName)
3131
{
3232
Mock<IFileSystem> fileSystem = new Mock<IFileSystem>();
33-
fileSystem.Setup(f => f.WriteAllText(It.IsAny<string>(), It.IsAny<string>()))
34-
.Callback((string path, string contents) =>
35-
{
36-
// Path.Combine depends on OS so we can change only win side to avoid duplication
37-
Assert.Equal(path.Replace('/', Path.DirectorySeparatorChar), expectedFileName.Replace('/', Path.DirectorySeparatorChar));
38-
});
39-
4033
Mock<IConsole> console = new Mock<IConsole>();
4134

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

52-
reportWriter.WriteReport();
45+
var path = reportWriter.WriteReport();
46+
// Path.Combine depends on OS so we can change only win side to avoid duplication
47+
Assert.Equal(path.Replace('/', Path.DirectorySeparatorChar), expectedFileName.Replace('/', Path.DirectorySeparatorChar));
5348
}
5449
}
5550
}

0 commit comments

Comments
 (0)