FineCodeCoverage icon indicating copy to clipboard operation
FineCodeCoverage copied to clipboard

Feature - Generate own report from cobertura

Open tonyhallett opened this issue 5 years ago • 3 comments

If dotnet-reportgenerator-globaltool changes its internal data structure then the report window will no longer work

tonyhallett avatar Dec 22 '20 13:12 tonyhallett

Background for anyone taking on this feature.

Code required to understand own report generation

  • Coverlet

https://github.com/coverlet-coverage/coverlet/blob/fe6fee996889ac3a5e98f786ad94262260db79a4/src/coverlet.core/Reporters/IReporter.cs#L8

Here are built in reporters https://github.com/coverlet-coverage/coverlet/blob/fe6fee996889ac3a5e98f786ad94262260db79a4/src/coverlet.core/Reporters/ReporterFactory.cs

The cobertura reporter https://github.com/coverlet-coverage/coverlet/blob/fe6fee996889ac3a5e98f786ad94262260db79a4/src/coverlet.core/Reporters/CoberturaReporter.cs

  • OpenCover https://github.com/OpenCover/opencover/blob/843adec8c2ddfbea244ff3445770805e547df5f3/main/OpenCover.Framework/Persistance/FilePersistance.cs#L143

https://github.com/FortuneN/FineCodeCoverage/blob/266ca4fe0ec5ac06b8c848df08e06a5d856609a6/FineCodeCoverage/Core/Cobertura/CoberturaUtil.cs#L85


		public static CoverageReport ProcessCoberturaXmlFile(string xmlFilePath, out List<CoverageLine> coverageLines)
		{
			coverageLines = new List<CoverageLine>();

			var report = LoadReportFile(xmlFilePath);

                        // the report is deserialized cobertura - create report from it !

			foreach (var package in report.Packages.Package)
			{
				foreach (var classs in package.Classes.Class)
				{
					foreach (var line in classs.Lines.Line)
					{
						coverageLines.Add(new CoverageLine
						{
							Package = package,
							Class = classs,
							Line = line
						});
					}
				}
			}

			return report;
		}

The unified xml is deserialized in to the CoverageReport class.

It should be relatively simple to create a wpf table that replicates the html report

tonyhallett avatar Dec 27 '20 13:12 tonyhallett

Further background https://github.com/coverlet-coverage/coverlet/issues/1028 https://github.com/danielpalme/ReportGenerator/issues/402

tonyhallett avatar Dec 28 '20 16:12 tonyhallett

@FortuneN

Further to our video call discussion where it was desired for the microserver to return the report in a generic format. I was thinking using json over xml as would be better for html report generation.

The change could be as simple as

//unifiedJson - report type and path to change, may even be beneficial providing a custom IReportBuilder.  Can remove
//autogenerated classes with the report generator class filter.
ReportGeneratorUtil.RunReportGenerator(coverOutputFiles, darkMode, out var unifiedJson, out var unifiedXmlFile, true); 

//new method
//this will just set a var on the page to be processed by javascript again calling back through window.external
GenerateHtmlFile(unifiedJson,darkMode,out var coverageHTML )

A) Do you want to continue using an html file in visual studio ? If so How would you like the js ? Vanilla, knockout or react ? If the latter do you want scripts embedded in the page ? How would you like this tested ? Puppeteer or something specific to framework if used ? Do you want to leave it up to me ? I will replicate current functionality with the addition of branch coverage. If desired I can add the grouping and filtering that report generator provides. image Later can incorporate visual studio options for the report display.

I am good to do this tomorrow.

tonyhallett avatar Jan 05 '21 20:01 tonyhallett