jmeter-reports 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  jmeter-reports*.gem
2
+ .rbenv-version
data/.travis.yml CHANGED
@@ -1,4 +1,3 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
- - 1.8.7
data/Gemfile CHANGED
@@ -1,8 +1,11 @@
1
1
  source :rubygems
2
2
 
3
3
  gem 'rake'
4
+ gem 'descriptive_statistics'
5
+ gem 'formatador'
4
6
 
5
- group :test do
7
+ group :test, :development do
6
8
  gem 'minitest'
7
9
  gem 'minitest-colorize'
10
+ gem 'pry'
8
11
  end
data/Gemfile.lock CHANGED
@@ -1,15 +1,27 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ coderay (1.0.8)
5
+ descriptive_statistics (1.1.1)
6
+ formatador (0.2.4)
7
+ method_source (0.8.1)
4
8
  minitest (2.12.1)
5
9
  minitest-colorize (0.0.4)
6
10
  minitest (~> 2.0)
11
+ pry (0.9.10)
12
+ coderay (~> 1.0.5)
13
+ method_source (~> 0.8)
14
+ slop (~> 3.3.1)
7
15
  rake (10.0.2)
16
+ slop (3.3.3)
8
17
 
9
18
  PLATFORMS
10
19
  ruby
11
20
 
12
21
  DEPENDENCIES
22
+ descriptive_statistics
23
+ formatador
13
24
  minitest
14
25
  minitest-colorize
26
+ pry
15
27
  rake
data/bin/jmeter-reports CHANGED
@@ -1,6 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  $:.push File.join(File.dirname(__FILE__), '..'), File.join(File.dirname(__FILE__), '..','lib')
4
+
5
+ begin
6
+ require 'bundler/setup'
7
+ Bundler.require(:default)
8
+ rescue LoadError
9
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
10
+ end
11
+
4
12
  require 'jmeter/reports'
5
13
 
6
14
  if ARGV.empty?
@@ -17,15 +25,17 @@ begin
17
25
  end
18
26
  else
19
27
  report = Jmeter::SummaryReport::Report.create(ARGV.first)
20
- puts "Test time: #{report.elapsed} secs"
21
- puts "Total requests: #{report.total_requests}"
28
+ puts ""
29
+ puts " Start: #{report.start_date}"
30
+ puts " End: #{report.end_date}"
31
+ puts " Duration: #{report.elapsed} secs"
32
+ puts " Total requests: #{report.total_requests}"
22
33
  puts "Average throughput: #{report.avg_throughput} RPS"
23
- puts "Test plan:"
24
- report.items.each do |item|
25
- puts "\t#{item.text_summary}"
26
- end
34
+ puts ""
35
+ Formatador.display_table(report.table_data, [:label,:reqs,:errors,:err_pct,:min,:avg,:max,:sd,:avg_thrput])
36
+ puts ""
27
37
  end
28
38
  rescue Exception => e
29
39
  puts e.message
30
- exit 1
40
+ exit 2
31
41
  end
@@ -1,10 +1,11 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jmeter/reports'
4
5
 
5
6
  Gem::Specification.new do |gem|
6
7
  gem.name = "jmeter-reports"
7
- gem.version = "0.0.3"
8
+ gem.version = Jmeter::Reports::VERSION
8
9
  gem.authors = ["Marcos Hack"]
9
10
  gem.email = ["marcos.hack@gmail.com"]
10
11
  gem.description = %q{JMeter Reports}
@@ -15,7 +16,15 @@ Gem::Specification.new do |gem|
15
16
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
18
  gem.require_paths = ["lib"]
19
+
20
+ gem.required_ruby_version = '>= 1.9'
18
21
 
22
+ gem.add_runtime_dependency "bundler"
23
+ gem.add_runtime_dependency "descriptive_statistics"
24
+ gem.add_runtime_dependency "formatador"
25
+
19
26
  gem.add_development_dependency "rake"
20
27
  gem.add_development_dependency "minitest", "~> 3"
28
+ gem.add_development_dependency "minitest-colorize"
29
+ gem.add_development_dependency "pry"
21
30
  end
@@ -1,3 +1,4 @@
1
1
  require 'jmeter/summary_report/report'
2
2
  require 'jmeter/summary_report/report_item'
3
3
  require 'jmeter/summary_report/result_line'
4
+ require 'jmeter/reports/version'
@@ -0,0 +1,5 @@
1
+ module Jmeter
2
+ module Reports
3
+ VERSION = "0.0.5"
4
+ end
5
+ end
@@ -28,12 +28,12 @@ module Jmeter
28
28
  @items[line.label] = ReportItem.new(line.label) if @items[line.label].nil?
