Description:
added first page load test on localhost
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r314:933be61bc431 - - 4 files changed: 28 inserted, 4 deleted

@@ -0,0 +1,7
1 + How to call
2 + ===========
3 +
4 + Load test for front page:
5 +
6 + ruby runner.rb common_visitors.rb FirstPageViewer 10 -t 10
7 +
@@ -0,0 +1,7
1 + visitor "FirstPageViewer" do
2 + stores_cookies
3 +
4 + site_url "http://localhost:3000"
5 +
6 + get "/"
7 + end
@@ -1,91 +1,99
1 1 #
2 2 # This file is part of a web load testing tool (currently having no name)
3 3 # Copyright (C) 2008 Jittat Fakcharoenphol
4 4 #
5 5 # This program is free software; you can redistribute it and/or modify
6 6 # it under the terms of the GNU General Public License as published by
7 7 # the Free Software Foundation; either version 2 of the License, or
8 8 # (at your option) any later version.
9 9 #
10 10 # This program is distributed in the hope that it will be useful, but
11 11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 13 # General Public License for more details.
14 14 #
15 15 # You should have received a copy of the GNU General Public License
16 16 # along with this program; if not, write to the Free Software
17 17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 18 # 02110-1301, USA.
19 19 #
20 20
21 21 require 'visitor_curl_cli'
22 22
23 + TEMP_DIR = './tmp'
24 +
23 25 def show_usage
24 26 puts <<USAGE
25 27 using: ruby runner.rb <visitor_file> [<type> <number>] [<type> <number>] ... [options]
26 28 * visitor_file : your visitor definition file, (with or without .rb)
27 29 * type, number : the type and the number of visitors of that type
28 30 * options : any of the following
29 31 -t <sec> specify how long (in seconds)
30 32 -d dry-run: run, but make no real http requests
31 33 USAGE
32 34 end
33 35
36 + def initialize_temp_dir
37 + if !FileTest.exists? TEMP_DIR
38 + Dir.mkdir TEMP_DIR
39 + end
40 + end
41 +
34 42 def runner(visitor_lists, load_time=60, options={})
35 43 visitors = []
36 44 vcount = 0
37 45
38 46 visitor_lists.each do |cname, num|
39 47 begin
40 48 c = Kernel.const_get(cname)
41 49
42 50 num.times do
43 - visitors[vcount] = c.new(vcount+1)
51 + visitors[vcount] = c.new(vcount+1, TEMP_DIR)
44 52 visitors[vcount].talkative = true
45 53 vcount += 1
46 54 end
47 55 rescue NameError
48 56 puts "Can't find class #{cname}"
49 57 show_usage
50 58 exit(0)
51 59 end
52 60 end
53 61
54 62 puts "Having #{vcount} visitors"
55 63
56 64 vthread = []
57 65
58 66 all_start_time = Time.new
59 67
60 68 # start all visitors
61 69 vcount.times do |i|
62 70 vthread[i] = Thread.new do
63 71 visitors[i].run(:forever,options)
64 72 end
65 73 end
66 74
67 75 # wait for load_time seconds
68 76 sleep load_time
69 77
70 78 visitors.each do |visitor| visitor.stop! end
71 79
72 80 all_finish_time = Time.new
73 81
74 82 begin
75 83 # wait for all threads to stop
76 84 vcount.times do |i|
77 85 #puts "Waiting for thread #{i}, #{vthread[i].alive?}"
78 86 vthread[i].join
79 87 end
80 88
81 89 rescue Interrupt
82 90 # kill all remaining threads
83 91 vcount.times do |i|
84 92 vthread[i].kill if vthread[i].alive?
85 93 end
86 94 end
87 95
88 96 # clean up
89 97 visitors.each do |visitor|
90 98 #puts "Clean up: #{visitor.id}"
91 99 visitor.cleanup
@@ -99,50 +107,51
99 107 stat = visitors[i].statistics
100 108 # puts "TYPE: #{visitors[i].class}"
101 109 # puts "Total requested = #{stat[:num_requested]}"
102 110 # puts "Average = #{stat[:avg_request_time]}"
103 111 # puts "S.D. = #{stat[:std_dev]}"
104 112 total_req += stat[:num_requested]
105 113 end
106 114
107 115 elapsed_time = all_finish_time - all_start_time
108 116
109 117 puts
110 118 puts "Total time = #{elapsed_time} sec."
111 119 puts "Total requests = #{total_req}"
112 120 puts "Trans. per sec = #{total_req/elapsed_time}"
113 121 end
114 122
115 123 ###########################
116 124 # MAIN
117 125 ###########################
118 126
119 127 if ARGV.length==0
120 128 show_usage
121 129 exit(0)
122 130 end
123 131
124 132 visitor_file = ARGV.shift
125 133 require visitor_file
126 134
127 135 load_time = 60
128 136 dry_run = false
129 137
130 138 #build visitor list
131 139 visitor_list = {}
132 140 while ARGV.length>0
133 141 key = ARGV.shift
134 142
135 143 case key
136 144 when '-d'
137 145 dry_run = true
138 146 when '-t'
139 147 num = ARGV.shift.to_i
140 148 load_time = num
141 149 else
142 150 num = ARGV.shift.to_i
143 151 visitor_list[key] = num
144 152 end
145 153 end
146 154
155 + initialize_temp_dir
147 156 runner visitor_list, load_time, {:dry_run => dry_run}
148 157
@@ -1,99 +1,100
1 1 #
2 2 # This file is part of a web load testing tool (currently having no name)
3 3 # Copyright (C) 2008 Jittat Fakcharoenphol
4 4 #
5 5 # This program is free software; you can redistribute it and/or modify
6 6 # it under the terms of the GNU General Public License as published by
7 7 # the Free Software Foundation; either version 2 of the License, or
8 8 # (at your option) any later version.
9 9 #
10 10 # This program is distributed in the hope that it will be useful, but
11 11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 13 # General Public License for more details.
14 14 #
15 15 # You should have received a copy of the GNU General Public License
16 16 # along with this program; if not, write to the Free Software
17 17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 18 # 02110-1301, USA.
19 19 #
20 20
21 21 require 'rubygems'
22 22 require 'uri'
23 23
24 24 class Visitor
25 25
26 26 attr_accessor :talkative
27 27
28 28 class << self
29 29 attr_accessor :commands
30 30 attr_accessor :base_url
31 31 attr_accessor :cookies_stored
32 32 end
33 33
34 34 def get_cookie_fname
35 - "cookies.#{@id}"
35 + "#{@base_dir}/cookies.#{@id}"
36 36 end
37 37
38 38 def get_output_fname
39 - "output.#{@id}"
39 + "#{@base_dir}/output.#{@id}"
40 40 end
41 41
42 42 def id
43 43 @id
44 44 end
45 45
46 - def initialize(id=0)
46 + def initialize(id=0, base_dir='.')
47 47 # initialize nil class variable
48 48 self.class.base_url = "" if (self.class.base_url) == nil
49 49 self.class.cookies_stored = false if self.class.cookies_stored == nil
50 50
51 51 @id = id
52 + @base_dir = base_dir
52 53 @cookies_fname = get_cookie_fname
53 54 @output_fname = get_output_fname
54 55 @statistics = Array.new
55 56 @talkative = false
56 57
57 58 @stopped = false
58 59 end
59 60
60 61 def cleanup
61 62 trial = 0
62 63 while FileTest.exists?(@cookies_fname)
63 64 File.delete(@cookies_fname)
64 65 if FileTest.exists?(@cookies_fname)
65 66 # wait until system returns
66 67 puts "STILL HERE"
67 68 sleep 1
68 69 trial += 1
69 70 break if trial>10
70 71 end
71 72 end
72 73
73 74 while FileTest.exists?(@output_fname)
74 75 File.delete(@output_fname)
75 76 if FileTest.exists?(@output_fname)
76 77 # wait until system returns
77 78 sleep 1
78 79 trial += 1
79 80 break if trial>10
80 81 end
81 82 end
82 83 end
83 84
84 85 def self.site_url(url)
85 86 self.base_url = url
86 87 end
87 88
88 89 def self.stores_cookies
89 90 self.cookies_stored = true
90 91 end
91 92
92 93 def self.preprocess_param_hash(params)
93 94 return {} if params==nil
94 95 plist = {}
95 96 params.each do |key,val|
96 97 if key.is_a? Symbol
97 98 key_s = key.to_s
98 99 else
99 100 key_s = key
You need to be logged in to leave comments. Login now