Skip to content

Commit c4bffe0

Browse files
committed
Add CoverletReport MSBuild item in the CoverageResultTask MSBuild task
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 dd2237a commit c4bffe0

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)