[elbe-devel] [PATCH 21/37] Use debian packaged python module

Benedikt Spranger b.spranger at linutronix.de
Wed Feb 7 15:28:48 CET 2024


The python module "junit_xml" is not packaged in Debian, while the
module "junitxml" is. Rework the test runner and use "junitxml".

Signed-off-by: Benedikt Spranger <b.spranger at linutronix.de>
---
 debian/control            |  1 +
 elbepack/commands/test.py | 86 +++++++--------------------------------
 2 files changed, 16 insertions(+), 71 deletions(-)

diff --git a/debian/control b/debian/control
index 401bb381..a6c1d0f7 100644
--- a/debian/control
+++ b/debian/control
@@ -21,6 +21,7 @@ Build-Depends: debhelper-compat (= 12),
   python3-beaker,
   python3-cherrypy3,
   python3-debian,
+  python3-junitxml,
   python3-passlib,
   python3-spyne,
   python3-sqlalchemy
diff --git a/elbepack/commands/test.py b/elbepack/commands/test.py
index 2f3e76ef..72fabb5d 100644
--- a/elbepack/commands/test.py
+++ b/elbepack/commands/test.py
@@ -5,13 +5,14 @@
 # elbepack/commands/test.py - Elbe unit test wrapper
 
 import enum
+import io
 import optparse
 import os
 import re
 import unittest
 import warnings
 
-import junit_xml as junit
+import junitxml as junit
 
 from elbepack.shellhelper import command_out
 
@@ -133,79 +134,23 @@ class ElbeTestResult(unittest.TestResult):
 
     def __init__(self):
         super().__init__()
-        self.cases = []
-        self.current_case = None
+        self.buffer = io.StringIO()
+        self.result = junit.JUnitXmlResult(self.buffer)
+        self.success = False
 
-    def startTest(self, test):
-        self.current_case = junit.TestCase(name=str(test))
-        self.cases.append(self.current_case)
-        super().startTest(test)
+    def run_testsuite(self, suite):
+        self.result.startTestRun()
+        unittest.TestSuite(suite).run(self.result)
+        self.result.stopTestRun()
+        self.success = self.result.wasSuccessful()
 
-    def addError(self, test, err):
-        """Called when an error has occurred. 'err' is a tuple of values as
-           returned by sys.exc_info().
-        """
-
-        message = str(err[1])
-        output = self._exc_info_to_string(err, test)
-
-        if err is not None:
-            if issubclass(err[0], ElbeTestException):
-                self.current_case.stdout = err[1].out
-
-        self.current_case.add_error_info(message, output)
-        super().addError(test, err)
-
-    def addFailure(self, test, err):
-        """Called when an error has occurred. 'err' is a tuple of values as
-           returned by sys.exc_info()."""
-
-        message = str(err[1])
-        output = self._exc_info_to_string(err, test)
-
-        if err is not None:
-            if issubclass(err[0], ElbeTestException):
-                self.current_case.stdout = err[1].out
-
-        self.current_case.add_failure_info(message, output)
-        super().addFailure(test, err)
-
-    def addSubTest(self, test, subtest, err):
-        """Called at the end of a subtest.
-           'err' is None if the subtest ended successfully, otherwise it's a
-           tuple of values as returned by sys.exc_info().
-        """
-
-        self.current_case = junit.TestCase(name=str(subtest))
-        self.cases.append(self.current_case)
-
-        if err is not None:
-            message = str(err[1])
-            output = self._exc_info_to_string(err, test)
-
-            if issubclass(err[0], ElbeTestException):
-                self.current_case.stdout = err[1].out
-
-            if issubclass(err[0], test.failureException):
-                self.current_case.add_failure_info(message, output)
-            else:
-                self.current_case.add_error_info(message, output)
-
-        super().addSubTest(test, subtest, err)
-
-    def addSkip(self, test, reason):
-        """Called when a test is skipped."""
-        self.current_case.add_skipped_info(message=reason)
-        if test.stdout is not None:
-            self.current_case.stdout = test.stdout
-        super().addSkip(test, reason)
+    def wasSuccessful(self):
+        return self.success
 
     def get_xml(self):
-        ts = junit.TestSuite(name="test", test_cases=self.cases)
-
         with warnings.catch_warnings():
             warnings.simplefilter("ignore")
-            results = junit.TestSuite.to_xml_string([ts], encoding="utf-8")
+            results = self.buffer.getvalue()
 
         return results
 
@@ -271,9 +216,7 @@ def run_command(argv):
 
     result = ElbeTestResult()
 
-    for test in suite:
-        print(test)
-        test.run(result)
+    result.run_testsuite(suite)
 
     if opt.output is None:
         print(result.get_xml())
@@ -282,4 +225,5 @@ def run_command(argv):
             f.write(result.get_xml())
 
     if not result.wasSuccessful():
+        print("Testsuite failed.")
         os.sys.exit(77)
-- 
2.43.0



More information about the elbe-devel mailing list