<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17387">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Improve junit xml generated fields<br><br>Change-Id: Ie2d10cee88a9c0d829e4620553164cf3150e8e5c<br>---<br>M src/osmo_gsm_tester/report.py<br>M src/osmo_gsm_tester/suite.py<br>M src/osmo_gsm_tester/test.py<br>3 files changed, 36 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/87/17387/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/report.py b/src/osmo_gsm_tester/report.py</span><br><span>index 5d23c38..d33ba43 100644</span><br><span>--- a/src/osmo_gsm_tester/report.py</span><br><span>+++ b/src/osmo_gsm_tester/report.py</span><br><span>@@ -17,6 +17,8 @@</span><br><span> # You should have received a copy of the GNU General Public License</span><br><span> # along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# junit xml format: https://llg.cubic.org/docs/junit/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> import math</span><br><span> import sys</span><br><span> import re</span><br><span>@@ -50,9 +52,24 @@</span><br><span> </span><br><span> def trial_to_junit(trial):</span><br><span>     testsuites = et.Element('testsuites')</span><br><span style="color: hsl(120, 100%, 40%);">+    num_tests = 0</span><br><span style="color: hsl(120, 100%, 40%);">+    num_failures = 0</span><br><span style="color: hsl(120, 100%, 40%);">+    num_errors = 0</span><br><span style="color: hsl(120, 100%, 40%);">+    time = 0</span><br><span style="color: hsl(120, 100%, 40%);">+    id = 0</span><br><span>     for suite in trial.suites:</span><br><span>         testsuite = suite_to_junit(suite)</span><br><span style="color: hsl(120, 100%, 40%);">+        testsuite.set('id', str(id))</span><br><span style="color: hsl(120, 100%, 40%);">+        id += 1</span><br><span>         testsuites.append(testsuite)</span><br><span style="color: hsl(120, 100%, 40%);">+        num_tests += int(testsuite.get('tests'))</span><br><span style="color: hsl(120, 100%, 40%);">+        num_failures += int(testsuite.get('failures'))</span><br><span style="color: hsl(120, 100%, 40%);">+        num_errors += int(testsuite.get('errors'))</span><br><span style="color: hsl(120, 100%, 40%);">+        time += suite.duration</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuites.set('tests', str(num_tests))</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuites.set('errors', str(num_errors))</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuites.set('failures', str(num_failures))</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuites.set('time', str(math.ceil(time)))</span><br><span>     return testsuites</span><br><span> </span><br><span> def suite_to_junit(suite):</span><br><span>@@ -63,7 +80,11 @@</span><br><span>         testsuite.set('timestamp', datetime.fromtimestamp(round(suite.start_timestamp)).isoformat())</span><br><span>         testsuite.set('time', str(math.ceil(suite.duration)))</span><br><span>     testsuite.set('tests', str(len(suite.tests)))</span><br><span style="color: hsl(0, 100%, 40%);">-    testsuite.set('failures', str(suite.count_test_results()[2]))</span><br><span style="color: hsl(120, 100%, 40%);">+    passed, skipped, failed, errors = suite.count_test_results()</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuite.set('errors', str(errors))</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuite.set('failures', str(failed))</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuite.set('skipped', str(skipped))</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuite.set('disabled', str(skipped))</span><br><span>     for suite_test in suite.tests:</span><br><span>         testcase = test_to_junit(suite_test)</span><br><span>         testsuite.append(testcase)</span><br><span>@@ -72,6 +93,7 @@</span><br><span> def test_to_junit(t):</span><br><span>     testcase = et.Element('testcase')</span><br><span>     testcase.set('name', t.name())</span><br><span style="color: hsl(120, 100%, 40%);">+    testcase.set('classname', '')</span><br><span>     testcase.set('time', str(math.ceil(t.duration)))</span><br><span>     if t.status == test.Test.SKIP:</span><br><span>         et.SubElement(testcase, 'skipped')</span><br><span>@@ -113,10 +135,12 @@</span><br><span>     if not suite.tests:</span><br><span>         return 'no tests were run.'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    passed, skipped, failed = suite.count_test_results()</span><br><span style="color: hsl(120, 100%, 40%);">+    passed, skipped, failed, errors = suite.count_test_results()</span><br><span>     details = []</span><br><span>     if failed:</span><br><span>         details.append('fail: %d' % failed)</span><br><span style="color: hsl(120, 100%, 40%);">+    if errors:</span><br><span style="color: hsl(120, 100%, 40%);">+        details.append('errors: %d' % errors)</span><br><span>     if passed:</span><br><span>         details.append('pass: %d' % passed)</span><br><span>     if skipped:</span><br><span>diff --git a/src/osmo_gsm_tester/suite.py b/src/osmo_gsm_tester/suite.py</span><br><span>index c2faa36..8c79d35 100644</span><br><span>--- a/src/osmo_gsm_tester/suite.py</span><br><span>+++ b/src/osmo_gsm_tester/suite.py</span><br><span>@@ -213,9 +213,9 @@</span><br><span>             util.import_path_remove(suite_libdir)</span><br><span>             self.duration = time.time() - self.start_timestamp</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            passed, skipped, failed = self.count_test_results()</span><br><span style="color: hsl(120, 100%, 40%);">+            passed, skipped, failed, errors = self.count_test_results()</span><br><span>             # if no tests ran, count it as failure</span><br><span style="color: hsl(0, 100%, 40%);">-            if passed and not failed:</span><br><span style="color: hsl(120, 100%, 40%);">+            if passed and not failed and not errors:</span><br><span>                 self.status = SuiteRun.PASS</span><br><span>             else:</span><br><span>                 self.status = SuiteRun.FAIL</span><br><span>@@ -229,14 +229,17 @@</span><br><span>         passed = 0</span><br><span>         skipped = 0</span><br><span>         failed = 0</span><br><span style="color: hsl(120, 100%, 40%);">+        errors = 0</span><br><span>         for t in self.tests:</span><br><span style="color: hsl(0, 100%, 40%);">-            if t.status == test.Test.PASS:</span><br><span style="color: hsl(120, 100%, 40%);">+            if t.status == test.Test.SKIP:</span><br><span style="color: hsl(120, 100%, 40%);">+                skipped += 1</span><br><span style="color: hsl(120, 100%, 40%);">+            elif t.status == test.Test.PASS:</span><br><span>                 passed += 1</span><br><span>             elif t.status == test.Test.FAIL:</span><br><span>                 failed += 1</span><br><span style="color: hsl(0, 100%, 40%);">-            else:</span><br><span style="color: hsl(0, 100%, 40%);">-                skipped += 1</span><br><span style="color: hsl(0, 100%, 40%);">-        return (passed, skipped, failed)</span><br><span style="color: hsl(120, 100%, 40%);">+            else: # error, could not run</span><br><span style="color: hsl(120, 100%, 40%);">+                errors += 1</span><br><span style="color: hsl(120, 100%, 40%);">+        return (passed, skipped, failed, errors)</span><br><span> </span><br><span>     def remember_to_stop(self, process, respawn=False):</span><br><span>         '''Ask suite to monitor and manage lifecycle of the Process object. If a</span><br><span>diff --git a/src/osmo_gsm_tester/test.py b/src/osmo_gsm_tester/test.py</span><br><span>index be6e8da..0bbff41 100644</span><br><span>--- a/src/osmo_gsm_tester/test.py</span><br><span>+++ b/src/osmo_gsm_tester/test.py</span><br><span>@@ -26,7 +26,7 @@</span><br><span> from . import log, util, resource</span><br><span> </span><br><span> class Test(log.Origin):</span><br><span style="color: hsl(0, 100%, 40%);">-    UNKNOWN = 'UNKNOWN'</span><br><span style="color: hsl(120, 100%, 40%);">+    UNKNOWN = 'UNKNOWN' # matches junit 'error'</span><br><span>     SKIP = 'skip'</span><br><span>     PASS = 'pass'</span><br><span>     FAIL = 'FAIL'</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17387">change 17387</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17387"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gsm-tester </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie2d10cee88a9c0d829e4620553164cf3150e8e5c </div>
<div style="display:none"> Gerrit-Change-Number: 17387 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>