Skip to content

Instantly share code, notes, and snippets.

@samukasmk
Last active August 29, 2015 14:18
Show Gist options
  • Save samukasmk/8e2303e9bd1093dbd33e to your computer and use it in GitHub Desktop.
Save samukasmk/8e2303e9bd1093dbd33e to your computer and use it in GitHub Desktop.
Pymetter: Test webpage with json content and calculate average elapsed time
#!/usr/bin/python
#
# script: pymetter
# by: Samuel Maciel Sampaio [20150403] <samukasmk@gmail.com>
# goal: Test webpage with json content and calculate average elapsed time
# example of use:
# ./pymetter.py --url https://api.github.com/user \
# --http-user 'your_github_username' \
# --http-pass 'your_github_password'
import requests
import os
import json
import argparse
import datetime
from time import sleep
def test_page(url, http_user, http_pass, name, desc, how_many_times=10, sleep_seconds=10,
timeout=90, quiet=False, **kwargs):
if quiet != None:
print "\nstarting tests..."
# populate dict obj
result_obj = {}
for arg in locals().items():
result_obj[ arg[0] ] = arg[1]
result_obj['attempts'] = {}
result_obj['_total_time_elapsed'] = 0.0
# exec test how many times passed
for attempt in range(0, how_many_times):
received_page = requests.get(url, auth=(http_user, http_pass), timeout=timeout)
if received_page.status_code in [200, 401]:
try:
dict_json = received_page.json()
if len(dict_json) > 1:
has_valid_json = True
else:
has_valid_json = False
except:
has_valid_json = False
else:
has_valid_json = False
# populate result_obj
attempt += 1
result_obj['attempts'][attempt] = {}
result_obj['attempts'][attempt]['time'] = datetime.datetime.now().ctime()
result_obj['attempts'][attempt]['seconds_elapsed'] = received_page.elapsed.total_seconds()
result_obj['attempts'][attempt]['status_code'] = received_page.status_code
result_obj['attempts'][attempt]['has_valid_json'] = has_valid_json
result_obj['attempts'][attempt]['parcial_content'] = received_page.text[0:30] + '...'
result_obj['_total_time_elapsed'] += received_page.elapsed.total_seconds()
# if no quiet... print tests
if quiet == False:
print
print " -> [test result] status_code: %s, has_valid_json: %s, seconds_elapsed: %s, parcial_content: %s" % (
str(result_obj['attempts'][attempt]['status_code']),
str(result_obj['attempts'][attempt]['has_valid_json']),
str(result_obj['attempts'][attempt]['seconds_elapsed']),
str(result_obj['attempts'][attempt]['parcial_content'])
)
print " -> [sleeping] %s secs..." % str(sleep_seconds)
sleep(sleep_seconds)
_average_time_elapsed = (result_obj['_total_time_elapsed'] / how_many_times)
result_obj['average_seconds_elapsed'] = float("%.2f" % _average_time_elapsed)
result_obj.pop('result_obj', None)
result_obj.pop('kwargs', None)
result_obj.pop('quiet', None)
result_obj.pop('_total_time_elapsed', None)
result_obj.pop('http_user', None)
result_obj.pop('http_pass', None)
test_page.result_obj = result_obj
return result_obj
def arg_parse():
parser = argparse.ArgumentParser(
prog='pymetter', description='Test json pages')
parser.add_argument(
'-u','--url', help='"URL to test (Required)"',
required=True)
parser.add_argument(
'--http-user', help='"Username for basic auth"',
required=False)
parser.add_argument(
'--http-pass', help='"Password for basic auth"',
required=False)
parser.add_argument(
'-m','--how-many-times', help='"Number of attempts (Default: 10)"',
required=False, default=10, type=int)
parser.add_argument(
'-s','--sleep-seconds', help='"Seconds between tests (Default: 10)"',
required=False, default=10, type=int)
parser.add_argument(
'-t','--timeout', help='"Connection timeout (Default: 90)"',
required=False, default=90, type=int)
parser.add_argument(
'-n','--name', help='"Name of test"',
required=False)
parser.add_argument(
'-d','--desc', help='"Description of test"',
required=False)
parser.add_argument(
'-f','--file', help='"Path for output json file"',
required=False)
parser.add_argument(
'-q', '--quiet', help='"Quiet mode (Default: False)"',
required=False, action='store_true')
args = vars(parser.parse_args())
arg_parse.args = args
if __name__ == '__main__':
arg_parse()
results = test_page(**arg_parse.args)
try:
result_json_to_print = json.dumps(results, indent=4, sort_keys=True)
except:
result_json_to_print = {'error':'on dumps json'}
print
print
print
print result_json_to_print
if arg_parse.args['file'] != None:
arg_parse.args['file'] = arg_parse.args['file'].replace(' ', '_')
arg_parse.args['file'] = arg_parse.args['file'].replace('.json', '')
arg_parse.args['file'] = arg_parse.args['file'] + '.json'
print "Output of this json is the file: %s" % arg_parse.args['file']
try:
with open(arg_parse.args['file'], 'w') as outfile:
json.dump(results, outfile, ensure_ascii=False, indent=4, sort_keys=True)
except:
print "Error on write file json: %s" % arg_parse.args['file']
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment