def create_jmeter_rule(group_name, get_id, get_description, get_version, get_components, get_response_filters): """ Create JSON file structure @param group_name: the name of rules group @param get_id: the id of the rules @param get_description: the description of the rules @param get_version: the version of the rules @param get_components: the components of the rules @param get_response_filters: the response filter for the rules @return json file structure """ data = { 'id': get_id, 'description': get_description, 'version': get_version, "components": get_components, "responseFilters": get_response_filters, "rules": [], "repositoryId": "local" } json_file_name = group_name + '/' + get_id + '-' + get_version + '-template' + '.json' os.makedirs(os.path.dirname(json_file_name)) # Create JSON File with open(json_file_name, "w+") as f: json.dump(data, f) f.close() #print("Rules has been created: ", json_file_name) message = "Rules has been created: " + json_file_name print_message(message, message_color="green") return
def header_manager(flag, enabled_count): if not flag: print_message( message_color=Colors.red, message=f"{enabled_count} Header Manager are enabled.") print_message(message_color=Colors.white, message="Consider adding Header Manager.")
def find_element_status(tree, element): """ Finds the element status for a specified element @param tree: Parsed JMX file @param element: Name of the element to check the status for """ root = tree.getroot() enabled_count = 0 flag = 0 message = f"No element found for {element}." # Elements to ignore if not found in the JMX Test Plan # if element == 'XPath2Assertion' or element == 'JSONPathAssertion': # message=f"Check ignored for {element}." # printGreen(message) # for node in root.iter(element): if node.attrib is None: print_message(message_color=Colors.red, message=message) else: if str.__contains__(str(node.attrib), '\'enabled\': \'true\''): # Find enabled count enabled_count += 1 # Set flag for success flag = 1 message = f"{enabled_count} {element}(s) enabled." else: message = f"No {element} enabled." # Set flag for fail flag = 0 # print custom logs for exception elements Exceptions.check(element, flag, enabled_count, message)
def config_test_element(flag, enabled_count): if not flag: print_message( message_color=Colors.red, message=f"{enabled_count} HTTP Request Defaults added.") print_message(message_color=Colors.white, message="Consider adding HTTP Request Defaults.")
def attribute_check(tree, element): """ Performs additional attribute checks on IfController or LoopController @param tree: The parsed JMX @param element: The element to check """ root = tree.getroot() # Set flag = 1 for issue found flag = 0 for node in root.iter(element): # for child in node.getchildren(): for i, j in child.attrib.items(): # print(i, j) if str(j) == 'IfController.useExpression': # Set flag = 0 for no issues flag = 0 elif str(j) == 'LoopController.loops': loop_count = child.text if int(loop_count) == -1: flag = 0 else: flag = 1 if flag == 1: if element == 'IfController': print_message( message_color=Colors.white, message= "For performance, check \"Interpret Condition as Variable" " Expression\" in If Controller.") elif element == 'LoopController': print_message( message_color=Colors.white, message="Loop Count is set to infinity. Double check " "the count before you start the test.")
def create_repository(get_id, get_version, group_name): """ Creating a repository for the rules """ data = {get_id: {"versions": [get_version]}} repository_file_name = group_name + '/' + get_id + '-repository.json' os.makedirs(os.path.dirname(repository_file_name), exist_ok=True) with open(repository_file_name, "w+") as f: json.dump(data, f) f.close() message = "Repository file has been created: " + repository_file_name print_message(message, message_color="green")
def bean_shell_sampler(flag, enabled_count): if flag: print_message(message_color=Colors.red, message=f"{enabled_count} Bean Shell Sampler(s) are enabled.") print_message(message_color=Colors.white, message="Consider using JSR223 Sampler.") else: print_message(message_color=Colors.green, message=f"{enabled_count} Bean Shell Sampler(s) are enabled.") print_message(message_color=Colors.white, message="Consider using JSR223 Sampler.")
def validate_test_plan(jmx): """ validates the JMeter test plan @param jmx: The file path to the JMX """ try: tree = ElementTree.parse(jmx) print_message(message_color=Colors.green, message="Valid JMeter Test Plan") return tree except: print_message( message_color=Colors.red, message= "Invalid test plan. Please use the valid JMeter test plan. \n") exit(1)
def proxy_control(flag, enabled_count): if flag: print_message(message_color=Colors.red, message=f"{enabled_count} HTTP(S) Script Recorder(s) are enabled.") print_message(message_color=Colors.white, message="Consider disabling HTTP(S) Script Recorder(s).") else: print_message(message_color=Colors.green, message=f"{enabled_count} HTTP(S) Script Recorder(s) are enabled.")
def result_collector(flag, enabled_count): if flag: print_message(message_color=Colors.red, message=f"{enabled_count} Listener(s) enabled.") print_message(message_color=Colors.white, message="Consider disabling Listeners.") else: print_message(message_color=Colors.green, message=f"{enabled_count} Listener(s) are enabled.")
def find_element_status(tree, element, plugin_name=None): """ Finds the element status for a specified element @param tree: Parsed JMX file @param element: Name of the element to check the status for @param plugin_name: (Optional) Name of the plugin to check the status for """ root = tree.getroot() enabled_count = 0 flag = 0 lookup_element = deepcopy(element) message = f"No element found for {element}." if plugin_name is not None: message = f"No plugin found for {plugin_name}." lookup_element = deepcopy(plugin_name) if not count_node(root, lookup_element) > 0: print_message(message_color=Colors.red, message=message) for node in root.iter(lookup_element): if node.attrib is None: print_message(message_color=Colors.red, message=message) else: if str.__contains__(str(node.attrib), '\'enabled\': \'true\''): # Find enabled count enabled_count += 1 # Set flag for success flag = 1 message = f"{enabled_count} {element}(s) enabled." else: message = f"No {element} enabled." # Set flag for fail flag = 0 # print custom logs for exception elements Exceptions.check(element, flag, enabled_count, message)
def debug_sampler(flag, enabled_count): if flag: print_message( message_color=Colors.red, message=f"{enabled_count} Debug Sampler(s) are enabled.") print_message(message_color=Colors.white, message="Consider disabling Debug Samplers.") else: print_message( message_color=Colors.green, message=f"{enabled_count} Debug Sampler(s) are enabled.")
def json_path_assertion(flag, enabled_count): if flag: print_message( message_color=Colors.red, message=f"{enabled_count} JSON Path Assertion(s) are enabled.") print_message(message_color=Colors.white, message="Consider disabling JSON Path Assertions.") else: print_message( message_color=Colors.green, message=f"{enabled_count} JSON Path Assertion(s) are enabled.")
def response_assertion(flag, enabled_count): if flag: print_message( message_color=Colors.red, message=f"{enabled_count} Response Assertion(s) are enabled.") print_message(message_color=Colors.white, message="Consider disabling Response Assertions.") else: print_message( message_color=Colors.green, message=f"{enabled_count} Response Assertion(s) are enabled.")
def find_thread_groups_status(tree, element): """ Detects Thread Group and types. It reads from the config.yaml for the list of Thread Groups. @param tree: Parsed JMX file @param element: The name of the thread group to find @return: """ root = tree.getroot() enabled_count = 0 flag = 0 message = f"No element found for {element}." for node in root.iter(element): if node.attrib: # Find Enabled Thread Groups if str.__contains__(str(node.attrib), '\'enabled\': \'true\''): # Find enabled count enabled_count += 1 # Set flag for success flag = 1 message = f"Total number of {element} enabled {enabled_count}" elif str.__contains__(str(node.attrib), '\'enabled\': \'false\''): message = f"No {element} enabled." # Set flag for fail flag = 0 else: print_message(message_color=Colors.red, message=f"No {element} found.") if flag == 1: print_message(message_color=Colors.green, message=message) enabled_count = 0 if flag == 0: print_message(message_color=Colors.red, message=message) print_message(message_color=Colors.white, message=f"Consider enabling one or more {element}.") enabled_count = 0 return
def attribute_check(tree, element): """ Performs additional attribute checks on IfController or LoopController @param tree: The parsed JMX @param element: The element to check """ root = tree.getroot() # Set flag = 1 for issue found flag = 0 for node in root.iter(element): try: for child in node.getchildren(): for i, j in child.attrib.items(): print(i, j) if str(j) == 'IfController.useExpression': # Set flag = 0 for no issues flag = 0 elif str(j) == 'LoopController.loops': loop_count = child.text if int(loop_count) == -1: flag = 0 else: flag = 1 except AttributeError: if element == 'LoopController': print_message(message_color=Colors.red, message="Loop Controller is empty.") logging.basicConfig( filename='tmp.log', format='%(levelname)s %(asctime)s :: %(message)s', level=logging.DEBUG) if flag == 1: if element == 'IfController': print_message( message_color=Colors.white, message= "For performance, check \"Interpret Condition as Variable" " Expression\" in If Controller.") elif element == 'LoopController': print_message( message_color=Colors.white, message="Loop Count is set to infinity. Double check " "the count before you start the test.")
def validate_jmeter_version(tree): """ Finds the JMeter version @param tree: Parsed JMX file """ # Get JMeter version root = tree.getroot() jmeter_version = root.items() expected_jmeter_version = get_jmeter_version() # Check JMeter Version if expected_jmeter_version == jmeter_version[2][1]: print_message(message_color=Colors.green, message=f"JMeter version is {jmeter_version[2][1]}.") else: print_message( message_color=Colors.red, message=f"Found outdated JMeter version: {jmeter_version[2][1]}.") print_message( message_color=Colors.white, message="Consider updating to the latest version of JMeter.")
def csv_data_set(flag, enabled_count): if not flag: print_message(message_color=Colors.red, message=f"{enabled_count} CSV Data Set are added.") print_message(message_color=Colors.white, message="Consider adding CSV Data Set.")
def main(): """ The main context of the application. Purpose: Converts LoadRunner correlation rules to Blazemeter Correlation Recorder Plugin format @Input: LoadRunner Correlation file (*.cor) @Output: Blazemeter Correlation Recorder Rules Template (*.json) Author: NaveenKumar Namachivayam | QAInsights.com """ try: parser = argparse.ArgumentParser( description='Convert LoadRunner Correlation Rules to JMeter') required_named = parser.add_argument_group('mandatory arguments') required_named.add_argument("-f", "--file", dest="corfile", help="Add Correlation file path") args = parser.parse_args() cor = args.corfile # File Rename from *.cor to *.xml lr_cor_file = cor base = os.path.splitext(lr_cor_file)[0] lr_cor_file_renamed = base + ".xml" os.rename(lr_cor_file, lr_cor_file_renamed) # Get Inputs from user get_id = str(input("Enter id - [default: 1.0]: ") or "myrules") get_description = str( input( "Enter description - [default: Inception version for my rules]: " ) or "1.0") get_version = str( input("Enter the version - [default: 1.0]: ") or "1.0") get_components = str( input( "Enter the components - [default: com.blazemeter.jmeter.correlation.siebel.SiebelCounterCorrelationReplacement]:" ) or "com.blazemeter.jmeter.correlation.siebel.SiebelCounterCorrelationReplacement" ) get_response_filters = str( input("Enter the version - [default: text/html]: ") or "text/html") # Root element of cor file root = ET.parse(lr_cor_file_renamed).getroot() # Iterate through each group # Loops only one time for group in root.iter('Group'): group_name = group.attrib['Name'] break # Boiler Plate create_jmeter_rule(group_name, get_id, get_description, get_version, get_components, get_response_filters) # Create Rules fetch_rules(root, group_name, get_id, get_version) # Create Repository File create_repository(get_id, get_version, group_name) # Reverting the file name lr_cor_file = lr_cor_file_renamed base = os.path.splitext(lr_cor_file)[0] lr_cor_file_renamed = base + ".cor" os.rename(lr_cor_file, lr_cor_file_renamed) except FileNotFoundError as e: print_message(e, message_color="red")
def cookie_manager(flag, enabled_count): if not flag: print_message(message_color=Colors.red, message=f"{enabled_count} CookieManager added.") print_message(message_color=Colors.white, message="Consider adding CookieManager.")
def constant_timer(flag, enabled_count): if not flag: print_message(message_color=Colors.red, message=f"{enabled_count} Timers added.") print_message(message_color=Colors.white, message="Consider adding Timers.")
def test_action(flag, enabled_count): if not flag: print_message(message_color=Colors.red, message=f"{enabled_count} Test Action are enabled.") print_message(message_color=Colors.white, message="Consider adding Test Action.")
def jp_result_collector(flag, enabled_count): if flag: print_message(message_color=Colors.red, message=f"{enabled_count} Visualizer(s) enabled.") print_message(message_color=Colors.white, message="Consider disabling Visualizer(s) plugins.") else: print_message(message_color=Colors.green, message=f"{enabled_count} Visualizer(s) are enabled.")
def default_choice(flag, message): if flag: print_message(message_color=Colors.green, message=message)