-
-
Save jtuchscherer/28baa2347a068b7dcb04 to your computer and use it in GitHub Desktop.
invoke it with:
$ ./jmx_generator.rb -u http://YOURDOMAIN.com
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env ruby | |
require 'ruby-jmeter' | |
require 'nokogiri' | |
require 'slop' | |
require_relative './lib/request_helper' | |
options = Slop.new(strict: true, help: true) do | |
banner 'Usage: generate_jmeter_xml.rb [options]' | |
on :u, :url=, 'the url to run performance tests against' | |
on :f, :file=, 'output file, defaults to ./jmeter.jmx', argument: :optional | |
end | |
begin | |
options.parse | |
rescue Slop::InvalidOptionError => e | |
puts "Invalid argument. You can use this script with the following options:\n\n" | |
puts options.help | |
exit(1) | |
end | |
class JmxGenerator | |
def initialize(url) | |
@url = url | |
end | |
def generate | |
url = @url | |
@jmeter_test = test({"TestPlan.serialize_threadgroups" => "true"}) do | |
assert matches: "(200)|(302)", name: "response status check", test_field: "Assertion.response_code" | |
cookies | |
threads name: "test setup", count: 1, on_sample_error: "stoptest" do | |
variables name: "status_check_counter", value: 0 | |
visit name: "homepage", url: url | |
post name: "upload profile image", url: "#{url}/api/file/upload", DO_MULTIPART_POST: 'true', update_at_xpath: [{xpath: "//HTTPSamplerProxy", value: Nokogiri::XML(RequestHelper.file_upload_xml).children}] do | |
extract regex: '"file_id":"(.*?)"', name: 'file_id' | |
end | |
post name: "save user", url: "#{url}/api/execute", fill_in: {request: RequestHelper.save_collection_request} do | |
extract regex: '"userid": (\d*?),', name: 'userid' | |
bsh_post name: "export userid", script: RequestHelper.bsh_script_for_variable_export("userid") | |
end | |
While name: "user being processed", condition: "${__javaScript('${user_status}'!=1 && ${status_check_counter} < 4000)}" do | |
counter name: "status_check_counter", start: 0, incr: 1, "CounterConfig.name" => "status_check_counter" | |
post name: "check user status", url: "#{url}/api/execute", fill_in: {request: RequestHelper.check_user_status} do | |
extract regex: '"progress": (.*?),', name: 'user_status' | |
end | |
constant_timer name: "wait 300ms" | |
end | |
post name: "check user status", url: "#{url}/api/execute", fill_in: {request: RequestHelper.check_user_status} do | |
assert contains: "\"progress\": 1,", name: "verify_user_ready", scope: "main" | |
end | |
end | |
threads name: "test user list", count: 5, on_sample_error: "stoptest" do | |
visit name: "user list", url: "#{url}/client/home" do | |
bsh_pre name: "import userid", script: RequestHelper.bsh_script_for_variable_import("userid") | |
end | |
end | |
end | |
end | |
end | |
unless defined? RSpec | |
file_expand_path = File.expand_path(File.join("..", options[:file] || "jmeter.jmx"), __FILE__) | |
JmxGenerator.new(options[:url]).generate.jmx(file: file_expand_path) | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require_relative '../generate_jmeter_xml' | |
describe "Generate jmeter" do | |
describe "Testing the performance of the homepage" do | |
describe '#generate' do | |
it "should take a homepage url and name to visit" do | |
home_page_test = JmxGenerator.new("http://someurl.com") | |
jmeter_testplan_xml = home_page_test.generate.to_doc | |
jmeter_testplan_xml.css('stringProp[name="HTTPSampler.domain"]').first.text.should == "someurl.com" | |
end | |
end | |
end | |
describe 'testing me as a script' do | |
let(:generate_jmeter_xml_path) { File.expand_path(File.join("..", "..", "jmx_generator.rb"), __FILE__) } | |
it 'uses a default for file location and can take a url' do | |
%x{ #{generate_jmeter_xml_path} -u yahoo.com } | |
Nokogiri::XML(File.read("jmeter.jmx")).css('stringProp[name="HTTPSampler.domain"]').first.text.should == "yahoo.com" | |
File.unlink("jmeter.jmx") | |
end | |
it 'should take a custom file location' do | |
%x{ #{generate_jmeter_xml_path} -u microsoft.com -f my_testplan.jmx} | |
Nokogiri::XML(File.read("my_testplan.jmx")).css('stringProp[name="HTTPSampler.domain"]').first.text.should == "microsoft.com" | |
File.unlink("my_testplan.jmx") | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class RequestHelper | |
class << self | |
def check_user_status | |
'{"_type":"get_user_status","colid":${colid}}' | |
end | |
def bsh_script_for_variable_export(parameter_name) | |
<<-BSH | |
import org.apache.jmeter.util.JMeterUtils; | |
JMeterUtils.setProperty("#{parameter_name}", vars.get("#{parameter_name}")); | |
BSH | |
end | |
def bsh_script_for_variable_import(parameter_name) | |
<<-BSH | |
import org.apache.jmeter.util.JMeterUtils; | |
vars.put("#{parameter_name}", JMeterUtils.getProperty("#{parameter_name}")); | |
BSH | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment