Last active
August 29, 2015 14:18
-
-
Save samukasmk/8e2303e9bd1093dbd33e to your computer and use it in GitHub Desktop.
Pymetter: Test webpage with json content and calculate average elapsed time
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/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 " -> [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 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