Skip to content

Commit c6c3c74

Browse files
authored
Merge pull request #19 from gmattinson/master
Add crude JUnit parser
2 parents ea9eff6 + 78fdc75 commit c6c3c74

File tree

4 files changed

+100
-32
lines changed

4 files changed

+100
-32
lines changed

ExtentReportsDotNetCLI/ExtentReportsDotNetCLI/Extensions/KnownFileExtensions.cs

Lines changed: 0 additions & 20 deletions
This file was deleted.

ExtentReportsDotNetCLI/ExtentReportsDotNetCLI/ExtentReportsDotNetCLI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@
8181
</ItemGroup>
8282
<ItemGroup>
8383
<Compile Include="Extensions\StatusExtensions.cs" />
84-
<Compile Include="Extensions\KnownFileExtensions.cs" />
8584
<Compile Include="Logging.cs" />
8685
<Compile Include="Model\LoggingLevel.cs" />
8786
<Compile Include="Model\TestFramework.cs" />
8887
<Compile Include="Parser\IParser.cs" />
88+
<Compile Include="Parser\JUnitParser.cs" />
8989
<Compile Include="Parser\NUnitParser.cs" />
9090
<Compile Include="Program.cs" />
9191
<Compile Include="Properties\AssemblyInfo.cs" />
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
using AventStack.ExtentReports.MarkupUtils;
2+
3+
using AventStack.ExtentReports.CLI.Extensions;
4+
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using System.Xml.Linq;
9+
10+
namespace AventStack.ExtentReports.CLI.Parser
11+
{
12+
internal class JUnitParser : IParser
13+
{
14+
private ExtentReports _extent;
15+
16+
public JUnitParser(ExtentReports extent)
17+
{
18+
_extent = extent;
19+
}
20+
21+
public void ParseTestRunnerOutput(string resultsFile)
22+
{
23+
var doc = XDocument.Load(resultsFile);
24+
25+
if (doc.Root == null)
26+
{
27+
throw new NullReferenceException("Root element not found for " + resultsFile);
28+
}
29+
30+
AddSystemInformation(doc);
31+
32+
var suites = doc
33+
.Descendants("testsuite");
34+
35+
foreach (var ts in suites.ToList())
36+
{
37+
var test = _extent.CreateTest(ts.Attribute("name").Value);
38+
39+
// Test Cases
40+
foreach (var tc in ts.Descendants("testcase").ToList())
41+
{
42+
var node = CreateNode(tc, test);
43+
44+
AssignStatusAndMessage(tc, node);
45+
}
46+
}
47+
}
48+
49+
private static ExtentTest CreateNode(XElement tc, ExtentTest test)
50+
{
51+
var name = tc.Attribute("name").Value;
52+
var description = string.Empty;
53+
var node = test.CreateNode(name, description);
54+
return node;
55+
}
56+
57+
private static void AssignStatusAndMessage(XElement tc, ExtentTest test)
58+
{
59+
var error = tc.Elements().FirstOrDefault();
60+
61+
if (error != null)
62+
{
63+
var statusMessage = "Type: " + error.Attribute("type") + Environment.NewLine;
64+
statusMessage += "Message: " + error.Attribute("message");
65+
66+
test.Fail(statusMessage);
67+
}
68+
else
69+
{
70+
test.Pass(string.Empty);
71+
}
72+
}
73+
74+
private void AddSystemInformation(XDocument doc)
75+
{
76+
var suite = doc.Descendants("testsuite").FirstOrDefault();
77+
if (suite == null)
78+
return;
79+
80+
_extent.AddSystemInfo("Machine Name", suite.Attribute("hostname").Value);
81+
}
82+
}
83+
}

ExtentReportsDotNetCLI/ExtentReportsDotNetCLI/Program.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ internal class Program
1717
private Logger _logger;
1818
private ExtentReports _extent = new ExtentReports();
1919
private int _filesProcessed = 0;
20-
21-
[Option(ShortName = "p")]
22-
private TestFramework Parser { get; set; } = TestFramework.NUnit;
20+
static private int _errorCount;
2321

2422
[Option(ShortName = "i")]
2523
private string TestRunnerResultsFile { get; set; }
@@ -40,9 +38,10 @@ internal class Program
4038
private bool Merge { get; set; } = false;
4139

4240

43-
private static void Main(string[] args)
41+
private static int Main(string[] args)
4442
{
4543
CommandLineApplication.Execute<Program>(args);
44+
return _errorCount;
4645
}
4746

4847
private void OnExecute()
@@ -52,41 +51,45 @@ private void OnExecute()
5251

5352
string output = string.IsNullOrWhiteSpace(Output) ? $".\\{DefaultBaseDirectory}" : Output;
5453

55-
if (!string.IsNullOrEmpty(TestRunnerResultsDirectory) && File.GetAttributes(TestRunnerResultsDirectory) == FileAttributes.Directory && Parser.Equals(TestFramework.NUnit))
54+
if (!string.IsNullOrEmpty(TestRunnerResultsDirectory) &&
55+
File.GetAttributes(TestRunnerResultsDirectory).HasFlag(FileAttributes.Directory))
5656
{
57-
string filePattern = "*." + KnownFileExtensions.GetExtension(Parser);
57+
string filePattern = "*.xml";
5858
_logger.WriteLine(LoggingLevel.Normal, $"Getting test runner result files in folder '{TestRunnerResultsDirectory}' matching pattern '{filePattern}' ...");
5959

6060
List<string> files = Directory.GetFiles(TestRunnerResultsDirectory, filePattern, SearchOption.AllDirectories).ToList();
6161

6262
if (Merge)
6363
{
64-
files.ForEach(x => ProcessSingle(x, output, true));
64+
files.ForEach(x =>
65+
{
66+
_errorCount += ProcessSingle(x, output, true);
67+
});
6568
}
6669
else
6770
{
6871
files.ForEach(x =>
6972
{
7073
var dir = Path.Combine(output, Path.GetFileNameWithoutExtension(x));
71-
ProcessSingle(x, dir, false);
74+
_errorCount += ProcessSingle(x, dir, false);
7275
});
7376
}
7477
}
7578

7679
if (!string.IsNullOrWhiteSpace(TestRunnerResultsFile))
7780
{
78-
ProcessSingle(TestRunnerResultsFile, output, true);
81+
_errorCount += ProcessSingle(TestRunnerResultsFile, output, true);
7982
}
8083

8184
if (_filesProcessed == 0)
8285
{
8386
_logger.WriteLine(LoggingLevel.Normal, "Nothing to do!");
8487
}
8588

86-
_logger.WriteLine(LoggingLevel.Verbose, "extentreports-cli finished.");
89+
_logger.WriteLine(LoggingLevel.Verbose, $"extentreports-cli finished. {_errorCount} errors.");
8790
}
8891

89-
private void ProcessSingle(string testResultsFilePath, string output, bool merge = false)
92+
private int ProcessSingle(string testResultsFilePath, string output, bool merge = false)
9093
{
9194
_logger.WriteLine(LoggingLevel.Normal, $"Parsing test runner result file '{testResultsFilePath}' ...");
9295

@@ -103,10 +106,12 @@ private void ProcessSingle(string testResultsFilePath, string output, bool merge
103106
}
104107

105108
new NUnitParser(_extent).ParseTestRunnerOutput(testResultsFilePath);
109+
new JUnitParser(_extent).ParseTestRunnerOutput(testResultsFilePath);
106110
_extent.Flush();
107111
_filesProcessed++;
108112

109113
_logger.WriteLine(LoggingLevel.Normal, $"Report for '{testResultsFilePath}' is complete.");
114+
return _extent.Stats.ChildCountFail;
110115
}
111116

112117
private void InitializeReporter(ExtentReports extent, string path)

0 commit comments

Comments
 (0)