jmeter-reports 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: