Skip to content

Instantly share code, notes, and snippets.

@gunesmes
Last active July 28, 2016 11:56
Show Gist options
  • Save gunesmes/1a3e6109755d49c77855 to your computer and use it in GitHub Desktop.
Save gunesmes/1a3e6109755d49c77855 to your computer and use it in GitHub Desktop.
This gist is to run performance testing for the account page of www.myhabit.com.
parser.add_option(
'-H', '--host',
dest="host",
default=None,
help="Host to load test in the following format: http://10.21.32.33"
)
parser.add_option(
'--web-host',
dest="web_host",
default="",
help="Host to bind the web interface to. Defaults to '' (all interfaces)"
)
parser.add_option(
'-P', '--port', '--web-port',
type="int",
dest="port",
default=8089,
help="Port on which to run web host"
)
parser.add_option(
'-f', '--locustfile',
dest='locustfile',
default='locustfile',
help="Python module file to import, e.g. '../other.py'. Default: locustfile"
)
# if locust should be run in distributed mode as master
parser.add_option(
'--master',
action='store_true',
dest='master',
default=False,
help="Set locust to run in distributed mode with this process as master"
)
# if locust should be run in distributed mode as slave
parser.add_option(
'--slave',
action='store_true',
dest='slave',
default=False,
help="Set locust to run in distributed mode with this process as slave"
)
# master host options
parser.add_option(
'--master-host',
action='store',
type='str',
dest='master_host',
default="127.0.0.1",
help="Host or IP address of locust master for distributed load testing. Only used when running with --slave. Defaults to 127.0.0.1."
)
parser.add_option(
'--master-port',
action='store',
type='int',
dest='master_port',
default=5557,
help="The port to connect to that is used by the locust master for distributed load testing. Only used when running with --slave. Defaults to 5557. Note that slaves will also connect to the master node on this port + 1."
)
parser.add_option(
'--master-bind-host',
action='store',
type='str',
dest='master_bind_host',
default="*",
help="Interfaces (hostname, ip) that locust master should bind to. Only used when running with --master. Defaults to * (all available interfaces)."
)
parser.add_option(
'--master-bind-port',
action='store',
type='int',
dest='master_bind_port',
default=5557,
help="Port that locust master should bind to. Only used when running with --master. Defaults to 5557. Note that Locust will also use this port + 1, so by default the master node will bind to 5557 and 5558."
)
# if we should print stats in the console
parser.add_option(
'--no-web',
action='store_true',
dest='no_web',
default=False,
help="Disable the web interface, and instead start running the test immediately. Requires -c and -r to be specified."
)
# Number of clients
parser.add_option(
'-c', '--clients',
action='store',
type='int',
dest='num_clients',
default=1,
help="Number of concurrent clients. Only used together with --no-web"
)
# Client hatch rate
parser.add_option(
'-r', '--hatch-rate',
action='store',
type='float',
dest='hatch_rate',
default=1,
help="The rate per second in which clients are spawned. Only used together with --no-web"
)
# Number of requests
parser.add_option(
'-n', '--num-request',
action='store',
type='int',
dest='num_requests',
default=None,
help="Number of requests to perform. Only used together with --no-web"
)
# log level
parser.add_option(
'--loglevel', '-L',
action='store',
type='str',
dest='loglevel',
default='INFO',
help="Choose between DEBUG/INFO/WARNING/ERROR/CRITICAL. Default is INFO.",
)
# log file
parser.add_option(
'--logfile',
action='store',
type='str',
dest='logfile',
default=None,
help="Path to log file. If not set, log will go to stdout/stderr",
)
# if we should print stats in the console
parser.add_option(
'--print-stats',
action='store_true',
dest='print_stats',
default=False,
help="Print stats in the console"
)
# only print summary stats
parser.add_option(
'--only-summary',
action='store_true',
dest='only_summary',
default=False,
help='Only print the summary stats'
)
# List locust commands found in loaded locust files/source files
parser.add_option(
'-l', '--list',
action='store_true',
dest='list_commands',
default=False,
help="Show list of possible locust classes and exit"
)
# Display ratio table of all tasks
parser.add_option(
'--show-task-ratio',
action='store_true',
dest='show_task_ratio',
default=False,
help="print table of the locust classes' task execution ratio"
)
# Display ratio table of all tasks in JSON format
parser.add_option(
'--show-task-ratio-json',
action='store_true',
dest='show_task_ratio_json',
default=False,
help="print json data of the locust classes' task execution ratio"
)
# Version number (optparse gives you --version but we have to do it
# ourselves to get -V too. sigh)
parser.add_option(
'-V', '--version',
action='store_true',
dest='show_version',
default=False,
help="show program's version number and exit"
)
from locust import HttpLocust, TaskSet, task
from pyquery import PyQuery
import random
class UserBehaviour(TaskSet):
urls_from_page = []
def on_start(self):
# on starting, we will login and get session then
# we wil be able to send request to login required page "/my-account"
self.client.post("/", {"email": "[email protected]", "password": "Passw0rd"})
request = self.client.get("/my-account")
# from content of the page, we will take all links and then store them to a variable
pq = PyQuery(request.content)
# PyQuery can optain data from the page by jQuery
link_elements = pq(".link > a")
for url in link_elements:
self.urls_from_page.append(url.attrib["href"])
@task
def load_page(self):
# this is a task to run performance testing
# we will send http request the url taken from "my-account" page
try:
url = random.choice(self.urls_from_page)
self.client.get(url)
except IndexError:
print "... something wrong check, pq!"
pass
class User(HttpLocust):
host = "http://www.myhabit.com"
task_set = UserBehaviour
# stop the test after 120 seconds
stop_timeout = 120
# time for user behaviour
# we can assume that they wait 0.5 to 6 seconds on a page
min_wait = 500
max_wait = 6000
Percentage of the requests completed within given times
Name # reqs 50% 66% 75% 80% 90% 95% 98% 99% 100%
-----------------------------------------------------------------------------------------------------------------------------
/ 92 720 820 1000 1300 3800 7500 18000 20000 903
/help/200644950 14 500 510 510 520 530 940 940 940 936
/my-account 92 310 320 360 360 640 1000 4400 5600 5609
/orc 14 860 910 920 930 1300 4500 4500 4500 4453
/yacontactus 20 850 930 980 1100 1300 1300 1300 1300 1349
--------------------------------------------------------------------------------------------------------------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment