[llvm] r332064 - Refactor xunit test case builder to not use as much str addition

Chris Matthews via llvm-commits llvm-commits at lists.llvm.org
Thu May 10 17:25:42 PDT 2018


Author: cmatthews
Date: Thu May 10 17:25:42 2018
New Revision: 332064

URL: http://llvm.org/viewvc/llvm-project?rev=332064&view=rev
Log:
Refactor xunit test case builder to not use as much str addition

String concatenation in python is slow.  Refactor to not concatenate the
possibly large strings of test output and instead write them directly
to the output file.

Modified:
    llvm/trunk/utils/lit/lit/Test.py
    llvm/trunk/utils/lit/lit/main.py

Modified: llvm/trunk/utils/lit/lit/Test.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/Test.py?rev=332064&r1=332063&r2=332064&view=diff
==============================================================================
--- llvm/trunk/utils/lit/lit/Test.py (original)
+++ llvm/trunk/utils/lit/lit/Test.py Thu May 10 17:25:42 2018
@@ -360,7 +360,8 @@ class Test:
         """
         return self.suite.config.is_early
 
-    def getJUnitXML(self):
+    def writeJUnitXML(self, fil):
+        """Write the test's report xml representation to a file handle."""
         test_name = escape(self.path_in_suite[-1])
         test_path = self.path_in_suite[:-1]
         safe_test_path = [x.replace(".","_") for x in test_path]
@@ -370,14 +371,13 @@ class Test:
             class_name = safe_name + "." + "/".join(safe_test_path) 
         else:
             class_name = safe_name + "." + safe_name
-
-        xml = "<testcase classname='" + class_name + "' name='" + \
-            test_name + "'"
-        xml += " time='{:.2f}'".format(
-            self.result.elapsed if self.result.elapsed is not None else 0.0)
+        testcase_template = u"<testcase classname='{class_name}' name='{test_name}' time='{time:.2f}'"
+        elapsed_time = self.result.elapsed if self.result.elapsed is not None else 0.0
+        testcase_xml = testcase_template.format(class_name=class_name, test_name=test_name, time=elapsed_time)
+        fil.write(testcase_xml)
         if self.result.code.isFailure:
-            xml += ">\n\t<failure >\n" + escape(self.result.output)
-            xml += "\n\t</failure>\n</testcase>"
+            fil.write(">\n\t<failure >\n")
+            fil.write(escape(self.result.output))
+            fil.write("\n\t</failure>\n</testcase>")
         else:
-            xml += "/>"
-        return xml
+            fil.write("/>")

Modified: llvm/trunk/utils/lit/lit/main.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/main.py?rev=332064&r1=332063&r2=332064&view=diff
==============================================================================
--- llvm/trunk/utils/lit/lit/main.py (original)
+++ llvm/trunk/utils/lit/lit/main.py Thu May 10 17:25:42 2018
@@ -614,7 +614,8 @@ def main_with_tmp(builtinParameters):
             xunit_output_file.write(" failures='" + str(suite['failures']) + 
               "'>\n")
             for result_test in suite['tests']:
-                xunit_output_file.write(result_test.getJUnitXML() + "\n")
+                result_test.writeJUnitXML(xunit_output_file)
+                xunit_output_file.write("\n")
             xunit_output_file.write("</testsuite>\n")
         xunit_output_file.write("</testsuites>")
         xunit_output_file.close()




More information about the llvm-commits mailing list