From 5c84e04a519d0236b4b7e17a7ba1f5ba837103fb Mon Sep 17 00:00:00 2001
From: Johan Holmberg <holmberg556@gmail.com>
Date: Mon, 28 Nov 2016 13:21:21 +0100
Subject: [PATCH] add 'time=n.nnn' attribute in JUnit output

---
 lib/cmdtest/junitfile.rb   | 38 +++++++++++++++++++++++---------------
 lib/cmdtest/junitlogger.rb | 15 ++++++++++++---
 2 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/lib/cmdtest/junitfile.rb b/lib/cmdtest/junitfile.rb
index 0a2a0c3..1c78bb4 100644
--- a/lib/cmdtest/junitfile.rb
+++ b/lib/cmdtest/junitfile.rb
@@ -49,9 +49,10 @@ module Cmdtest
 
     class Testcase
       def write(f)
-        f.put '    <testcase classname="%s" name="%s"/>', [
+        f.put '    <testcase classname="%s" name="%s" time="%.3f"/>', [
           @classname,
           @name,
+          @duration,
         ]
       end
     end
@@ -60,7 +61,8 @@ module Cmdtest
 
     class OkTestcase < Testcase
 
-      def initialize(classname, name)
+      def initialize(duration, classname, name)
+        @duration  = duration
         @classname = classname
         @name      = name
         @message = @type = @text = nil
@@ -72,7 +74,8 @@ module Cmdtest
 
     class ProblemTestcase < Testcase
 
-      def initialize(classname, name, message, type, text)
+      def initialize(duration, classname, name, message, type, text)
+        @duration  = duration
         @classname = classname
         @name      = name
         @message   = message
@@ -81,9 +84,10 @@ module Cmdtest
       end
 
       def write(f)
-        f.put '    <testcase classname="%s" name="%s">', [
+        f.put '    <testcase classname="%s" name="%s" time="%.3f">', [
           @classname,
           @name,
+          @duration,
         ]
         f.put '      <%s message="%s" type="%s">%s</%s>', [
           xml_tag,
@@ -114,37 +118,41 @@ module Cmdtest
 
     class Testsuite
 
+      attr_accessor :duration
+
       def initialize(package, name)
         @package = package
         @name = name
         @testcases = []
+        @duration = 0.0
       end
 
-      def ok_testcase(classname, name)
-        testcase = OkTestcase.new(classname, name)
+      def ok_testcase(duration, classname, name)
+        testcase = OkTestcase.new(duration, classname, name)
         @testcases << testcase
         testcase
       end
 
-      def err_testcase(classname, name, message, type, text)
-        testcase = ErrTestcase.new(classname, name, message, type, text)
+      def err_testcase(duration, classname, name, message, type, text)
+        testcase = ErrTestcase.new(duration, classname, name, message, type, text)
         @testcases << testcase
         testcase
       end
 
-      def skip_testcase(classname, name, message, type, text)
-        testcase = SkipTestcase.new(classname, name, message, type, text)
+      def skip_testcase(duration, classname, name, message, type, text)
+        testcase = SkipTestcase.new(duration, classname, name, message, type, text)
         @testcases << testcase
         testcase
       end
 
       def write(f)
-        f.put '  <testsuite errors="%d" failures="%d" skipped="%d" name="%s" tests="%d" package="%s">', [
+        f.put '  <testsuite errors="%d" failures="%d" skipped="%d" name="%s" tests="%d" time="%.3f" package="%s">', [
           0,
           @testcases.grep(ErrTestcase).size,
           @testcases.grep(SkipTestcase).size,
           @name,
           @testcases.size,
+          @duration,
           @package,
         ]
         for testcase in @testcases
@@ -184,13 +192,13 @@ end
 if $0 == __FILE__
   jf = Cmdtest::JunitFile.new("jh.xml")
   ts = jf.new_testsuite("foo")
-  ts.ok_testcase("jh.Foo", "test_a")
-  ts.ok_testcase("jh.Foo", "test_b")
+  ts.ok_testcase(1.0, "jh.Foo", "test_a")
+  ts.ok_testcase(1.0, "jh.Foo", "test_b")
 
-  ts.err_testcase("jh.Foo", "test_c", "2 > 1", "assert", "111\n222\n333\n")
+  ts.err_testcase(1.0, "jh.Foo", "test_c", "2 > 1", "assert", "111\n222\n333\n")
 
   ts = jf.new_testsuite("bar")
-  ts.ok_testcase("jh.Bar", "test_x")
+  ts.ok_testcase(1.0, "jh.Bar", "test_x")
 
   jf.write
 end
diff --git a/lib/cmdtest/junitlogger.rb b/lib/cmdtest/junitlogger.rb
index bd9b6e3..49a8da8 100644
--- a/lib/cmdtest/junitlogger.rb
+++ b/lib/cmdtest/junitlogger.rb
@@ -35,28 +35,37 @@ module Cmdtest
     end
 
     def testclass_begin(testcase_class_name)
+      @testclass_t1 = Time.now
       @testcase_class_name = testcase_class_name
       @ts = @jf.new_testsuite("CMDTEST", testcase_class_name)
     end
 
+    def testclass_end(testcase_class_name)
+      @testclass_t2 = Time.now
+      @ts.duration = @testclass_t2 - @testclass_t1
+    end
+
     def testmethod_begin(method)
       @err_assertions = []
       @err_skip = nil
+      @t1 = Time.now
     end
 
     def testmethod_end(method)
+      @t2 = Time.now
+      @duration = @t2 - @t1
       if @err_skip != nil
         message = @err_skip.split(/\n/)[0]
         type = "skip"
         text = @err_skip
-        @ts.skip_testcase(_xml_class, method, message, type, text)
+        @ts.skip_testcase(@duration, _xml_class, method, message, type, text)
       elsif @err_assertions.size > 0
         message = @err_assertions[0].split(/\n/)[0]
         type = "assert"
         text = @err_assertions.join
-        @ts.err_testcase(_xml_class, method, message, type, text)
+        @ts.err_testcase(@duration, _xml_class, method, message, type, text)
       else
-        @ts.ok_testcase(_xml_class, method)
+        @ts.ok_testcase(@duration, _xml_class, method)
       end
     end