Skip to content

Commit 6e42b50

Browse files
costin-zaharia-sonarsourcesonartech
authored and
sonartech
committed
NET-891 Unit test import: add import support for nunit projects logging trx
1 parent 8acb7aa commit 6e42b50

File tree

3 files changed

+139
-14
lines changed

3 files changed

+139
-14
lines changed

sonar-dotnet-core/src/main/java/org/sonar/plugins/dotnet/tests/VisualStudioTestResultParser.java

+10-14
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import java.util.List;
2626
import java.util.Map;
2727
import java.util.function.Consumer;
28-
import java.util.regex.Matcher;
2928
import java.util.regex.Pattern;
3029
import org.slf4j.Logger;
3130
import org.slf4j.LoggerFactory;
@@ -76,7 +75,7 @@ private void handleUnitTestResultTag(XmlParserHelper xmlParserHelper) {
7675
}
7776

7877
private void handleUnitTestTag(XmlParserHelper xmlParserHelper) {
79-
String testId = xmlParserHelper.getRequiredAttribute("id");
78+
var testId = xmlParserHelper.getRequiredAttribute("id");
8079

8180
String tagName;
8281
while ((tagName = xmlParserHelper.nextStartTag()) != null) {
@@ -88,19 +87,17 @@ private void handleUnitTestTag(XmlParserHelper xmlParserHelper) {
8887
throw new ParseErrorException("No TestMethod attribute found on UnitTest tag");
8988
}
9089

91-
String methodName = xmlParserHelper.getRequiredAttribute("name");
92-
String className = xmlParserHelper.getRequiredAttribute("className");
93-
String codeBase = xmlParserHelper.getRequiredAttribute("codeBase");
94-
95-
String dllName = extractDllNameFromFilePath(codeBase);
96-
String fullyQualifiedName = dllName + "." + className + "." + methodName;
97-
90+
var methodName = xmlParserHelper.getRequiredAttribute("name");
91+
var className = xmlParserHelper.getRequiredAttribute("className");
92+
var codeBase = xmlParserHelper.getRequiredAttribute("codeBase");
93+
var dllName = extractDllNameFromFilePath(codeBase);
94+
var fullyQualifiedName = getFullName(className + "." + methodName, dllName);
9895
var testIdTestResult = testIdTestResultMap.get(testId);
9996
addTestResultToFile(fullyQualifiedName, testIdTestResult);
10097
}
10198

10299
private Date getRequiredDateAttribute(XmlParserHelper xmlParserHelper, String name) {
103-
String value = xmlParserHelper.getRequiredAttribute(name);
100+
var value = xmlParserHelper.getRequiredAttribute(name);
104101
try {
105102
value = keepOnlyMilliseconds(value);
106103
return dateFormat.parse(value);
@@ -110,10 +107,9 @@ private Date getRequiredDateAttribute(XmlParserHelper xmlParserHelper, String na
110107
}
111108

112109
private String keepOnlyMilliseconds(String value) {
113-
StringBuilder sb = new StringBuilder();
114-
115-
Matcher matcher = millisecondsPattern.matcher(value);
116-
StringBuilder trailingZeros = new StringBuilder();
110+
var sb = new StringBuilder();
111+
var matcher = millisecondsPattern.matcher(value);
112+
var trailingZeros = new StringBuilder();
117113
while (matcher.find()) {
118114
String milliseconds = matcher.group(2);
119115
trailingZeros.setLength(0);

sonar-dotnet-core/src/test/java/org/sonar/plugins/dotnet/tests/VisualStudioTestResultParserTest.java

+48
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,52 @@ public void invalid_test_outcome() {
174174
var exception = assertThrows(IllegalArgumentException.class, () -> sut.parse(file, results, fileMap));
175175
assertEquals("Outcome of unit test must match VSTest Format", exception.getMessage());
176176
}
177+
178+
@Test
179+
public void nunit_project_with_vs_logger() {
180+
Map<String, UnitTestResults> results = new HashMap<>();
181+
Map<String, String> fileMap = new HashMap<>() {
182+
{
183+
put("Calculator.NUnit3.Calculator.NUnit3.GenericTests.GenericTest", "Sample.cs");
184+
put("Calculator.NUnit3.Calculator.NUnit3.Derived.TestMethodInBaseClass", "Sample.cs");
185+
put("Calculator.NUnit3.Calculator.NUnit3.Tests.TestMethod1", "Sample.cs");
186+
put("Calculator.NUnit3.Calculator.NUnit3.Derived.VirtualMethodInBaseClass", "Sample.cs");
187+
}
188+
};
189+
190+
var sut = new VisualStudioTestResultParser();
191+
192+
sut.parse(new File("src/test/resources/visualstudio_test_results/nunitproject_with_vs_logger.trx"), results, fileMap);
193+
194+
assertThat(results).hasSize(1);
195+
assertThat(results.get("Sample.cs").tests()).isEqualTo(6);
196+
assertThat(results.get("Sample.cs").failures()).isZero();
197+
assertThat(results.get("Sample.cs").skipped()).isZero();
198+
assertThat(results.get("Sample.cs").errors()).isZero();
199+
assertThat(results.get("Sample.cs").executionTime()).isEqualTo(10);
200+
201+
assertThat(logTester.logs(Level.WARN)).isEmpty();
202+
203+
var infoLogs = logTester.logs(Level.INFO);
204+
assertThat(infoLogs).hasSize(1);
205+
assertThat(infoLogs.get(0)).startsWith("Parsing the Visual Studio Test Results file ");
206+
207+
var debugLogs = logTester.logs(Level.DEBUG);
208+
assertThat(debugLogs)
209+
.hasSize(12)
210+
.contains(
211+
"Parsed Visual Studio Unit Test - testId: dfbab7a8-4d30-e4af-b7e9-5f143fa0d63c outcome: Passed, duration: 0",
212+
"Parsed Visual Studio Unit Test - testId: e856dddd-b0b9-1283-7d12-995daa1c2159 outcome: Passed, duration: 0",
213+
"Parsed Visual Studio Unit Test - testId: 04f8f26c-73f6-0a50-702c-3424ece7fca7 outcome: Passed, duration: 1",
214+
"Parsed Visual Studio Unit Test - testId: d19495ce-8556-0afa-0598-f28569986b94 outcome: Passed, duration: 2",
215+
"Parsed Visual Studio Unit Test - testId: b1d90856-8e97-2f05-b5a1-46236018b4f5 outcome: Passed, duration: 0",
216+
"Parsed Visual Studio Unit Test - testId: 7c7642ed-18fb-4d66-c0f5-3e220f7aa426 outcome: Passed, duration: 7",
217+
"Added Test Method: Calculator.NUnit3.Calculator.NUnit3.GenericTests.GenericTest to File: Sample.cs",
218+
"Added Test Method: Calculator.NUnit3.Calculator.NUnit3.GenericTests.GenericTest to File: Sample.cs",
219+
"Added Test Method: Calculator.NUnit3.Calculator.NUnit3.Derived.TestMethodInBaseClass to File: Sample.cs",
220+
"Added Test Method: Calculator.NUnit3.Calculator.NUnit3.GenericTests.GenericTest to File: Sample.cs",
221+
"Added Test Method: Calculator.NUnit3.Calculator.NUnit3.Tests.TestMethod1 to File: Sample.cs",
222+
"Added Test Method: Calculator.NUnit3.Calculator.NUnit3.Derived.VirtualMethodInBaseClass to File: Sample.cs"
223+
);
224+
}
177225
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<TestRun id="244abbbf-e5fd-4541-88a6-3a9919f4c512" name="costin.zaharia@PC0245 2024-12-18 09:07:08" runUser="PC0245\costin.zaharia" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
3+
<Times creation="2024-12-18T09:07:08.1509825+01:00" queuing="2024-12-18T09:07:08.1509833+01:00" start="2024-12-18T09:07:07.2829123+01:00" finish="2024-12-18T09:07:08.1570787+01:00" />
4+
<TestSettings name="default" id="5834e899-200f-4680-b96f-f63a3b5458d7">
5+
<Deployment runDeploymentRoot="costin.zaharia_PC0245_2024-12-18_09_07_08" />
6+
</TestSettings>
7+
<Results>
8+
<UnitTestResult executionId="ec34f6ce-6a37-409f-acb8-e0612f3a2e8c" testId="dfbab7a8-4d30-e4af-b7e9-5f143fa0d63c" testName="GenericTest&lt;String&gt;(&quot;string&quot;)" computerName="PC0245" duration="00:00:00.0000790" startTime="2024-12-18T09:07:08.0222850+01:00" endTime="2024-12-18T09:07:08.0223635+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="ec34f6ce-6a37-409f-acb8-e0612f3a2e8c">
9+
<Output>
10+
<StdOut>string</StdOut>
11+
</Output>
12+
</UnitTestResult>
13+
<UnitTestResult executionId="825207e6-be1f-43c6-8344-52a8d2c0c0e4" testId="e856dddd-b0b9-1283-7d12-995daa1c2159" testName="VirtualMethodInBaseClass" computerName="PC0245" duration="00:00:00.0001050" startTime="2024-12-18T09:07:08.0195757+01:00" endTime="2024-12-18T09:07:08.0196808+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="825207e6-be1f-43c6-8344-52a8d2c0c0e4" />
14+
<UnitTestResult executionId="db3f6b01-0d00-4646-b059-b1dc94d7b5c1" testId="04f8f26c-73f6-0a50-702c-3424ece7fca7" testName="GenericTest&lt;Int32&gt;(42)" computerName="PC0245" duration="00:00:00.0002980" startTime="2024-12-18T09:07:08.0219758+01:00" endTime="2024-12-18T09:07:08.0222734+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="db3f6b01-0d00-4646-b059-b1dc94d7b5c1">
15+
<Output>
16+
<StdOut>42</StdOut>
17+
</Output>
18+
</UnitTestResult>
19+
<UnitTestResult executionId="20849c95-99a1-410e-9302-e0ddb7d84f4d" testId="d19495ce-8556-0afa-0598-f28569986b94" testName="TestMethod1" computerName="PC0245" duration="00:00:00.0015540" startTime="2024-12-18T09:07:08.0226028+01:00" endTime="2024-12-18T09:07:08.0241562+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="20849c95-99a1-410e-9302-e0ddb7d84f4d" />
20+
<UnitTestResult executionId="841b18f1-7990-48d7-a9e2-171ac06b79f2" testId="b1d90856-8e97-2f05-b5a1-46236018b4f5" testName="GenericTest&lt;Double&gt;(5E-324.0d)" computerName="PC0245" duration="00:00:00.0000760" startTime="2024-12-18T09:07:08.0223698+01:00" endTime="2024-12-18T09:07:08.0224454+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="841b18f1-7990-48d7-a9e2-171ac06b79f2">
21+
<Output>
22+
<StdOut>5E-324</StdOut>
23+
</Output>
24+
</UnitTestResult>
25+
<UnitTestResult executionId="b0d0933f-c9c3-4657-ab58-14cca4274b66" testId="7c7642ed-18fb-4d66-c0f5-3e220f7aa426" testName="TestMethodInBaseClass" computerName="PC0245" duration="00:00:00.0070170" startTime="2024-12-18T09:07:08.0114692+01:00" endTime="2024-12-18T09:07:08.0184419+01:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" relativeResultsDirectory="b0d0933f-c9c3-4657-ab58-14cca4274b66" />
26+
</Results>
27+
<TestDefinitions>
28+
<UnitTest name="GenericTest&lt;String&gt;(&quot;string&quot;)" storage="d:\src\playgroud\calculator\calculator.nunit3\bin\debug\net9.0\calculator.nunit3.dll" id="dfbab7a8-4d30-e4af-b7e9-5f143fa0d63c">
29+
<Execution id="ec34f6ce-6a37-409f-acb8-e0612f3a2e8c" />
30+
<TestMethod codeBase="D:\src\playgroud\Calculator\Calculator.NUnit3\bin\Debug\net9.0\Calculator.NUnit3.dll" adapterTypeName="executor://nunit3testexecutor/" className="Calculator.NUnit3.GenericTests" name="GenericTest&lt;String&gt;(&quot;string&quot;)" />
31+
</UnitTest>
32+
<UnitTest name="GenericTest&lt;Double&gt;(5E-324.0d)" storage="d:\src\playgroud\calculator\calculator.nunit3\bin\debug\net9.0\calculator.nunit3.dll" id="b1d90856-8e97-2f05-b5a1-46236018b4f5">
33+
<Execution id="841b18f1-7990-48d7-a9e2-171ac06b79f2" />
34+
<TestMethod codeBase="D:\src\playgroud\Calculator\Calculator.NUnit3\bin\Debug\net9.0\Calculator.NUnit3.dll" adapterTypeName="executor://nunit3testexecutor/" className="Calculator.NUnit3.GenericTests" name="GenericTest&lt;Double&gt;(5E-324.0d)" />
35+
</UnitTest>
36+
<UnitTest name="TestMethodInBaseClass" storage="d:\src\playgroud\calculator\calculator.nunit3\bin\debug\net9.0\calculator.nunit3.dll" id="7c7642ed-18fb-4d66-c0f5-3e220f7aa426">
37+
<Execution id="b0d0933f-c9c3-4657-ab58-14cca4274b66" />
38+
<TestMethod codeBase="D:\src\playgroud\Calculator\Calculator.NUnit3\bin\Debug\net9.0\Calculator.NUnit3.dll" adapterTypeName="executor://nunit3testexecutor/" className="Calculator.NUnit3.Derived" name="TestMethodInBaseClass" />
39+
</UnitTest>
40+
<UnitTest name="GenericTest&lt;Int32&gt;(42)" storage="d:\src\playgroud\calculator\calculator.nunit3\bin\debug\net9.0\calculator.nunit3.dll" id="04f8f26c-73f6-0a50-702c-3424ece7fca7">
41+
<Execution id="db3f6b01-0d00-4646-b059-b1dc94d7b5c1" />
42+
<TestMethod codeBase="D:\src\playgroud\Calculator\Calculator.NUnit3\bin\Debug\net9.0\Calculator.NUnit3.dll" adapterTypeName="executor://nunit3testexecutor/" className="Calculator.NUnit3.GenericTests" name="GenericTest&lt;Int32&gt;(42)" />
43+
</UnitTest>
44+
<UnitTest name="TestMethod1" storage="d:\src\playgroud\calculator\calculator.nunit3\bin\debug\net9.0\calculator.nunit3.dll" id="d19495ce-8556-0afa-0598-f28569986b94">
45+
<Execution id="20849c95-99a1-410e-9302-e0ddb7d84f4d" />
46+
<TestMethod codeBase="D:\src\playgroud\Calculator\Calculator.NUnit3\bin\Debug\net9.0\Calculator.NUnit3.dll" adapterTypeName="executor://nunit3testexecutor/" className="Calculator.NUnit3.Tests" name="TestMethod1" />
47+
</UnitTest>
48+
<UnitTest name="VirtualMethodInBaseClass" storage="d:\src\playgroud\calculator\calculator.nunit3\bin\debug\net9.0\calculator.nunit3.dll" id="e856dddd-b0b9-1283-7d12-995daa1c2159">
49+
<Execution id="825207e6-be1f-43c6-8344-52a8d2c0c0e4" />
50+
<TestMethod codeBase="D:\src\playgroud\Calculator\Calculator.NUnit3\bin\Debug\net9.0\Calculator.NUnit3.dll" adapterTypeName="executor://nunit3testexecutor/" className="Calculator.NUnit3.Derived" name="VirtualMethodInBaseClass" />
51+
</UnitTest>
52+
</TestDefinitions>
53+
<TestEntries>
54+
<TestEntry testId="dfbab7a8-4d30-e4af-b7e9-5f143fa0d63c" executionId="ec34f6ce-6a37-409f-acb8-e0612f3a2e8c" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
55+
<TestEntry testId="e856dddd-b0b9-1283-7d12-995daa1c2159" executionId="825207e6-be1f-43c6-8344-52a8d2c0c0e4" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
56+
<TestEntry testId="04f8f26c-73f6-0a50-702c-3424ece7fca7" executionId="db3f6b01-0d00-4646-b059-b1dc94d7b5c1" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
57+
<TestEntry testId="d19495ce-8556-0afa-0598-f28569986b94" executionId="20849c95-99a1-410e-9302-e0ddb7d84f4d" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
58+
<TestEntry testId="b1d90856-8e97-2f05-b5a1-46236018b4f5" executionId="841b18f1-7990-48d7-a9e2-171ac06b79f2" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
59+
<TestEntry testId="7c7642ed-18fb-4d66-c0f5-3e220f7aa426" executionId="b0d0933f-c9c3-4657-ab58-14cca4274b66" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
60+
</TestEntries>
61+
<TestLists>
62+
<TestList name="Results Not in a List" id="8c84fa94-04c1-424b-9868-57a2d4851a1d" />
63+
<TestList name="All Loaded Results" id="19431567-8539-422a-85d7-44ee4e166bda" />
64+
</TestLists>
65+
<ResultSummary outcome="Completed">
66+
<Counters total="6" executed="6" passed="6" failed="0" error="0" timeout="0" aborted="0" inconclusive="0" passedButRunAborted="0" notRunnable="0" notExecuted="0" disconnected="0" warning="0" completed="0" inProgress="0" pending="0" />
67+
<Output>
68+
<StdOut>NUnit Adapter 3.17.0.0: Test execution started&#xD;
69+
Running all tests in D:\src\playgroud\Calculator\Calculator.NUnit3\bin\Debug\net9.0\Calculator.NUnit3.dll&#xD;
70+
NUnit3TestExecutor discovered 6 of 6 NUnit test cases&#xD;
71+
42&#xD;
72+
&#xD;
73+
string&#xD;
74+
&#xD;
75+
5E-324&#xD;
76+
&#xD;
77+
NUnit Adapter 3.17.0.0: Test execution complete&#xD;
78+
</StdOut>
79+
</Output>
80+
</ResultSummary>
81+
</TestRun>

0 commit comments

Comments
 (0)