celluloid-benchmark 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/lib/celluloid_benchmark/benchmark.rb +50 -0
- data/lib/celluloid_benchmark/benchmark_run.rb +82 -0
- data/lib/celluloid_benchmark/runner.rb +34 -0
- data/lib/celluloid_benchmark/version.rb +3 -0
- data/lib/celluloid_benchmark/visitor.rb +79 -0
- data/lib/celluloid_benchmark/visitor_group.rb +11 -0
- metadata +9 -22
- data/test/files/runner_test_session.rb +0 -2
- data/test/integration/config.ru +0 -9
- data/test/integration/html/404.html +0 -10
- data/test/integration/html/index.html +0 -10
- data/test/integration/integration_test.rb +0 -55
- data/test/integration/test_session.rb +0 -2
- data/test/unit/benchmark_run_test.rb +0 -130
- data/test/unit/benchmark_test.rb +0 -107
- data/test/unit/runner_test.rb +0 -24
- data/test/unit/visitor_test.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d6ca6a307e6c743b6024e66193242e30daebf58
|
4
|
+
data.tar.gz: 13a15f647b8b7fb852f92930e6f16ed3d23019fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fafc822aa34fbde4808ec16a08d3752621bdb5d8c10eb2333c78e2414a00b04a303a3981c14c129ce956f3e4cd12950f114fc0cba90d01792aa3f462536a5cf1
|
7
|
+
data.tar.gz: 03fd8a7cc021d5a1ef7f77c9abd647b752b762a5a7c8c98b6b1e3ac47e250263e71615e7c1c28e0dddd2d4a5f819d7b97c0597d400fc1c110d6fad0d2c2133e2
|
data/README.md
CHANGED
@@ -5,7 +5,10 @@ for high concurrency. Use [Mechanize](http://mechanize.rubyforge.org) for a real
|
|
5
5
|
|
6
6
|
Getting Started
|
7
7
|
===============
|
8
|
-
celluloid-benchmark
|
8
|
+
gem install celluloid-benchmark
|
9
|
+
echo "benchmark :home_page, 1
|
10
|
+
get 'https://github.com/scottwillson/celluloid-benchmark'" > session.rb
|
11
|
+
celluloid-benchmark session.rb 1
|
9
12
|
|
10
13
|
Congrats! You just load-tested the project's Github page.
|
11
14
|
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module CelluloidBenchmark
|
2
|
+
# List of responses for a benchmark defined in test scenario.
|
3
|
+
#
|
4
|
+
# For example, requests for /offers/1001, /offers/1001-burgerville-deal, /offers/2200
|
5
|
+
# might all be grouped under the "offer_show" label
|
6
|
+
#
|
7
|
+
# Call #ok? to check that responses were OK and fast enough.
|
8
|
+
class Benchmark
|
9
|
+
attr_reader :label
|
10
|
+
attr_reader :response_codes
|
11
|
+
attr_reader :response_times
|
12
|
+
attr_reader :threshold
|
13
|
+
|
14
|
+
def initialize(label, threshold, response_times, response_codes)
|
15
|
+
raise(ArgumentError, "label cannot be blank") if label.nil? || label == ""
|
16
|
+
|
17
|
+
@label = label
|
18
|
+
@response_times = response_times || []
|
19
|
+
@threshold = threshold || 3.0
|
20
|
+
@response_codes = response_codes || []
|
21
|
+
|
22
|
+
raise(ArgumentError, "threshold must be greater than zero") if self.threshold <= 0
|
23
|
+
end
|
24
|
+
|
25
|
+
def ok?
|
26
|
+
response_times_ok? && response_codes_ok?
|
27
|
+
end
|
28
|
+
|
29
|
+
# Consider average response time. Do not check for outlying slow times.
|
30
|
+
def response_times_ok?
|
31
|
+
if response_times.size > 0
|
32
|
+
average_response_time <= threshold
|
33
|
+
else
|
34
|
+
true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# 200 OK is ... OK, as is a redirect, not modified, or auth required
|
39
|
+
def response_codes_ok?
|
40
|
+
response_codes.all? { |code| code == 200 || code == 302 || code == 304 || code == 401 }
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def average_response_time
|
47
|
+
response_times.reduce(:+) / response_times.size
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require "logger"
|
2
|
+
|
3
|
+
require "celluloid"
|
4
|
+
require_relative "benchmark"
|
5
|
+
|
6
|
+
module CelluloidBenchmark
|
7
|
+
# A test run of a scenario. Holds response times, codes, and requests. Reports results as an array of Benchmarks
|
8
|
+
class BenchmarkRun
|
9
|
+
include Celluloid
|
10
|
+
|
11
|
+
attr_accessor :ended_at
|
12
|
+
attr_accessor :logger
|
13
|
+
attr_accessor :started_at
|
14
|
+
attr_reader :thresholds
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
if !Dir.exists?("log")
|
18
|
+
FileUtils.mkdir "log"
|
19
|
+
end
|
20
|
+
|
21
|
+
# Could replace with Celluloid.logger
|
22
|
+
@logger = ::Logger.new("log/benchmark.log")
|
23
|
+
@thresholds = Hash.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def log(http_status_code, start_time, end_time, label, threshold)
|
27
|
+
time = end_time - start_time
|
28
|
+
response_times[label] << time
|
29
|
+
response_codes[label] << http_status_code.to_i
|
30
|
+
|
31
|
+
if threshold
|
32
|
+
thresholds[label] = threshold
|
33
|
+
end
|
34
|
+
|
35
|
+
logger.info "#{http_status_code} #{time} #{label}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def response_times
|
39
|
+
@response_times ||= Hash.new { |hash, value| hash[value] = [] }
|
40
|
+
end
|
41
|
+
|
42
|
+
def response_codes
|
43
|
+
@response_codes ||= Hash.new { |hash, value| hash[value] = [] }
|
44
|
+
end
|
45
|
+
|
46
|
+
def requests
|
47
|
+
response_times.values.compact.map(&:size).reduce(&:+) || 0
|
48
|
+
end
|
49
|
+
|
50
|
+
def benchmarks
|
51
|
+
response_times.map do |label, response_times|
|
52
|
+
CelluloidBenchmark::Benchmark.new label, thresholds[label], response_times, response_codes[label]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def mark_start
|
57
|
+
@started_at = Time.now
|
58
|
+
end
|
59
|
+
|
60
|
+
def mark_end
|
61
|
+
@ended_at = Time.now
|
62
|
+
end
|
63
|
+
|
64
|
+
def elapsed_time
|
65
|
+
if started_at && ended_at
|
66
|
+
(ended_at - started_at).to_f
|
67
|
+
else
|
68
|
+
0
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def ok?
|
73
|
+
benchmarks.all?(&:ok?)
|
74
|
+
end
|
75
|
+
|
76
|
+
def inspect
|
77
|
+
response_times.map do |label, response_times|
|
78
|
+
"#{label} #{response_times.reduce(:+) / response_times.size} #{response_times.min} #{response_times.max} #{response_times.size}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "celluloid"
|
2
|
+
require_relative "visitor_group"
|
3
|
+
|
4
|
+
Celluloid.logger = nil
|
5
|
+
|
6
|
+
module CelluloidBenchmark
|
7
|
+
# Run a scenario in several Visitors and return a BenchmarkRun
|
8
|
+
class Runner
|
9
|
+
def self.run(session_path, duration = 10)
|
10
|
+
raise("session_path is required") unless session_path
|
11
|
+
raise("'#{session_path}' does not exist") unless File.exists?(session_path)
|
12
|
+
|
13
|
+
visitor_group = VisitorGroup.run!
|
14
|
+
benchmark_run = Celluloid::Actor[:benchmark_run]
|
15
|
+
|
16
|
+
benchmark_run.mark_start
|
17
|
+
futures = run_sessions(session_path, benchmark_run, duration)
|
18
|
+
futures.map(&:value)
|
19
|
+
benchmark_run.mark_end
|
20
|
+
|
21
|
+
benchmark_run
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.run_sessions(session_path, benchmark_run, duration)
|
25
|
+
session = File.read(session_path)
|
26
|
+
visitors = Celluloid::Actor[:visitor_pool]
|
27
|
+
futures = []
|
28
|
+
(visitors.size - 2).times do
|
29
|
+
futures << visitors.future.run_session(session, benchmark_run, duration)
|
30
|
+
end
|
31
|
+
futures
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require "mechanize"
|
2
|
+
|
3
|
+
module CelluloidBenchmark
|
4
|
+
# Actor that models a person using a web browser. Runs a test scenario. Delegates web browsing to
|
5
|
+
# instance of a Mechanize Agent.
|
6
|
+
class Visitor
|
7
|
+
include Celluloid
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
def_delegators :@browser, :add_auth, :get, :submit, :transact
|
11
|
+
|
12
|
+
attr_reader :benchmark_run
|
13
|
+
attr_reader :browser
|
14
|
+
attr_accessor :current_request_label
|
15
|
+
attr_accessor :current_request_threshold
|
16
|
+
attr_accessor :request_start_time
|
17
|
+
attr_accessor :request_end_time
|
18
|
+
|
19
|
+
def initialize(browser = Mechanize.new)
|
20
|
+
@browser = browser
|
21
|
+
|
22
|
+
browser.pre_connect_hooks << proc do |agent, request|
|
23
|
+
self.request_start_time = Time.now
|
24
|
+
end
|
25
|
+
|
26
|
+
browser.post_connect_hooks << proc do |agent, uri, response, body|
|
27
|
+
self.request_end_time = Time.now
|
28
|
+
benchmark_run.async.log response.code, request_start_time, request_end_time, current_request_label, current_request_threshold
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def run_session(session, benchmark_run, duration)
|
33
|
+
@benchmark_run = benchmark_run
|
34
|
+
|
35
|
+
elapsed_time = 0
|
36
|
+
started_at = Time.now
|
37
|
+
until elapsed_time >= duration
|
38
|
+
begin
|
39
|
+
instance_eval session
|
40
|
+
rescue Mechanize::ResponseCodeError => e
|
41
|
+
self.request_end_time = Time.now
|
42
|
+
benchmark_run.async.log(
|
43
|
+
e.response_code,
|
44
|
+
request_start_time,
|
45
|
+
request_end_time,
|
46
|
+
current_request_label,
|
47
|
+
current_request_threshold
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
elapsed_time = Time.now - started_at
|
52
|
+
end
|
53
|
+
elapsed_time
|
54
|
+
end
|
55
|
+
|
56
|
+
def benchmark(label, threshold = 0.5)
|
57
|
+
self.current_request_label = label
|
58
|
+
self.current_request_threshold = threshold
|
59
|
+
end
|
60
|
+
|
61
|
+
def random_data(key)
|
62
|
+
data_source(key).sample
|
63
|
+
end
|
64
|
+
|
65
|
+
def data_sources
|
66
|
+
@data_sources ||= Hash.new do |hash, key|
|
67
|
+
hash[key] = File.readlines("tmp/data/#{key}s.csv")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def data_sources=(hash)
|
72
|
+
@data_sources = hash
|
73
|
+
end
|
74
|
+
|
75
|
+
def data_source(key)
|
76
|
+
data_sources[key]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "celluloid"
|
2
|
+
require_relative "benchmark_run"
|
3
|
+
require_relative "visitor"
|
4
|
+
|
5
|
+
module CelluloidBenchmark
|
6
|
+
# Supervised Actor pool of Visitors
|
7
|
+
class VisitorGroup < Celluloid::SupervisionGroup
|
8
|
+
supervise BenchmarkRun, as: :benchmark_run
|
9
|
+
pool Visitor, as: :visitor_pool, size: 8
|
10
|
+
end
|
11
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: celluloid-benchmark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Willson
|
@@ -56,16 +56,12 @@ files:
|
|
56
56
|
- README.md
|
57
57
|
- bin/celluloid-benchmark
|
58
58
|
- lib/celluloid_benchmark.rb
|
59
|
-
-
|
60
|
-
-
|
61
|
-
-
|
62
|
-
-
|
63
|
-
-
|
64
|
-
-
|
65
|
-
- test/unit/benchmark_run_test.rb
|
66
|
-
- test/unit/benchmark_test.rb
|
67
|
-
- test/unit/runner_test.rb
|
68
|
-
- test/unit/visitor_test.rb
|
59
|
+
- lib/celluloid_benchmark/benchmark.rb
|
60
|
+
- lib/celluloid_benchmark/benchmark_run.rb
|
61
|
+
- lib/celluloid_benchmark/runner.rb
|
62
|
+
- lib/celluloid_benchmark/version.rb
|
63
|
+
- lib/celluloid_benchmark/visitor.rb
|
64
|
+
- lib/celluloid_benchmark/visitor_group.rb
|
69
65
|
homepage: https://github.com/scottwillson/celluloid-benchmark
|
70
66
|
licenses:
|
71
67
|
- MIT
|
@@ -92,14 +88,5 @@ rubygems_version: 2.2.1
|
|
92
88
|
signing_key:
|
93
89
|
specification_version: 4
|
94
90
|
summary: Pure Ruby, realistic, website load test tool
|
95
|
-
test_files:
|
96
|
-
|
97
|
-
- test/integration/config.ru
|
98
|
-
- test/integration/integration_test.rb
|
99
|
-
- test/integration/test_session.rb
|
100
|
-
- test/unit/benchmark_run_test.rb
|
101
|
-
- test/unit/benchmark_test.rb
|
102
|
-
- test/unit/runner_test.rb
|
103
|
-
- test/unit/visitor_test.rb
|
104
|
-
- test/integration/html/404.html
|
105
|
-
- test/integration/html/index.html
|
91
|
+
test_files: []
|
92
|
+
|
data/test/integration/config.ru
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
require "minitest/autorun"
|
2
|
-
require_relative "../../lib/celluloid_benchmark"
|
3
|
-
|
4
|
-
module CelluloidBenchmark
|
5
|
-
class IntegrationTest < Minitest::Test
|
6
|
-
def setup
|
7
|
-
# minitest and Celluloid both use at_exit
|
8
|
-
Celluloid.boot
|
9
|
-
|
10
|
-
start_target_webserver
|
11
|
-
end
|
12
|
-
|
13
|
-
def teardown
|
14
|
-
stop_target_webserver
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_happy_path
|
18
|
-
assert target_webserver_responsive?, "Test web server did not respond OK"
|
19
|
-
|
20
|
-
session_path = File.expand_path(File.dirname(__FILE__) + "/test_session.rb")
|
21
|
-
duration = 5
|
22
|
-
benchmark_run = CelluloidBenchmark::Runner.run(session_path, duration)
|
23
|
-
|
24
|
-
assert benchmark_run.ok?, "Run should be OK"
|
25
|
-
end
|
26
|
-
|
27
|
-
def start_target_webserver
|
28
|
-
`thin --threaded --rackup test/integration/config.ru --daemonize --port 8000 start`
|
29
|
-
end
|
30
|
-
|
31
|
-
def stop_target_webserver
|
32
|
-
`thin stop`
|
33
|
-
end
|
34
|
-
|
35
|
-
def target_webserver_responsive?
|
36
|
-
require "net/http"
|
37
|
-
require "uri"
|
38
|
-
|
39
|
-
uri = URI.parse("http://localhost:8000/")
|
40
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
41
|
-
Timeout::timeout(5) do
|
42
|
-
request = Net::HTTP::Get.new(uri.request_uri)
|
43
|
-
begin
|
44
|
-
response = http.request(request)
|
45
|
-
if response.code.to_i == 200
|
46
|
-
return true
|
47
|
-
end
|
48
|
-
rescue Errno::ECONNREFUSED, Net::HTTP::Persistent::Error
|
49
|
-
# Ignore. Server might be starting up.
|
50
|
-
end
|
51
|
-
sleep 1
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,130 +0,0 @@
|
|
1
|
-
require "minitest/autorun"
|
2
|
-
require "timecop"
|
3
|
-
require_relative "../../lib/celluloid_benchmark/benchmark_run"
|
4
|
-
|
5
|
-
module CelluloidBenchmark
|
6
|
-
class BenchmarkRunTest < Minitest::Test
|
7
|
-
def setup
|
8
|
-
# minitest and Celluloid both use at_exit
|
9
|
-
Celluloid.boot
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_new
|
13
|
-
BenchmarkRun.new
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_inspect
|
17
|
-
BenchmarkRun.new.inspect
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_log
|
21
|
-
benchmark_run = BenchmarkRun.new
|
22
|
-
logger = Minitest::Mock.new
|
23
|
-
logger.expect :info, true, [ "200 1 search"]
|
24
|
-
benchmark_run.logger = logger
|
25
|
-
benchmark_run.log 200, 1, 2, "search", 3
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_response_times
|
29
|
-
benchmark_run = BenchmarkRun.new
|
30
|
-
assert_equal Hash.new, benchmark_run.response_times
|
31
|
-
|
32
|
-
benchmark_run.log 200, 3, 4, "search", 0
|
33
|
-
assert_equal({ "search" => [ 1 ] }, benchmark_run.response_times)
|
34
|
-
|
35
|
-
benchmark_run.log 200, 40, 100, "search", 3
|
36
|
-
search_times = benchmark_run.response_times[ "search" ]
|
37
|
-
assert_equal [ 1, 60 ], search_times.sort
|
38
|
-
|
39
|
-
benchmark_run.log 404, 1000, 2000, "home", 3
|
40
|
-
search_times = benchmark_run.response_times[ "search" ]
|
41
|
-
assert_equal [ 1, 60 ], search_times.sort
|
42
|
-
assert_equal [ 1000 ], benchmark_run.response_times[ "home" ]
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_response_codes
|
46
|
-
benchmark_run = BenchmarkRun.new
|
47
|
-
assert_equal Hash.new, benchmark_run.response_codes
|
48
|
-
|
49
|
-
benchmark_run.log 200, 3, 4, "search", 0
|
50
|
-
assert_equal({ "search" => [ 200 ] }, benchmark_run.response_codes)
|
51
|
-
|
52
|
-
benchmark_run.log 302, 40, 100, "search", 3
|
53
|
-
search_codes = benchmark_run.response_codes[ "search" ]
|
54
|
-
assert_equal [ 200, 302 ], search_codes.sort
|
55
|
-
|
56
|
-
benchmark_run.log 404, 1000, 2000, "home", 3
|
57
|
-
search_codes = benchmark_run.response_codes[ "search" ]
|
58
|
-
assert_equal [ 200, 302 ], search_codes.sort
|
59
|
-
assert_equal [ 404 ], benchmark_run.response_codes[ "home" ]
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_requests
|
63
|
-
benchmark_run = BenchmarkRun.new
|
64
|
-
assert_equal 0, benchmark_run.requests
|
65
|
-
|
66
|
-
benchmark_run.log 200, 3, 4, "search", 0
|
67
|
-
assert_equal 1, benchmark_run.requests
|
68
|
-
|
69
|
-
benchmark_run.log 200, 3, 4, "search", 0
|
70
|
-
assert_equal 2, benchmark_run.requests
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_benchmarks
|
74
|
-
benchmark_run = BenchmarkRun.new
|
75
|
-
assert_equal 0, benchmark_run.benchmarks.size
|
76
|
-
assert benchmark_run.benchmarks.empty?
|
77
|
-
|
78
|
-
benchmark_run.log 200, 3, 4, "search", 0.01
|
79
|
-
assert_equal 1, benchmark_run.benchmarks.size
|
80
|
-
benchmark = benchmark_run.benchmarks.first
|
81
|
-
assert_equal "search", benchmark.label, "benchmark label"
|
82
|
-
assert_equal 0.01, benchmark.threshold, "benchmark threshold"
|
83
|
-
assert_equal [ 1 ], benchmark.response_times, "benchmark response_times"
|
84
|
-
assert_equal [ 200 ], benchmark.response_codes, "benchmark response_codes"
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_mark_start
|
88
|
-
benchmark_run = BenchmarkRun.new
|
89
|
-
assert_equal nil, benchmark_run.started_at, "started_at"
|
90
|
-
|
91
|
-
Timecop.freeze(Time.new(2001, 4, 5, 18, 30)) do
|
92
|
-
benchmark_run.mark_start
|
93
|
-
end
|
94
|
-
|
95
|
-
assert_equal Time.new(2001, 4, 5, 18, 30), benchmark_run.started_at
|
96
|
-
end
|
97
|
-
|
98
|
-
def test_mark_end
|
99
|
-
benchmark_run = BenchmarkRun.new
|
100
|
-
assert_equal nil, benchmark_run.ended_at, "ended_at"
|
101
|
-
|
102
|
-
Timecop.freeze(Time.new(2001, 4, 5, 18, 30)) do
|
103
|
-
benchmark_run.mark_end
|
104
|
-
end
|
105
|
-
|
106
|
-
assert_equal Time.new(2001, 4, 5, 18, 30), benchmark_run.ended_at
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_ok
|
110
|
-
benchmark_run = BenchmarkRun.new
|
111
|
-
assert benchmark_run.ok?
|
112
|
-
|
113
|
-
benchmark_run.stub :benchmarks, [ Minitest::Mock.new.expect(:ok?, true) ] do
|
114
|
-
assert benchmark_run.ok?
|
115
|
-
end
|
116
|
-
|
117
|
-
benchmark_run.stub :benchmarks, [ Minitest::Mock.new.expect(:ok?, true), Minitest::Mock.new.expect(:ok?, true) ] do
|
118
|
-
assert benchmark_run.ok?
|
119
|
-
end
|
120
|
-
|
121
|
-
benchmark_run.stub :benchmarks, [ Minitest::Mock.new.expect(:ok?, false), Minitest::Mock.new.expect(:ok?, true) ] do
|
122
|
-
assert !benchmark_run.ok?
|
123
|
-
end
|
124
|
-
|
125
|
-
benchmark_run.stub :benchmarks, [ Minitest::Mock.new.expect(:ok?, false), Minitest::Mock.new.expect(:ok?, false) ] do
|
126
|
-
assert !benchmark_run.ok?
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
data/test/unit/benchmark_test.rb
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
require "minitest/autorun"
|
2
|
-
require_relative "../../lib/celluloid_benchmark/benchmark"
|
3
|
-
|
4
|
-
module CelluloidBenchmark
|
5
|
-
class BenchmarkTest < Minitest::Test
|
6
|
-
def test_require_label
|
7
|
-
assert_raises ArgumentError do
|
8
|
-
Benchmark.new(nil, 1, [], [])
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_require_threshold_above_zero
|
13
|
-
assert_raises ArgumentError do
|
14
|
-
Benchmark.new("homepage", 0, nil, nil)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_defaults
|
19
|
-
benchmark = Benchmark.new("homepage", nil, nil, nil)
|
20
|
-
|
21
|
-
assert_equal 3, benchmark.threshold, "default threshold"
|
22
|
-
|
23
|
-
assert !benchmark.response_codes.nil?, "response_codes default"
|
24
|
-
assert benchmark.response_codes.empty?, "response_codes default"
|
25
|
-
|
26
|
-
assert !benchmark.response_times.nil?, "response_times default"
|
27
|
-
assert benchmark.response_times.empty?, "response_times default"
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_response_times_ok_for_empty_benchmark
|
31
|
-
benchmark = Benchmark.new("homepage", nil, nil, nil)
|
32
|
-
assert benchmark.ok?, "Empty Benchmark should be OK"
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_ok_if_response_codes_and_times_ok
|
36
|
-
benchmark = Benchmark.new("homepage", nil, nil, nil)
|
37
|
-
|
38
|
-
benchmark.stub(:response_times_ok?, true) do
|
39
|
-
benchmark.stub(:response_codes_ok?, true) do
|
40
|
-
assert benchmark.ok?, "Benchmark.ok? times OK and codes OK"
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
benchmark.stub(:response_times_ok?, false) do
|
45
|
-
benchmark.stub(:response_codes_ok?, true) do
|
46
|
-
assert !benchmark.ok?, "Benchmark.ok? times not OK and codes OK"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
benchmark.stub(:response_times_ok?, true) do
|
51
|
-
benchmark.stub(:response_codes_ok?, false) do
|
52
|
-
assert !benchmark.ok?, "Benchmark.ok? times OK and codes not OK"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
benchmark.stub(:response_times_ok?, false) do
|
57
|
-
benchmark.stub(:response_codes_ok?, false) do
|
58
|
-
assert !benchmark.ok?, "Benchmark.ok? times not OK and codes not OK"
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_blank_response_time_ok
|
64
|
-
benchmark = Benchmark.new("homepage", nil, nil, nil)
|
65
|
-
assert benchmark.response_times_ok?
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_blank_response_codes_ok
|
69
|
-
benchmark = Benchmark.new("homepage", nil, nil, nil)
|
70
|
-
assert benchmark.response_codes_ok?
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_response_times
|
74
|
-
benchmark = Benchmark.new("test", 1, [ 0.99, 0.9, 1.01 ], nil)
|
75
|
-
assert benchmark.response_times_ok?
|
76
|
-
|
77
|
-
benchmark = Benchmark.new("test", 1, [ 1.000001, 1, 1 ], nil)
|
78
|
-
assert !benchmark.response_times_ok?
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_response_codes
|
82
|
-
benchmark = Benchmark.new("test", nil, [], [])
|
83
|
-
assert benchmark.response_codes_ok?
|
84
|
-
|
85
|
-
benchmark = Benchmark.new("test", nil, [], [ 500 ])
|
86
|
-
assert !benchmark.response_codes_ok?
|
87
|
-
|
88
|
-
benchmark = Benchmark.new("test", nil, [], [ 200 ])
|
89
|
-
assert benchmark.response_codes_ok?
|
90
|
-
|
91
|
-
benchmark = Benchmark.new("test", nil, [], [ 200, 500 ])
|
92
|
-
assert !benchmark.response_codes_ok?
|
93
|
-
|
94
|
-
benchmark = Benchmark.new("test", nil, [], [ 200, 302, 304, 401 ])
|
95
|
-
assert benchmark.response_codes_ok?
|
96
|
-
|
97
|
-
benchmark = Benchmark.new("test", nil, [], [ 403, 200, 302, 401 ])
|
98
|
-
assert !benchmark.response_codes_ok?
|
99
|
-
|
100
|
-
benchmark = Benchmark.new("test", nil, [], [ 410, 200, 302, 401 ])
|
101
|
-
assert !benchmark.response_codes_ok?
|
102
|
-
|
103
|
-
benchmark = Benchmark.new("test", nil, [], [ 309, 200, 302, 401 ])
|
104
|
-
assert !benchmark.response_codes_ok?
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
data/test/unit/runner_test.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require "minitest/autorun"
|
2
|
-
require_relative "../../lib/celluloid_benchmark/runner"
|
3
|
-
require "fakeweb"
|
4
|
-
|
5
|
-
FakeWeb.allow_net_connect = false
|
6
|
-
|
7
|
-
module CelluloidBenchmark
|
8
|
-
class BenchmarkRunnerTest < Minitest::Test
|
9
|
-
def setup
|
10
|
-
# minitest and Celluloid both use at_exit
|
11
|
-
Celluloid.boot
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_run
|
15
|
-
FakeWeb.register_uri(:get, "https://github.com/scottwillson/celluloid-benchmark", :body => "<html>OK</html>")
|
16
|
-
benchmark_run = Runner.run(File.dirname(__FILE__) + "/../files/runner_test_session.rb", 0.1)
|
17
|
-
|
18
|
-
benchmarks = benchmark_run.benchmarks
|
19
|
-
assert_equal 1, benchmarks.size
|
20
|
-
benchmark = benchmarks.first
|
21
|
-
assert benchmark.ok?, "benchmark.ok?"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/test/unit/visitor_test.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
require "minitest/autorun"
|
2
|
-
require "celluloid"
|
3
|
-
require_relative "../../lib/celluloid_benchmark/visitor"
|
4
|
-
|
5
|
-
module CelluloidBenchmark
|
6
|
-
# Visitor#run_session is the central purpose of this gem, but best tested in an integration test,
|
7
|
-
# not a unit test
|
8
|
-
class VisitorTest < Minitest::Test
|
9
|
-
class MockBrowser
|
10
|
-
attr_accessor :post_connect_hooks, :pre_connect_hooks, :uris
|
11
|
-
|
12
|
-
def initialize
|
13
|
-
@pre_connect_hooks = []
|
14
|
-
@post_connect_hooks = []
|
15
|
-
@uris = []
|
16
|
-
end
|
17
|
-
|
18
|
-
def get(uri)
|
19
|
-
uris << uri
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def setup
|
24
|
-
# minitest and Celluloid both use at_exit
|
25
|
-
Celluloid.boot
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_run_session
|
29
|
-
browser = MockBrowser.new
|
30
|
-
visitor = Visitor.new(browser)
|
31
|
-
session = File.read(File.dirname(__FILE__) + "/../files/runner_test_session.rb")
|
32
|
-
|
33
|
-
elapsed_time = visitor.run_session(session, nil, 0.01)
|
34
|
-
|
35
|
-
assert !elapsed_time.nil?, "elapsed_time should not be nil"
|
36
|
-
assert elapsed_time > 0, "elapsed_time should be greater than zero, but was #{elapsed_time}"
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_benchmark
|
40
|
-
browser = MockBrowser.new
|
41
|
-
visitor = Visitor.new(browser)
|
42
|
-
|
43
|
-
visitor.benchmark("purchase_page", 0.25)
|
44
|
-
|
45
|
-
assert_equal "purchase_page", visitor.current_request_label, "current_request_label"
|
46
|
-
assert_equal 0.25, visitor.current_request_threshold, "current_request_threshold"
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_random_data
|
50
|
-
browser = MockBrowser.new
|
51
|
-
visitor = Visitor.new(browser)
|
52
|
-
|
53
|
-
data_sources = Minitest::Mock.new
|
54
|
-
data_source = Minitest::Mock.new
|
55
|
-
|
56
|
-
data_source.expect :sample, 3
|
57
|
-
data_sources.expect :[], data_source, [ String ]
|
58
|
-
|
59
|
-
visitor.data_sources = data_sources
|
60
|
-
|
61
|
-
assert_equal 3, visitor.random_data("ids")
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|