Skip to content

Instantly share code, notes, and snippets.

@jtuchscherer
Last active December 22, 2015 06:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jtuchscherer/28baa2347a068b7dcb04 to your computer and use it in GitHub Desktop.
Save jtuchscherer/28baa2347a068b7dcb04 to your computer and use it in GitHub Desktop.
invoke it with: $ ./jmx_generator.rb -u http://YOURDOMAIN.com
#! /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
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
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