def rename_element(): if request.method == 'POST': project = request.form['project'] elem_type = request.form['elemType'] full_filename = request.form['fullFilename'] new_full_filename = request.form['newFullFilename'] error = '' old_filename, old_parents = utils.separate_file_from_parents( full_filename) new_filename, new_parents = utils.separate_file_from_parents( new_full_filename) if len(new_filename) == 0: error = 'File name cannot be empty' else: for c in new_full_filename.replace('.', ''): if not c.isalnum() and not c in ['-', '_']: error = 'Only letters, numbers, \'-\' and \'_\' are allowed' break dir_type_name = '' if not error: if elem_type == 'test': dir_type_name = 'tests' elif elem_type == 'page': dir_type_name = 'pages' elif elem_type == 'suite': dir_type_name = 'suites' old_path = os.path.join(root_path, 'projects', project, dir_type_name, os.sep.join(old_parents)) new_path = os.path.join(root_path, 'projects', project, dir_type_name, os.sep.join(new_parents)) error = file_manager.rename_file(old_path, old_filename + '.py', new_path, new_filename + '.py') if not error and elem_type == 'test': # try to rename data file in /data/ folder # TODO, data files in /data/ will be deprecated old_path = os.path.join(root_path, 'projects', project, 'data', os.sep.join(old_parents)) new_path = os.path.join(root_path, 'projects', project, 'data', os.sep.join(new_parents)) if os.path.isfile(os.path.join(old_path, old_filename + '.csv')): error = file_manager.rename_file(old_path, old_filename + '.csv', new_path, new_filename + '.csv') # try to rename data file in /tests/ folder old_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(old_parents)) new_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(new_parents)) if os.path.isfile(os.path.join(old_path, old_filename + '.csv')): error = file_manager.rename_file(old_path, old_filename + '.csv', new_path, new_filename + '.csv') return json.dumps(error)
def rename_element(): if request.method == 'POST': project = request.form['project'] elem_type = request.form['elemType'] full_filename = request.form['fullFilename'] new_full_filename = request.form['newFullFilename'] error = '' old_filename, old_parents = utils.separate_file_from_parents(full_filename) new_filename, new_parents = utils.separate_file_from_parents(new_full_filename) if len(new_filename) == 0: error = 'File name cannot be empty' else: for c in new_full_filename.replace('.',''): if not c.isalnum() and not c in ['-', '_']: error = 'Only letters, numbers, \'-\' and \'_\' are allowed' break dir_type_name = '' if not error: if elem_type == 'test': dir_type_name = 'tests' elif elem_type == 'page': dir_type_name = 'pages' elif elem_type == 'suite': dir_type_name = 'suites' old_path = os.path.join(root_path, 'projects', project, dir_type_name, os.sep.join(old_parents)) new_path = os.path.join(root_path, 'projects', project, dir_type_name, os.sep.join(new_parents)) error = io_manager.rename_file(old_path, old_filename+'.py', new_path, new_filename+'.py') if not error and elem_type == 'test': # try to rename data file in /data/ folder # TODO, data files in /data/ will be deprecated old_path = os.path.join(root_path, 'projects', project, 'data', os.sep.join(old_parents)) new_path = os.path.join(root_path, 'projects', project, 'data', os.sep.join(new_parents)) if os.path.isfile(os.path.join(old_path, old_filename+'.csv')): error = io_manager.rename_file(old_path, old_filename+'.csv', new_path, new_filename+'.csv') # try to rename data file in /tests/ folder old_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(old_parents)) new_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(new_parents)) if os.path.isfile(os.path.join(old_path, old_filename+'.csv')): error = io_manager.rename_file(old_path, old_filename+'.csv', new_path, new_filename+'.csv') return json.dumps(error)
def get_internal_test_data(project, full_test_case_name, repr_strings=False): """Get test data defined inside the test itself.""" # check if test has data variable defined data_list = [] tc_name, parents = utils.separate_file_from_parents(full_test_case_name) path = os.path.join(session.testdir, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(tc_name)) test_module, _ = utils.import_module(path) if hasattr(test_module, 'data'): msg_not_list_not_dict = ('Warning: infile test data must be a dictionary ' 'or a list of dictionaries\nCurrent value is:\n{}\n') data_variable = getattr(test_module, 'data') if type(data_variable) == dict: data_list.append(data_variable) elif type(data_variable) == list: if all(isinstance(item, dict) for item in data_variable): data_list = data_variable else: print(msg_not_list_not_dict.format(data_variable)) else: print(msg_not_list_not_dict.format(data_variable)) if repr_strings: # replace string values for their repr values data_list_clean = [] for data_dict in data_list: d = {} for k, v in data_dict.items(): if type(v) == str: d[k] = repr(v) else: d[k] = v data_list_clean.append(d) data_list = data_list_clean return data_list
def get_external_test_data(project, full_test_case_name): """Get data from file (csv).""" data_list = [] test, parents = utils.separate_file_from_parents(full_test_case_name) data_file_path_data_folder = os.path.join(session.testdir, 'projects', project, 'data', os.sep.join(parents), '{}.csv'.format(test)) data_file_path_test_folder = os.path.join(session.testdir, 'projects', project, 'tests', os.sep.join(parents), '{}.csv'.format(test)) # check if csv file exists in /data/ folder if os.path.isfile(data_file_path_data_folder): with open(data_file_path_data_folder, 'r') as csv_file: dict_reader = csv.DictReader(csv_file) for data_set in dict_reader: data_list.append(dict(data_set)) # TODO deprecate /data/ folder print(( 'Warning: data files defined in the /data/ folder will soon ' 'be deprecated. Test data files should be placed in the same folder ' 'as the test file.')) # check if csv file exists in /tests/ folder elif os.path.isfile(data_file_path_test_folder): with open(data_file_path_test_folder, 'r', encoding='utf8') as csv_file: dict_reader = csv.DictReader(csv_file) for data_set in dict_reader: data_list.append(dict(data_set)) return data_list
def test_case_view(project, test_name): test = Test(project, test_name) if not test.exists: abort(404, 'The test {} does not exist'.format(test_name)) tc_name, parents = utils.separate_file_from_parents(test_name) _, error = utils.import_module(test.path) if error: url = url_for('webapp.test_case_code_view', project=project, test_name=test_name) content = ('<h4>There are errors in the test</h4>' '<p>There are errors and the test cannot be displayed, ' 'open the test code editor to solve them.</p>' '<a class="btn btn-default" href="{}">Open Test Code</a>'. format(url)) return render_template('common_element_error.html', project=project, item_name=test_name, content=content) else: test_data = test_data_module.get_test_data(project, test_name, repr_strings=True) return render_template('test_builder/test_case.html', project=project, test_components=test.components, test_case_name=tc_name, full_test_case_name=test_name, test_data=test_data)
def save_page_object(root_path, project, full_page_name, elements, functions, import_lines): """Save Page Object contents to file. full_page_name must be a dot path starting from /project/pages/ directory, (i.e.: 'module.sub_module.page_name_01') """ def format_element_string(name, selector, value, display_name): formatted = ("\n\n{0} = ('{1}', \'{2}\', '{3}')".format( element['name'], element['selector'], element['value'], element['display_name'])) return formatted page_name, parents = utils.separate_file_from_parents(full_page_name) page_object_path = os.path.join(root_path, 'projects', project, 'pages', os.sep.join(parents), '{}.py'.format(page_name)) with open(page_object_path, 'w', encoding='utf-8') as po_file: for line in import_lines: po_file.write("{}\n".format(line)) for element in elements: # replace the spaces with underlines of the element name if ' ' in element['name']: element['name'] = element['name'].replace(' ', '_') # escape quote characters element['value'] = element['value'].replace('"', '\\"').replace( "'", "\\'") if not element['display_name']: element['display_name'] = element['name'] formatted = format_element_string(element['name'], element['selector'], element['value'], element['display_name']) po_file.write(formatted) for func in functions: po_file.write('\n\n' + func)
def save_test_case_code(root_path, project, full_test_case_name, content): tc_name, parents = utils.separate_file_from_parents(full_test_case_name) test_case_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(tc_name)) with open(test_case_path, 'w', encoding='utf-8') as f: f.write(content)
def test_case_view(project, test_case_name): # check if user has permissions for this project if not user.has_permissions_to_project(g.user.id, project, root_path, 'gui'): return render_template('not_permission.html') # check if the file is locked # is_locked_by = lock.is_file_locked(root_path, project, test_case_name) # print(is_locked_by, g.user.username) # if is_locked_by and is_locked_by != g.user.username: # abort(404, 'This file is locked by someone else.') # else: tc_name, parents = utils.separate_file_from_parents(test_case_name) path = test_case.generate_test_case_path(root_path, project, test_case_name) error = utils.validate_python_file_syntax(path) if error: return render_template('test_builder/test_case_syntax_error.html', project=project, full_test_case_name=test_case_name) else: test_case_contents = test_case.get_test_case_content( root_path, project, test_case_name) test_data = test_data_module.get_test_data(root_path, project, test_case_name) return render_template('test_builder/test_case.html', project=project, test_case_contents=test_case_contents, test_case_name=tc_name, full_test_case_name=test_case_name, test_data=test_data)
def save_test_case(root_path, project, full_test_case_name, description, page_objects, test_steps, test_data): tc_name, parents = utils.separate_file_from_parents(full_test_case_name) test_case_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(tc_name)) formatted_description = format_description(description) with open(test_case_path, 'w', encoding='utf-8') as f: # write description f.write('\n') f.write(formatted_description) f.write('\n') # write the list of pages f.write('pages = {}\n'.format(format_page_object_string(page_objects))) f.write('\n') # write test data if required or save test data to external file if test_execution.settings['test_data'] == 'infile': if test_data: pretty = pprint.PrettyPrinter(indent=4, width=1) #f.write('data = ' + pretty.pformat(test_data) + '\n\n') f.write('data = {}'.format(format_data(test_data))) test_data_module.remove_csv_if_exists(root_path, project, full_test_case_name) else: test_data_module.save_external_test_data_file(root_path, project, full_test_case_name, test_data) # write the setup function f.write('def setup(data):\n') if test_steps['setup']: for step in test_steps['setup']: step_action = step['action'].replace(' ', '_') param_str = ', '.join(step['parameters']) f.write(' {0}({1})\n'.format(step_action, param_str)) else: f.write(' pass\n') f.write('\n') # write the test function f.write('def test(data):\n') if test_steps['test']: for step in test_steps['test']: step_action = step['action'].replace(' ', '_') param_str = ', '.join(step['parameters']) f.write(' {0}({1})\n'.format(step_action, param_str)) else: f.write(' pass\n') f.write('\n\n') # write the teardown function f.write('def teardown(data):\n') if test_steps['teardown']: for step in test_steps['teardown']: step_action = step['action'].replace(' ', '_') param_str = ', '.join(step['parameters']) f.write(' {0}({1})\n'.format(step_action, param_str)) else: f.write(' pass\n')
def get_suite_module(workspace, project, suite_name): """Get the module of a suite""" suite_name, parents = utils.separate_file_from_parents(suite_name) path = os.path.join(workspace, 'projects', project, 'suites', os.sep.join(parents), suite_name + '.py') suite_module, _ = utils.import_module(path) return suite_module
def test_case_view(project, test_case_name): # check if the file is locked # is_locked_by = lock.is_file_locked(root_path, project, test_case_name) # print(is_locked_by, g.user.username) # if is_locked_by and is_locked_by != g.user.username: # abort(404, 'This file is locked by someone else.') # else: test_exists = test_case.test_case_exists(test_execution.root_path, project, test_case_name) if not test_exists: abort(404, 'The test {} does not exist'.format(test_case_name)) tc_name, parents = utils.separate_file_from_parents(test_case_name) path = test_case.generate_test_case_path(root_path, project, test_case_name) _, error = utils.import_module(path) if error: url = url_for('test_case_code_view', project=project, test_case_name=test_case_name) content = ('<h4>There are errors in the test</h4>' '<p>There are errors and the test cannot be displayed, ' 'open the test code editor to solve them.</p>' '<a class="btn btn-default" href="{}">Open Test Code</a>' .format(url)) return render_template('common_element_error.html', project=project, item_name=test_case_name, content=content) else: test_case_contents = test_case.get_test_case_content(root_path, project, test_case_name) test_data = test_data_module.get_test_data(root_path, project, test_case_name, repr_strings=True) return render_template('test_builder/test_case.html', project=project, test_case_contents=test_case_contents, test_case_name=tc_name, full_test_case_name=test_case_name, test_data=test_data)
def test_case_view(project, test_case_name): # check if user has permissions for this project if not user.has_permissions_to_project(g.user.id, project, root_path, 'gui'): return render_template('not_permission.html') # check if the file is locked # is_locked_by = lock.is_file_locked(root_path, project, test_case_name) # print(is_locked_by, g.user.username) # if is_locked_by and is_locked_by != g.user.username: # abort(404, 'This file is locked by someone else.') # else: tc_name, parents = utils.separate_file_from_parents(test_case_name) path = test_case.generate_test_case_path(root_path, project, test_case_name) error = utils.validate_python_file_syntax(path) if error: return render_template('test_builder/test_case_syntax_error.html', project=project, full_test_case_name=test_case_name) else: test_case_contents = test_case.get_test_case_content(root_path, project, test_case_name) test_data = test_data_module.get_test_data(root_path, project, test_case_name) return render_template('test_builder/test_case.html', project=project, test_case_contents=test_case_contents, test_case_name=tc_name, full_test_case_name=test_case_name, test_data=test_data)
def get_page_object_content(root_path, project, full_po_name): po, parents = utils.separate_file_from_parents(full_po_name) modulex = importlib.import_module('projects.{0}.pages.{1}'.format( project, full_po_name)) variable_list = [ item for item in dir(modulex) if not item.startswith("__") ] element_list = [] function_list = [] import_lines = [] code_line_list = [] source_code = '' # get all the import lines in a list try: source_code = inspect.getsource(modulex) except: pass code_line_list = source_code.split('\n') for line in code_line_list: if 'import' in line: import_lines.append(line) for var_name in variable_list: variable = getattr(modulex, var_name) if isinstance(variable, types.FunctionType): # this is a function new_function = { 'function_name': var_name, 'full_function_name': ''.join([full_po_name, '.', var_name]), 'description': inspect.getdoc(variable), 'arguments': inspect.getargspec(variable).args, 'code': inspect.getsource(variable) } function_list.append(new_function) elif isinstance(variable, tuple): # this is a web element tuple element_display_name = '' if len(variable) >= 3: element_display_name = variable[2] new_element = { 'element_name': var_name, 'element_selector': variable[0], 'element_value': variable[1], 'element_display_name': element_display_name, 'element_full_name': ''.join([full_po_name, '.', var_name]) } element_list.append(new_element) elif isinstance(variable, types.ModuleType): pass else: print('ERROR', variable) page_object_data = { 'function_list': function_list, 'element_list': element_list, 'import_lines': import_lines, 'code_line_list': code_line_list, 'source_code': source_code } return page_object_data
def remove_csv_if_exists(project, full_test_case_name): """Remove csv data file from tests/ folder""" tc_name, parents = utils.separate_file_from_parents(full_test_case_name) data_file_path_tests_folder = os.path.join(session.testdir, 'projects', project, 'tests', os.sep.join(parents), '{}.csv'.format(tc_name)) if os.path.isfile(data_file_path_tests_folder): os.remove(data_file_path_tests_folder)
def suite_exists(workspace, project, full_suite_name): """suite exists. full_suite_name must be a relative dot path """ suite, parents = utils.separate_file_from_parents(full_suite_name) path = os.path.join(workspace, 'projects', project, 'suites', os.sep.join(parents), '{}.py'.format(suite)) return os.path.isfile(path)
def test_case_exists(workspace, project, full_test_case_name): """Test case exists. full_test_case_name is a relative dot path to the test. """ test, parents = utils.separate_file_from_parents(full_test_case_name) path = os.path.join(workspace, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(test)) return os.path.isfile(path)
def save_external_test_data_file(project, full_test_case_name, test_data): """Save data to external file (csv). full_test_case_name must be a relative dot path test_data must be a list of dictionaries Temporarily this will save to /data/<test_name>.csv if this already exists. Otherwise, the file will be stored in the same folder as the test # TODO """ tc_name, parents = utils.separate_file_from_parents(full_test_case_name) data_file_path_data_folder = os.path.join(session.testdir, 'projects', project, 'data', os.sep.join(parents), '{}.csv'.format(tc_name)) data_path_tests_folder = os.path.join(session.testdir, 'projects', project, 'tests', os.sep.join(parents)) data_file_path_tests_folder = os.path.join(data_path_tests_folder, '{}.csv'.format(tc_name)) # if csv file exists in /data/ use this file # remove csv file from /tests/ folder if it exists if os.path.isfile(data_file_path_data_folder): with open(data_file_path_data_folder, 'w') as data_file: if test_data: writer = csv.DictWriter(data_file, fieldnames=test_data[0].keys(), lineterminator='\n') writer.writeheader() for row in test_data: writer.writerow(row) else: data_file.write('') # remove csv from /tests/ folder if it exists if os.path.isfile(data_file_path_tests_folder): os.remove(data_file_path_tests_folder) # TODO deprecate /data/ folder print(( 'Warning: data files defined in the /data/ folder will soon ' 'be deprecated. Test data files should be placed in the same folder ' 'as the test file.')) else: # else, update or create a csv file in /tests/ folder if os.path.isfile(data_file_path_tests_folder) or test_data: # update data file only if it already exists or there's data os.makedirs(data_path_tests_folder, exist_ok=True) with open(data_file_path_tests_folder, 'w') as data_file: if test_data: writer = csv.DictWriter(data_file, fieldnames=test_data[0].keys(), lineterminator='\n') writer.writeheader() for row in test_data: writer.writerow(row) else: data_file.write('')
def change_test_name(): if request.method == 'POST': project = request.form['project'] test_name = request.form['testName'] new_test_name = request.form['newTestName'] test, parents = utils.separate_file_from_parents(test_name) current_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(test)) test, parents = utils.separate_file_from_parents(new_test_name) new_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(test)) try: os.rename(current_path, new_path) return json.dumps('ok') except: return json.dumps('error')
def generate_page_path(root_path, project, full_page_name): """Generates a path to a page object python file Example": generate_page_path('user/testdir', 'project1, 'module1.page1') -> 'user/testdir/projects/project1/pages/module1/page1.py' """ page_name, parents = utils.separate_file_from_parents(full_page_name) page_path = os.path.join(root_path, 'projects', project, 'pages', os.sep.join(parents), '{}.py'.format(page_name)) return page_path
def format_page_object_import_string(project, page_object): po, parents = utils.separate_file_from_parents(page_object) print 'parents', parents if parents: parents = '.' + '.'.join(parents) else: parents = '' po_import_string = 'from projects.{0}.pages{1} ' \ 'import {2}\n'.format(project, parents, po) return po_import_string
def save_test_case(root_path, project, full_test_case_name, description, page_objects, test_steps): tc_name, parents = utils.separate_file_from_parents(full_test_case_name) test_case_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(tc_name)) setup_stored_keys = get_stored_keys(test_steps['setup']) test_stored_keys = get_stored_keys(test_steps['test']) teardown_stored_keys = get_stored_keys(test_steps['teardown']) formatted_description = format_description(description) with open(test_case_path, 'w', encoding='utf-8') as f: # write description f.write('\n') f.write(formatted_description) f.write('\n') # write the list of pages f.write('pages = {}\n'.format(format_page_object_string(page_objects))) f.write('\n') # write the setup function f.write('def setup(data):\n') if test_steps['setup']: for step in test_steps['setup']: parameters_formatted = format_parameters(step, root_path, project, setup_stored_keys) f.write(' {0}({1})\n' .format(step['action'].replace(' ', '_'), parameters_formatted)) else: f.write(' pass\n') f.write('\n') # write the test function f.write('def test(data):\n') if test_steps['test']: for step in test_steps['test']: parameters_formatted = format_parameters(step, root_path, project, test_stored_keys) f.write(' {0}({1})\n' .format(step['action'].replace(' ', '_'), parameters_formatted)) else: f.write(' pass\n') f.write('\n\n') # write the teardown function f.write('def teardown(data):\n') if test_steps['teardown']: for step in test_steps['teardown']: parameters_formatted = format_parameters(step, root_path, project, teardown_stored_keys) f.write(' {0}({1})\n' .format(step['action'].replace(' ', '_'), parameters_formatted)) else: f.write(' pass\n')
def get_test_tags(project, full_test_case_name): result = [] tc_name, parents = utils.separate_file_from_parents(full_test_case_name) path = os.path.join(session.testdir, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(tc_name)) test_module, _ = utils.import_module(path) if hasattr(test_module, 'tags'): result = getattr(test_module, 'tags') return result
def save_page_object_code(root_path, project, full_page_name, content): """Save a Page Object given it's full code as a string. full_page_name must be a dot path starting from /project/pages/ directory. content must be the file content as string """ page_name, parents = utils.separate_file_from_parents(full_page_name) page_path = os.path.join(root_path, 'projects', project, 'pages', os.sep.join(parents), '{}.py'.format(page_name)) with open(page_path, 'w', encoding='utf-8') as po_file: po_file.write(content)
def generate_test_case_excel_path(root_path, project, full_test_case_name): """Generate full path to a python file of a test case. full_test_case_name must be a dot path starting from /tests/ dir. Example: generate_test_case_path('/', 'project1', 'module1.test1') -> '/projects/project1/testcaseExcel/module1/test1' """ tc_name, parents = utils.separate_file_from_parents(full_test_case_name) test_case_excel_path = os.path.join(root_path, 'projects', project, 'testcaseExcel', os.sep.join(parents)) return test_case_excel_path, tc_name
def suite_exists(project, full_suite_name): """suite exists. full_suite_name must be a relative dot path """ suite_folder = os.path.join(session.testdir, 'projects', project, 'suites') suite, parents = utils.separate_file_from_parents(full_suite_name) path = os.path.join(suite_folder, os.sep.join(parents), '{}.py'.format(suite)) if os.path.isfile(path): return True path = os.path.join(suite_folder, full_suite_name) return os.path.isfile(path)
def get_external_test_data(project, full_test_case_name): """Get data from file (csv).""" data_list = [] test, parents = utils.separate_file_from_parents(full_test_case_name) data_file_path = os.path.join(session.testdir, 'projects', project, 'tests', os.sep.join(parents), '{}.csv'.format(test)) if os.path.isfile(data_file_path): with open(data_file_path, 'r', encoding='utf8') as csv_file: dict_reader = csv.DictReader(csv_file) for data_set in dict_reader: data_list.append(dict(data_set)) return data_list
def test_case_code_view(project, test_case_name): # check if user has permissions for this project if not user.has_permissions_to_project(g.user.id, project, root_path, 'gui'): return render_template('not_permission.html') tc_name, parents = utils.separate_file_from_parents(test_case_name) test_case_contents = test_case.get_test_case_content(project, test_case_name) test_data = utils.get_test_data_dict_list(root_path, project, test_case_name) return render_template('test_case_code.html', project=project, test_case_contents=test_case_contents, test_case_name=tc_name, full_test_case_name=test_case_name, test_data=test_data)
def remove_csv_if_exists(root_path, project, full_test_case_name): """remove csv data file from /data/ folder and from /tests/ folder""" tc_name, parents = utils.separate_file_from_parents(full_test_case_name) data_file_path_data_folder = os.path.join(root_path, 'projects', project, 'data', os.sep.join(parents), '{}.csv'.format(tc_name)) data_file_path_tests_folder = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents), '{}.csv'.format(tc_name)) if os.path.isfile(data_file_path_data_folder): os.remove(data_file_path_data_folder) if os.path.isfile(data_file_path_tests_folder): os.remove(data_file_path_tests_folder)
def remove_csv_if_exists(root_path, project, full_test_case_name): """Remove csv data file from /data/ folder and from /tests/ folder""" tc_name, parents = utils.separate_file_from_parents(full_test_case_name) data_file_path_data_folder = os.path.join(root_path, 'projects', project, 'data', os.sep.join(parents), '{}.csv'.format(tc_name)) data_file_path_tests_folder = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents), '{}.csv'.format(tc_name)) if os.path.isfile(data_file_path_data_folder): os.remove(data_file_path_data_folder) if os.path.isfile(data_file_path_tests_folder): os.remove(data_file_path_tests_folder)
def save_test_data(root_path, project, full_test_case_name, test_data): if test_data[0]: tc_name, parents = utils.separate_file_from_parents(full_test_case_name) data_path = os.path.join(root_path, 'projects', project, 'data', os.sep.join(parents), '{}.csv'.format(tc_name)) with open(data_path, 'w') as f: writer = csv.DictWriter(f, fieldnames=test_data[0].keys(), lineterminator='\n') writer.writeheader() for row in test_data: writer.writerow(row)
def test_file_path(project, full_test_case_name, testdir=None): """Generate full path to a python file of a test case. full_test_case_name must be a dot path starting from /tests/ dir. Example: test_file_path('project1', 'module1.test1') -> '/projects/project1/tests/module1/test1.py' """ testdir = testdir or session.testdir tc_name, parents = utils.separate_file_from_parents(full_test_case_name) test_case_path = os.path.join(testdir, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(tc_name)) return test_case_path
def test_case_exists(project, full_test_case_name): """Test case exists. full_test_case_name is a relative dot path to the test. """ # TODO test, parents = utils.separate_file_from_parents(full_test_case_name) tests_folder = os.path.join(session.testdir, 'projects', project, 'tests') path = os.path.join(tests_folder, os.sep.join(parents), '{}.py'.format(test)) if os.path.isfile(path): return True else: path = os.path.join(tests_folder, full_test_case_name) return os.path.isfile(path)
def test_case_code_view(project, test_case_name): test_exists = test_case.test_case_exists(project, test_case_name) if not test_exists: abort(404, 'The test {} does not exist'.format(test_case_name)) tc_name, parents = utils.separate_file_from_parents(test_case_name) path = os.path.join(session.testdir, 'projects', project, 'tests', os.sep.join(parents), tc_name + '.py') test_case_contents = test_case.get_test_case_code(path) _, error = utils.import_module(path) external_data = test_data_module.get_external_test_data(project, test_case_name) test_data_setting = session.settings['test_data'] return render_template('test_builder/test_case_code.html', project=project, test_case_contents=test_case_contents, test_case_name=tc_name, full_test_case_name=test_case_name, test_data=external_data, test_data_setting=test_data_setting, error=error)
def save_suite(root_path, project, suite_name, test_cases, workers, browsers, environments): """Save suite content to file.""" suite_name, parents = utils.separate_file_from_parents(suite_name) suite_path = os.path.join(root_path, 'projects', project, 'suites', os.sep.join(parents), '{}.py'.format(suite_name)) with open(suite_path, 'w', encoding='utf-8') as suite_file: suite_file.write('\n\n') suite_file.write('browsers = {}\n'.format(_format_list_items(browsers))) suite_file.write('\n') suite_file.write('environments = {}\n'.format(_format_list_items(environments))) suite_file.write('\n') suite_file.write('workers = {}'.format(workers)) suite_file.write('\n\n') suite_file.write('tests = {}\n'.format(_format_list_items(test_cases)))
def save_test_data(root_path, project, full_test_case_name, test_data): if test_data[0]: tc_name, parents = utils.separate_file_from_parents(full_test_case_name) data_directory_path = os.path.join(root_path, 'projects', project, 'data', os.sep.join(parents)) data_file_path = os.path.join(data_directory_path, '{}.csv'.format(tc_name)) # if the data file does not exist, create it if not os.path.exists(data_directory_path): os.makedirs(data_directory_path) if not os.path.isfile(data_file_path): open(data_file_path, 'w+').close() with open(data_file_path, 'w') as data_file: writer = csv.DictWriter(data_file, fieldnames=test_data[0].keys(), lineterminator='\n') writer.writeheader() for row in test_data: writer.writerow(row)
def save_test_case(root_path, project, full_test_case_name, description, page_objects, test_steps): tc_name, parents = utils.separate_file_from_parents(full_test_case_name) print 'pos', page_objects test_case_path = os.path.join(root_path, 'projects', project, 'test_cases', os.sep.join(parents), '{}.py'.format(tc_name)) with open(test_case_path, 'w') as f: f.write('from golem.core.test import Test\n') f.write('from golem.core.actions import *\n') f.write('from golem.core import execution_logger as logger\n') f.write('\n') f.write('# page objects\n') for po in page_objects: f.write(format_page_object_import_string(project, po)) f.write('\n') f.write('\n') f.write('class {}:\n'.format(tc_name)) f.write('\n') f.write(' description = \'\'\'{}\'\'\'\n'.format(description)) f.write('\n') f.write(' def setup(self):\n') f.write(' logger.description = self.description\n') f.write(' pass\n') f.write('\n') f.write(' def test(self, data):\n') if test_steps: for step in test_steps: f.write(' {0}({1})\n'.format( step['action'].replace(' ', '_'), format_parameters( step['parameters'], root_path, project, parents, tc_name))) else: f.write(' pass\n') f.write('\n') f.write(' def teardown(self):\n') f.write(' close()\n')
def test_case_code_view(project, test_case_name): # check if user has permissions for this project if not user.has_permissions_to_project(g.user.id, project, root_path, 'gui'): return render_template('not_permission.html') tc_name, parents = utils.separate_file_from_parents(test_case_name) path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents), tc_name + '.py') test_case_contents = test_case.get_test_case_code(path) error = utils.validate_python_file_syntax(path) external_data = test_data_module.get_external_test_data(root_path, project, test_case_name) test_data_setting = test_execution.settings['test_data'] return render_template('test_builder/test_case_code.html', project=project, test_case_contents=test_case_contents, test_case_name=tc_name, full_test_case_name=test_case_name, test_data=external_data, test_data_setting=test_data_setting, error=error)
def save_page_object(root_path, project, full_page_name, elements, functions, import_lines): page_name, parents = utils.separate_file_from_parents(full_page_name) page_object_path = os.path.join(root_path, 'projects', project, 'pages', os.sep.join(parents), '{}.py'.format(page_name)) with open(page_object_path, 'w', encoding='utf-8') as po_file: for line in import_lines: po_file.write("{}\n".format(line)) for element in elements: # replace the spaces with underlines of the element name if ' ' in element['name']: element['name'] = element['name'].replace(' ', '_') element['value'] = element['value'].replace('"', '\\"').replace("'", "\\'") po_file.write("\n\n{0} = ('{1}', \'{2}\', '{3}')".format(element['name'], element['selector'], element['value'], element['display_name'])) for func in functions: po_file.write('\n\n' + func)
def save_external_test_data_file(root_path, project, full_test_case_name, test_data): tc_name, parents = utils.separate_file_from_parents(full_test_case_name) data_file_path_data_folder = os.path.join(root_path, 'projects', project, 'data', os.sep.join(parents), '{}.csv'.format(tc_name)) data_path_tests_folder = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents)) data_file_path_tests_folder = os.path.join(data_path_tests_folder, '{}.csv'.format(tc_name)) # if csv file exists in /data/ use this file # remove csv file from /tests/ folder if it exists if os.path.isfile(data_file_path_data_folder): with open(data_file_path_data_folder, 'w') as data_file: if test_data: writer = csv.DictWriter(data_file, fieldnames=test_data[0].keys(), lineterminator='\n') writer.writeheader() for row in test_data: writer.writerow(row) else: data_file.write('') # remove csv from /tests/ folder if it exists if os.path.isfile(data_file_path_tests_folder): os.remove(data_file_path_tests_folder) # TODO deprecate /data/ folder print(('Warning: data files defined in the /data/ folder will soon ' 'be deprecated. Test data files should be placed in the same folder ' 'as the test file.')) else: # else, update or create a csv file in /tests/ folder if os.path.isfile(data_file_path_tests_folder) or test_data: # update data file only if it already exists or there's data os.makedirs(data_path_tests_folder, exist_ok=True) with open(data_file_path_tests_folder, 'w') as data_file: if test_data: writer = csv.DictWriter(data_file, fieldnames=test_data[0].keys(), lineterminator='\n') writer.writeheader() for row in test_data: writer.writerow(row) else: data_file.write('')
def get_page_object_elements(root_path, project, full_po_name): po, parents = utils.separate_file_from_parents(full_po_name) print 'AAA', 'projects.{0}.pages.{1}'.format(project, full_po_name) modulex = importlib.import_module('projects.{0}.pages.{1}' .format(project, full_po_name)) variable_list = [item for item in dir(modulex) if not item.startswith("__")] element_list = [] for var in variable_list: var_values = getattr(modulex, var) new_element = { 'element_name': var, 'element_selector': var_values[0], 'element_value': var_values[1], 'element_display_name': var_values[2], 'element_full_name': ''.join([full_po_name, '.', var]) } element_list.append(new_element) return element_list
def get_external_test_data(workspace, project, full_test_case_name): data_list = [] test, parents = utils.separate_file_from_parents(full_test_case_name) data_file_path_data_folder = os.path.join(workspace, 'projects', project, 'data', os.sep.join(parents), '{}.csv'.format(test)) data_file_path_test_folder = os.path.join(workspace, 'projects', project, 'tests', os.sep.join(parents), '{}.csv'.format(test)) # check if csv file exists in /data/ folder if os.path.isfile(data_file_path_data_folder): with open(data_file_path_data_folder, 'r', encoding='utf8') as csv_file: dict_reader = csv.DictReader(csv_file) for data_set in dict_reader: d = {} for item in data_set.items(): try: d[item[0]] = literal_eval(item[1]) except: d[item[0]] = item[1] data_list.append(d) # TODO deprecate /data/ folder print(('Warning: data files defined in the /data/ folder will soon ' 'be deprecated. Test data files should be placed in the same folder ' 'as the test file.')) # check if csv file exists in /tests/ folder elif os.path.isfile(data_file_path_test_folder): with open(data_file_path_test_folder, 'r', encoding='utf8') as csv_file: dict_reader = csv.DictReader(csv_file) for data_set in dict_reader: d = {} for item in data_set.items(): try: d[item[0]] = literal_eval(item[1]) except: d[item[0]] = item[1] data_list.append(d) return data_list
def test_case_view(project, test_case_name): # check if user has permissions for this project if not user.has_permissions_to_project(g.user.id, project, root_path): return render_template('not_permission.html') tc_name, parents = utils.separate_file_from_parents(test_case_name) test_case_data = test_case.parse_test_case( root_path, project, parents, tc_name) test_data = utils.get_test_data(root_path, project, test_case_name) return render_template( 'test_case.html', project=project, test_case_data=test_case_data, test_case_name=tc_name, full_test_case_name=test_case_name, test_data=test_data)
def save_page_object_code(root_path, project, full_page_name, content): page_name, parents = utils.separate_file_from_parents(full_page_name) page_path = os.path.join(root_path, 'projects', project, 'pages', os.sep.join(parents), '{}.py'.format(page_name)) with open(page_path, 'w', encoding='utf-8') as po_file: po_file.write(content)
def generate_test_case_path(root_path, project, full_test_case_name): tc_name, parents = utils.separate_file_from_parents(full_test_case_name) test_case_path = os.path.join(root_path, 'projects', project, 'tests', os.sep.join(parents), '{}.py'.format(tc_name)) return test_case_path
def generate_page_path(root_path, project, full_page_name): page_name, parents = utils.separate_file_from_parents(full_page_name) page_path = os.path.join(root_path, 'projects', project, 'pages', os.sep.join(parents), '{}.py'.format(page_name)) return page_path