[Groonga-commit] groonga/grntest [master] Create WorkerResult and move statistics info to it

Back to archive index

Kouhei Sutou null+****@clear*****
Sat Aug 11 17:00:42 JST 2012


Kouhei Sutou	2012-08-11 17:00:42 +0900 (Sat, 11 Aug 2012)

  New Revision: fb0f29eb77e71e0f63463824dda1f781e5e75377
  https://github.com/groonga/grntest/commit/fb0f29eb77e71e0f63463824dda1f781e5e75377

  Log:
    Create WorkerResult and move statistics info to it

  Modified files:
    lib/groonga/tester.rb

  Modified: lib/groonga/tester.rb (+113 -97)
===================================================================
--- lib/groonga/tester.rb    2012-08-11 16:37:49 +0900 (298339c)
+++ lib/groonga/tester.rb    2012-08-11 17:00:42 +0900 (d4aa464)
@@ -228,11 +228,55 @@ module Groonga
       false
     end
 
+    class Result
+      attr_accessor :elapsed_time
+      def initialize
+        @elapsed_time = 0
+      end
+
+      def measure
+        start_time = Time.now
+        yield
+      ensure
+        @elapsed_time = Time.now - start_time
+      end
+    end
+
+    class WorkerResult < Result
+      attr_reader :n_tests, :n_passed_tests, :n_not_checked_tests
+      attr_reader :failed_tests
+      def initialize
+        super
+        @n_tests = 0
+        @n_passed_tests = 0
+        @n_not_checked_tests = 0
+        @failed_tests = []
+      end
+
+      def n_failed_tests
+        @failed_tests.size
+      end
+
+      def test_finished
+        @n_tests += 1
+      end
+
+      def test_passed
+        @n_passed_tests += 1
+      end
+
+      def test_failed(name)
+        @failed_tests << name
+      end
+
+      def test_not_checked
+        @n_not_checked_tests += 1
+      end
+    end
+
     class Worker
       attr_reader :id, :tester, :test_suites_rusult, :reporter
-      attr_reader :suite_name, :test_script_path, :status
-      attr_reader :n_tests, :n_passed_tests, :n_failed_tests
-      attr_reader :n_not_checked_tests, :elapsed_time
+      attr_reader :suite_name, :test_script_path, :status, :result
       def initialize(id, tester, test_suites_result, reporter)
         @id = id
         @tester = tester
@@ -242,12 +286,7 @@ module Groonga
         @test_script_path = nil
         @interruptted = false
         @status = "not running"
-
-        @n_tests = 0
-        @n_passed_tests = 0
-        @n_failed_tests = 0
-        @n_not_checked_tests = 0
-        @elapsed_time = 0
+        @result = WorkerResult.new
       end
 
       def interrupt
@@ -263,29 +302,11 @@ module Groonga
         @test_script_path.basename(".*").to_s
       end
 
-      def statistics
-        items = [
-          "#{@n_tests} tests",
-          "#{@n_passed_tests} passes",
-          "#{@n_failed_tests} failures",
-          "#{@n_not_checked_tests} not checked_tests",
-        ]
-        "#{throughput}: " + items.join(", ")
-      end
-
-      def throughput
-        if @elapsed_time.zero?
-          tests_per_second = 0
-        else
-          tests_per_second = @n_tests / @elapsed_time
-        end
-        "%6.2f tests/sec" % tests_per_second
-      end
-
       def run(queue)
         succeeded = true
 
-        measure do
+        @result.measure do
+          @test_suites_result.start_worker(self)
           @reporter.start_worker(self)
           catch do |tag|
             loop do
@@ -321,92 +342,72 @@ module Groonga
 
       def pass_test(result)
         @status = "passed"
-        @n_passed_tests += 1
-        @test_suites_result.test_passed
+        @result.test_passed
         @reporter.pass_test(self, result)
       end
 
       def fail_test(result)
         @status = "failed"
-        @n_failed_tests += 1
-        @test_suites_result.test_failed(test_name)
+        @result.test_failed(test_name)
         @reporter.fail_test(self, result)
       end
 
       def no_check_test(result)
         @status = "not checked"
-        @n_not_checked_tests += 1
-        @test_suites_result.test_not_checked
+        @result.test_not_checked
         @reporter.no_check_test(self, result)
       end
 
       def finish_test(result)
-        @n_tests += 1
-        @test_suites_result.test_finished
+        @result.test_finished
         @reporter.finish_test(self, result)
         @test_script_path = nil
       end
-
-      private
-      def measure
-        started_time = Time.now
-        yield
-      ensure
-        @elapsed_time = Time.now - started_time
-      end
-    end
-
-    class Result
-      attr_accessor :elapsed_time
-      def initialize
-        @elapsed_time = 0
-      end
-
-      def measure
-        start_time = Time.now
-        yield
-      ensure
-        @elapsed_time = Time.now - start_time
-      end
     end
 
     class TestSuitesResult < Result
-      attr_reader :n_tests, :n_passed_tests, :n_not_checked_tests
-      attr_reader :failed_tests
+      attr_reader :workers
+      attr_accessor :n_total_tests
       def initialize
         super
-        @n_tests = 0
-        @n_passed_tests = 0
-        @n_not_checked_tests = 0
-        @failed_tests = []
+        @workers = []
+        @n_total_tests = 0
       end
 
-      def n_failed_tests
-        @failed_tests.size
+      def start_worker(worker)
+        @workers << worker
       end
 
       def pass_ratio
-        if @n_tests.zero?
+        if n_tests.zero?
           0
         else
-          (@n_passed_tests / @n_tests.to_f) * 100
+          (n_passed_tests / n_tests.to_f) * 100
         end
       end
 
-      def test_finished
-        @n_tests += 1
+      def n_tests
+        collect_count(:n_tests)
       end
 
-      def test_passed
-        @n_passed_tests += 1
+      def n_passed_tests
+        collect_count(:n_passed_tests)
       end
 
-      def test_failed(name)
-        @failed_tests << name
+      def n_failed_tests
+        collect_count(:n_failed_tests)
       end
 
-      def test_not_checked
-        @n_not_checked_tests += 1
+      def n_not_checked_tests
+        collect_count(:n_not_checked_tests)
+      end
+
+      private
+      def collect_count(item)
+        counts =****@worke***** do |worker|
+          worker.result.send(item)
+        end
+        counts.inject(&:+)
       end
     end
 
@@ -434,18 +435,18 @@ module Groonga
         test_suites.each do |suite_name, test_script_paths|
           test_script_paths.each do |test_script_path|
             queue << [suite_name, test_script_path]
+            @result.n_total_tests += 1
           end
         end
+        @tester.n_workers.times do
+          queue << nil
+        end
 
         workers = []
         @tester.n_workers.times do |i|
           workers << Worker.new(i, @tester, @result, @reporter)
         end
-        @reporter.start(workers.dup, queue.size)
-
-        @tester.n_workers.times do
-          queue << nil
-        end
+        @reporter.start(@result)
 
         succeeded = true
         worker_threads = []
@@ -1288,15 +1289,31 @@ EOF
 
       private
       def report_summary(result)
-        puts("#{result.n_tests} tests, " +
-               "#{result.n_passed_tests} passes, " +
-               "#{result.n_failed_tests} failures, " +
-               "#{result.n_not_checked_tests} not checked tests.")
+        puts(statistics(result))
         pass_ratio = result.pass_ratio
         elapsed_time = result.elapsed_time
         puts("%.4g%% passed in %.4fs." % [pass_ratio, elapsed_time])
       end
 
+      def statistics(result)
+        items = [
+          "#{result.n_tests} tests",
+          "#{result.n_passed_tests} passes",
+          "#{result.n_failed_tests} failures",
+          "#{result.n_not_checked_tests} not checked_tests",
+        ]
+        "#{throughput(result)}: " + items.join(", ")
+      end
+
+      def throughput(result)
+        if result.elapsed_time.zero?
+          tests_per_second = 0
+        else
+          tests_per_second = result.n_tests / result.elapsed_time
+        end
+        "%.2f tests/sec" % tests_per_second
+      end
+
       def report_failure(result)
         report_marker
         report_diff(result.expected, result.actual)
@@ -1381,7 +1398,7 @@ EOF
         super
       end
 
-      def start(workers, n_tests)
+      def start(result)
       end
 
       def start_worker(worker)
@@ -1439,12 +1456,10 @@ EOF
       def initialize(tester)
         super
         @mutex = Mutex.new
-        @workers = nil
       end
 
-      def start(workers, n_tests)
-        @workers = workers
-        @n_tests = n_tests
+      def start(result)
+        @test_suites_result = result
       end
 
       def start_worker(worker)
@@ -1484,7 +1499,7 @@ EOF
         redraw
       end
 
-      def finish_worker(worker_id)
+      def finish_worker(worker)
         redraw
       end
 
@@ -1496,7 +1511,7 @@ EOF
 
       private
       def draw
-        @workers.each do |worker|
+        @test_suites_result.workers.each do |worker|
           draw_status_line(worker)
           draw_test_line(worker)
         end
@@ -1518,14 +1533,15 @@ EOF
         if worker.test_name
           label = "  #{worker.test_name}"
         else
-          label = "  #{worker.statistics}"
+          label = "  #{statistics(worker.result)}"
         end
         puts(justify(label, @term_width))
       end
 
       def draw_progress_line
-        n_done_tests =****@worke*****(&:n_tests).inject(&:+)
-        finished_test_ratio = n_done_tests.to_f / @n_tests
+        n_done_tests = @test_suites_result.n_tests
+        n_total_tests = @test_suites_result.n_total_tests
+        finished_test_ratio = n_done_tests.to_f / n_total_tests
 
         start_mark = "|"
         finish_mark = "|"
@@ -1536,7 +1552,7 @@ EOF
         progress_width -= finish_mark.bytesize
         progress_width -= statistics.bytesize
         finished_mark = "="
-        if n_done_tests == @n_tests
+        if n_done_tests == n_total_tests
           progress = finished_mark * progress_width
         else
           current_mark = ">"
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index