29
29
  @items[line.label].add(line)
30
30
  @req_count += 1
31
- @start = line.timestamp if @start.nil? || line.timestamp < @start
32
- @end = line.timestamp if @end.nil? || line.timestamp > @end
31
+ @start_ms = line.timestamp if @start_ms.nil? || line.timestamp < @start_ms
32
+ @end_ms = line.timestamp if @end_ms.nil? || line.timestamp > @end_ms
33
33
  end
34
34
 
35
35
  def elapsed_in_ms
36
- @end - @start
36
+ @end_ms - @start_ms
37
37
  end
38
38
 
39
39
  def elapsed
@@ -51,6 +51,18 @@ module Jmeter
51
51
  def total_requests
52
52
  @req_count
53
53
  end
54
+
55
+ def start_date
56
+ Time.at(@start_ms / 1000.0)
57
+ end
58
+
59
+ def end_date
60
+ Time.at(@end_ms / 1000.0)
61
+ end
62
+
63
+ def table_data
64
+ @items.values.collect { |i| i.table_data }
65
+ end
54
66
  end
55
67
  end
56
68
  end
@@ -1,3 +1,5 @@
1
+ require 'descriptive_statistics'
2
+
1
3
  module Jmeter
2
4
  module SummaryReport
3
5
  class ReportItem
@@ -5,11 +7,27 @@ module Jmeter
5
7
  @label = label
6
8
  @items = []
7
9
  @error_count = 0
10
+ @req_count = 0
8
11
  end
9
12
 
10
13
  def add(line)
11
14
  @error_count += 1 if line.error?
12
- @items << line.elapsed
15
+ @items << line.elapsed
16
+ @req_count += 1
17
+ @start_ms = line.timestamp if @start_ms.nil? || line.timestamp < @start_ms
18
+ @end_ms = line.timestamp if @end_ms.nil? || line.timestamp > @end_ms
19
+ end
20
+
21
+ def elapsed_in_ms
22
+ @end_ms - @start_ms
23
+ end
24
+
25
+ def elapsed
26
+ (self.elapsed_in_ms / 1000.0).ceil
27
+ end
28
+
29
+ def avg_throughput
30
+ @req_count / self.elapsed.to_f
13
31
  end
14
32
 
15
33
  def size
@@ -24,13 +42,21 @@ module Jmeter
24
42
  @error_count / self.size.to_f
25
43
  end
26
44
 
27
- def text_summary
45
+ def table_data
28
46
  sorted_items = @items.sort
29
- p90 = sorted_items[(self.size * 0.90).round]
30
- p95 = sorted_items[(self.size * 0.95).round]
31
- err_rate = round(self.error_rate, 3) * 100
32
- "#{@label}: #{self.size}/#{self.errors} reqs/err(#{round(self.error_rate, 3) * 100}%), " +
33
- "90% <= #{p90}ms, 95% <= #{p95}ms"
47
+ {
48
+ :label => @label,
49
+ :reqs => self.size,
50
+ :errors => self.errors,
51
+ :err_pct => round(self.error_rate * 100, 1),
52
+ :avg_thrput => "#{round(self.avg_throughput, 3)} RPS",
53
+ :min => @items.min,
54
+ :avg => @items.reduce { |n,s| s += n } / @items.size,
55
+ :max => @items.max,
56
+ :sd => "#{@items.standard_deviation.to_i}ms",
57
+ :pct_90 => "#{sorted_items[(self.size * 0.90).round]}ms",
58
+ :pct_95 => "#{sorted_items[(self.size * 0.95).round]}ms"
59
+ }
34
60
  end
35
61
 
36
62
  private
@@ -8,13 +8,16 @@
8
8
  # 1355164382383,97,Tela de Login,200,"Number of samples in transaction : 1,
9
9
  # number of failing samples : 0",Thread Group 1-1,,true,5168,1,1,null,0
10
10
  #
11
+
12
+ require 'csv'
13
+
11
14
  module Jmeter
12
15
  module SummaryReport
13
16
  class ResultLine
14
17
  attr_accessor :timestamp, :elapsed, :label, :error, :latency
15
18
 
16
19
  def self.parse(line)
17
- t,e,l,rc,rm,_,_,_,s,_,_,_,_,lt = line.split(",")
20
+ t,e,l,rc,rm,_,_,s,_,_,_,_,lt = CSV.parse_line(line)
18
21
  res = Jmeter::SummaryReport::ResultLine.new
19
22
  res.timestamp = t.to_i
20
23
  res.elapsed = e.to_i
