Navigation Menu

Skip to content

Commit

Permalink
Create WorkerResult and move statistics info to it
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Aug 11, 2012
1 parent 64a6906 commit fb0f29e
Showing 1 changed file with 113 additions and 97 deletions.
210 changes: 113 additions & 97 deletions lib/groonga/tester.rb
Expand Up @@ -228,11 +228,55 @@ def command_exist?(name)
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
Expand All @@ -242,12 +286,7 @@ def initialize(id, tester, test_suites_result, reporter)
@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
Expand All @@ -263,29 +302,11 @@ def test_name
@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
Expand Down Expand Up @@ -321,92 +342,72 @@ def start_test

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 = @workers.collect do |worker|
worker.result.send(item)
end
counts.inject(&:+)
end
end

Expand Down Expand Up @@ -434,18 +435,18 @@ def run_test_suites(test_suites)
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 = []
Expand Down Expand Up @@ -1288,15 +1289,31 @@ def initialize(tester)

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)
Expand Down Expand Up @@ -1381,7 +1398,7 @@ def initialize(tester)
super
end

def start(workers, n_tests)
def start(result)
end

def start_worker(worker)
Expand Down Expand Up @@ -1439,12 +1456,10 @@ class InplaceReporter < BaseReporter
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)
Expand Down Expand Up @@ -1484,7 +1499,7 @@ def finish_suite(worker)
redraw
end

def finish_worker(worker_id)
def finish_worker(worker)
redraw
end

Expand All @@ -1496,7 +1511,7 @@ def finish(result)

private
def draw
@workers.each do |worker|
@test_suites_result.workers.each do |worker|
draw_status_line(worker)
draw_test_line(worker)
end
Expand All @@ -1518,14 +1533,15 @@ def draw_test_line(worker)
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 = @workers.collect(&: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 = "|"
Expand All @@ -1536,7 +1552,7 @@ def draw_progress_line
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 = ">"
Expand Down

0 comments on commit fb0f29e

Please sign in to comment.