data/test/helper.rb CHANGED
@@ -1,2 +1,4 @@
1
1
  require 'minitest/autorun'
2
2
  require 'minitest/colorize'
3
+
4
+ Bundler.require(:default, :development, :test)
@@ -0,0 +1,12 @@
1
+ require File.expand_path('helper', File.dirname(__FILE__))
2
+ require 'jmeter/reports/version'
3
+
4
+ module Jmeter
5
+ module Reports
6
+ class TestVersion < MiniTest::Unit::TestCase
7
+ def test_version
8
+ assert Jmeter::Reports::VERSION != nil
9
+ end
10
+ end
11
+ end
12
+ end
@@ -24,6 +24,14 @@ module Jmeter
24
24
  def test_elapsed
25
25
  assert_equal 3, @report.elapsed
26
26
  end
27
+
28
+ def test_start_date
29
+ assert_equal Time.new(2012,12,11,12,47,32,"+00:00").to_i, @report.start_date.utc.to_i, 'invalid start date'
30
+ end
31
+
32
+ def test_end_date
33
+ assert_equal Time.new(2012,12,11,12,47,34,"+00:00").to_i, @report.end_date.utc.to_i, 'invalid end date'
34
+ end
27
35
  end
28
36
  end
29
37
  end
@@ -1,12 +1,15 @@
1
1
  require File.expand_path('helper', File.dirname(__FILE__))
2
- require 'jmeter/reports'
2
+ require 'jmeter/summary_report/result_line'
3
3
 
4
4
  module Jmeter
5
5
  module SummaryReport
6
6
  class TestResultLine < MiniTest::Unit::TestCase
7
- def test_parse_with_error_line
8
- line = ResultLine.parse('1355163053904,5933,Login,,"Number of samples in transaction : 2, number of failing samples : 1",Thread Group 1-15,,false,2836,20,20,null,0')
9
- assert_equal true, line.error?
7
+ def test_parse_simple_error_line
8
+ assert ResultLine.parse('1355332336591,4850,POST execute,500,Internal Server Error,Thread Group 1-70,text,false,15535,75,75,http://stage.id.abril.com.br/widgets/login/execute,4847').error?
9
+ end
10
+
11
+ def test_parse_transaction_error_line
12
+ assert ResultLine.parse('1355163053904,5933,Login,,"Number of samples in transaction : 2, number of failing samples : 1",Thread Group 1-15,,false,2836,20,20,null,0').error?
10
13
  end
11
14
  end
12
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jmeter-reports
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,56 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-12 00:00:00.000000000 Z
12
+ date: 2012-12-14 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: descriptive_statistics
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: formatador
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
14
62
  - !ruby/object:Gem::Dependency
15
63
  name: rake
16
64
  requirement: !ruby/object:Gem::Requirement
@@ -43,6 +91,38 @@ dependencies:
43
91
  - - ~>
44
92
  - !ruby/object:Gem::Version
45
93
  version: '3'
94
+ - !ruby/object:Gem::Dependency
95
+ name: minitest-colorize
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: pry
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
46
126
  description: JMeter Reports
47
127
  email:
48
128
  - marcos.hack@gmail.com
@@ -61,13 +141,15 @@ files:
61
141
  - bin/jmeter-reports
62
142
  - jmeter-reports.gemspec
63
143
  - lib/jmeter/reports.rb
144
+ - lib/jmeter/reports/version.rb
64
145
  - lib/jmeter/summary_report/report.rb
65
146
  - lib/jmeter/summary_report/report_item.rb
66
147
  - lib/jmeter/summary_report/result_line.rb
67
148
  - test/fixtures/summary_report.csv
68
149
  - test/helper.rb
150
+ - test/test_jmeter_reports_version.rb
151
+ - test/test_report.rb
69
152
  - test/test_result_line.rb
70
- - test/test_summary_report.rb
71
153
  homepage: https://github.com/marcoshack/jmeter-reports
72
154
  licenses: []
73
155
  post_install_message:
@@ -79,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
79
161
  requirements:
80
162
  - - ! '>='
81
163
  - !ruby/object:Gem::Version
82
- version: '0'
164
+ version: '1.9'
83
165
  required_rubygems_version: !ruby/object:Gem::Requirement
84
166
  none: false
85
167
  requirements:
@@ -95,6 +177,7 @@ summary: Basic tools for JMeter reports processing.
95
177
  test_files:
96
178
  - test/fixtures/summary_report.csv
97
179
  - test/helper.rb
180
+ - test/test_jmeter_reports_version.rb
181
+ - test/test_report.rb
98
182
  - test/test_result_line.rb
99
- - test/test_summary_report.rb
100
183
  has_rdoc: