def __init__(self, i=0, install_flag=None): write_file = WriteUserConfig() self.device = write_file.get_value('device' + str(i), 'deviceName') self.port = write_file.get_value('device' + str(i), 'port') read = ReadIni(conftest.env_dir) self.env_flag = read.get_value('noReset_flag_android', 'caps') if install_flag is 'yes': self.apk_dir = conftest.apk_path else: self.apk_dir = read.get_value('apk_dir', 'app')
def __init__(self): # 实例化ReadIni类的一个对象 self.read_ini = ReadIni() # 通过调用read_ini的指定方法获得excel的数据 self.excel_data = self.read_ini.get_excel_path() # 通过调用read_ini的指定方法获得参数的json数据路径 self.params_data_path = self.read_ini.get_params_json_path() # 通过调用read_ini的指定方法获得期望结果的json数据路径 self.exception_data_path = self.read_ini.get_exception_json_path() # 通过openpyxl的load_workbook方法实例化一个workbook对象 self.wb = openpyxl.load_workbook(self.excel_data) # 通过workbook对象本质是一个字典 通过表名key去 获得一个worksheet对象 通过readini的getsheet方法获得ini文件中的键名 也就是key self.ws = self.wb[self.read_ini.get_sheet_name()]
def test_useadd_failed(self, username, realname, password, confirm_password, email, expectation, prompt_selector, case_number, current_test_module): try: # 添加失败动作 self.useadd_test.useradd(username, realname, password, confirm_password, email) # 断言动作 获取弹出的提示窗的文本 actual_prompt_text = self.useadd_test.get_text(prompt_selector, wait=30) # 断言 实际提示窗文本与期望文本对比 self.assertTrue(expectation == actual_prompt_text, '实际提示窗文本与期望文本不相等') except: tt = time.strftime('%Y-%m-%d-%H:%M:%S') self.useadd_test.get_screenshot_as_file( ReadIni().get_screen_shot_path() + "screenshot—-{}-{}-{}.png".format(current_test_module, case_number, tt)) # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志 self.current_logging.error("{}第{}用例出现错误,请排查".format( current_test_module, case_number)) raise AssertionError('{}第{}条用例出错了快去查看'.format( current_test_module, case_number)) finally: self.useadd_test.chick_out_useadd()
def test_useadd_succeed(self, username, realname, password, confirm_password, email, expectation, case_number, current_test_module): ''' :param username: 用户名称 :param realname: 用户真实姓名 :param password: 用户密码 :param confirm_password:再次确认密码 :param email: 用户邮箱 :param expectation: 期望用户名 :return: ''' try: # 添加成功动作 self.useadd_test.useradd(username, realname, password, confirm_password, email) # 断言动作 获取最后一个数据的用户姓名文本 actual_text = self.useadd_test.get_user_text() # 断言 实际用户姓名文本与输出用户姓名文本对比 self.assertEqual(expectation, actual_text, '实际用户姓名与期望用户姓名不一致') except: tt = time.strftime('%Y-%m-%d-%H:%M:%S') self.useadd_test.get_screenshot_as_file( ReadIni().get_screen_shot_path() + "screenshot—{}-{}-{}.png".format(current_test_module, case_number, tt)) # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志 self.current_logging.error("{}第{}用例出现错误,请排查".format( current_test_module, case_number)) raise AssertionError('{}}第{}条用例出错了快去查看'.format( current_test_module, case_number))
def setup_module(): # 必须使用@classmethod 装饰器,所有test运行前运行一次 global operation, driver, read # 调用get_driver read = ReadIni(conftest.userinfo_dir) base_driver = BaseDriver() driver = base_driver.android_driver() # 实例化Operation operation = Operation(driver) print('[MyLog]--------OPERATION is inited NOW')
def setUpClass(cls): # 必须使用@classmethod 装饰器,所有test运行前运行一次 global operation, driver, read # 调用get_driver read = ReadIni(conftest.userinfo_dir) server = Server() server.main('android') base_driver = BaseDriver() driver = base_driver.android_driver() # 实例化Operation operation = Operation(driver)
def __init__(self, run_type='run_test_classname', report_type='tr1', mode_parameter=Login_Test, email_title='email标题', report_title='测试报告标题', report_tester='Jakiro', report_desc='测试描述', report_name='report-{}.html'): # 找到测试用例的路径 self.case_path = ReadIni().get_case_path() # 生成报告路径 tt = time.strftime('%Y-%m-%d-%H-%M-%S') self.report_path = ReadIni().get_report_path() + report_name.format(tt) # 报告类型 self.report_type = report_type # 用例加载类型 self.run_type = run_type # 用例加载方式类型 self.mode_parameter = mode_parameter # 邮件标题 self.email_title = email_title # 报告标题 self.report_title = report_title # 报告作者 self.report_tester = report_tester # 报告描述 self.report_desc = report_desc
def test_login_success(self, username, password, expectation, case_number, current_test_module): ''' 登录成功的用例 :param username: :param password: :param expectation: :param case_number: :return: ''' try: # 登录流程 self.login_test.login(username, password) # 断言,获取文本n # actual_name = self.login_test.get_login_success_text() # 打印文本获取成功 # self.current_logging.info('文本获取成功') # 通过数据库进行断言 actual_name = read_sql(expectation) # 断言失败时,才会报错 先填期望,再填实际 self.assertEqual(expectation, actual_name, '预期用户名与实际用户名结果不一致') except Exception as e: tt = time.strftime('%Y-%m-%d-%H-%M-%S') # print(tt,e) # 错误时调用base中的截图方法截图 # self.login_test.get_screenshot_as_file(r'C:\Users\Administrator\codes\test\project\ranzhi_project\result\screenshot\screenshot--{}.png'.format(tt)) self.login_test.get_screenshot_as_file( ReadIni().get_screen_shot_path() + "screenshot—-{}-{}-date-{}.png".format(current_test_module, case_number, tt)) # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志 self.current_logging.error("{}}第{}用例出现错误,请排查".format( current_test_module, case_number)) raise AssertionError("{}第{}用例出现错误,请排查".format( current_test_module, case_number)) # 如果不是AssertError 会报Error A 会报failed为么同步用例执行结果,一般用A finally: try: self.login_test.check_out() except Exception: self.login_test.click_login_failed_box_accept()
def test_login_failed(self, username, password, selector, expectation, case_number, current_test_module): ''' 登录失败的用例 :param username: 用户名 :param password: 密码 :param expectation: 期望结果 :return: ''' try: # 登录流程 self.login_test.login(username, password) # 断言,获取警告窗文本 # actual_alert_text = self.login_test.get_failed_alert_text() # 断言优化 actual_alert_text = self.login_test.get_text(selector, wait=20) # 断言,警告窗文本对比 # self.assertEqual(expectation, actual_alert_text, '预期用户名与实际用户名结果不一致') self.assertIn(expectation, actual_alert_text, '预期用户名与实际用户名结果不一致。。。') # self.assertTrue(expectation == actual_alert_text ) # 后面需要填入一个bowl值表达式 except: tt = time.strftime('%Y-%m-%d-%H:%M:%S') self.login_test.get_screenshot_as_file( ReadIni().get_screen_shot_path() + "screenshot—-{}-{}-date-{}.png".format(current_test_module, case_number, tt)) # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志 self.current_logging.error("{}第{}用例出现错误,请排查".format( current_test_module, case_number)) raise AssertionError('{}第{}条用例出错了快去查看'.format( current_test_module, case_number)) finally: self.login_test.click_login_failed_box_accept()
class Login_Test(unittest.TestCase): # succeed_data_excel = read_excel_data( # r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\login_data.xlsx', 'test_login_success') # failed_data_excel = read_excel_data( # r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\login_data.xlsx', 'test_login_failed') # succeed_data_yaml = read_yaml_data( # r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\test_data.yaml') # succeed_data_json = read_json_data(get_file_path(r'ranzhi_project/data_config/test_data.json')) # 通过ReadIni类获取实例路径 # succeed_data_excel = read_excel_data(ReadIni().get_excel_path(), 'test_login_success') login_data_json = read_json_data(ReadIni().get_json_path()) # 实例化logging对象 参数为当前文件路径 ttt = time.strftime('%Y-%m-%d-%H-%M-%S') current_test = 'login_test' current_logging = get_logging( ReadIni().get_logging_path() + 'logging-{}-{}.log'.format(current_test, ttt)) login_data_yaml = read_yaml_data(ReadIni().get_yaml_path()) # 通过setUp和tearDown固件进行用例配置 def setUp(self): self.login_test = Login_page('Chrome') # print(self.succeed_data_lists) def tearDown(self): self.login_test.quit() # 通过setUpClass和tearDownClass固件进行用例配置 # @classmethod # 需要加装饰器,把他继承的cls改为self 可以放前置条件 和连接数据库 # def setUpClass(self): # self.login_test = Login_page('Chrome') # # 连接数据库 # # @classmethod # def tearDownClass(self): # self.login_test.quit() @parameterized.expand(login_data_yaml['test_login_success']) # @parameterized.expand(succeed_data_excel) # @parameterized.expand(login_data_json['test_login_success']) # @parameterized.expand([[ # "9527258742", # "123456", # "李越川258742", # "2" # ], ]) def test_login_success(self, username, password, expectation, case_number, current_test_module): ''' 登录成功的用例 :param username: :param password: :param expectation: :param case_number: :return: ''' try: # 登录流程 self.login_test.login(username, password) # 断言,获取文本n # actual_name = self.login_test.get_login_success_text() # 打印文本获取成功 # self.current_logging.info('文本获取成功') # 通过数据库进行断言 actual_name = read_sql(expectation) # 断言失败时,才会报错 先填期望,再填实际 self.assertEqual(expectation, actual_name, '预期用户名与实际用户名结果不一致') except Exception as e: tt = time.strftime('%Y-%m-%d-%H-%M-%S') # print(tt,e) # 错误时调用base中的截图方法截图 # self.login_test.get_screenshot_as_file(r'C:\Users\Administrator\codes\test\project\ranzhi_project\result\screenshot\screenshot--{}.png'.format(tt)) self.login_test.get_screenshot_as_file( ReadIni().get_screen_shot_path() + "screenshot—-{}-{}-date-{}.png".format(current_test_module, case_number, tt)) # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志 self.current_logging.error("{}}第{}用例出现错误,请排查".format( current_test_module, case_number)) raise AssertionError("{}第{}用例出现错误,请排查".format( current_test_module, case_number)) # 如果不是AssertError 会报Error A 会报failed为么同步用例执行结果,一般用A finally: try: self.login_test.check_out() except Exception: self.login_test.click_login_failed_box_accept() # @parameterized.expand(failed_data_excel) @parameterized.expand(login_data_yaml['test_login_failed']) def test_login_failed(self, username, password, selector, expectation, case_number, current_test_module): ''' 登录失败的用例 :param username: 用户名 :param password: 密码 :param expectation: 期望结果 :return: ''' try: # 登录流程 self.login_test.login(username, password) # 断言,获取警告窗文本 # actual_alert_text = self.login_test.get_failed_alert_text() # 断言优化 actual_alert_text = self.login_test.get_text(selector, wait=20) # 断言,警告窗文本对比 # self.assertEqual(expectation, actual_alert_text, '预期用户名与实际用户名结果不一致') self.assertIn(expectation, actual_alert_text, '预期用户名与实际用户名结果不一致。。。') # self.assertTrue(expectation == actual_alert_text ) # 后面需要填入一个bowl值表达式 except: tt = time.strftime('%Y-%m-%d-%H:%M:%S') self.login_test.get_screenshot_as_file( ReadIni().get_screen_shot_path() + "screenshot—-{}-{}-date-{}.png".format(current_test_module, case_number, tt)) # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志 self.current_logging.error("{}第{}用例出现错误,请排查".format( current_test_module, case_number)) raise AssertionError('{}第{}条用例出错了快去查看'.format( current_test_module, case_number)) finally: self.login_test.click_login_failed_box_accept()
class ReadExcel(object): def __init__(self): # 实例化ReadIni类的一个对象 self.read_ini = ReadIni() # 通过调用read_ini的指定方法获得excel的数据 self.excel_data = self.read_ini.get_excel_path() # 通过调用read_ini的指定方法获得参数的json数据路径 self.params_data_path = self.read_ini.get_params_json_path() # 通过调用read_ini的指定方法获得期望结果的json数据路径 self.exception_data_path = self.read_ini.get_exception_json_path() # 通过openpyxl的load_workbook方法实例化一个workbook对象 self.wb = openpyxl.load_workbook(self.excel_data) # 通过workbook对象本质是一个字典 通过表名key去 获得一个worksheet对象 通过readini的getsheet方法获得ini文件中的键名 也就是key self.ws = self.wb[self.read_ini.get_sheet_name()] # 声明一个方法获得指定单元格的value def get_cell_value(self, row, column): # 通过ws对象的列行坐标找到对应的单元格 然后通过cell对象的,value属性获取指定单元格的值 return self.ws[column + str(row)].value # 声明一个方法获得用例编号 def get_case_id(self, row): # 通过ProjectConstant类的属性获得对应的常量值 # p#rint(type(ProjectConstant.CASE_ID)) return self.get_cell_value(row, ProjectConstant.CASE_ID) # 声明一个方法获得用例标题 def get_case_name(self, row): # 通过ProjectConstant类的属性获得对应的常量值 return self.get_cell_value(row, ProjectConstant.CASE_NAME) # 声明一个方法获得用例的请求方法 def get_case_method(self, row): # 通过ProjectConstant类的属性获得对应的常量值 return self.get_cell_value(row, ProjectConstant.REQUEST_METHOD) # 声明一个方法获得用例的请求的url def get_case_url(self, row): # 通过ProjectConstant类的属性获得对应的常量值 return self.get_cell_value(row, ProjectConstant.REQUEST_URL) # 声明一个方法获得用例请求的前置条件 def get_case_precondition_id(self, row): # 通过ProjectConstant类的属性获得对应的常量值 return self.get_cell_value(row, ProjectConstant.PRECONDITION_ID) # 声明一个方法获得用例请求的依赖字段 def get_case_depend_field(self, row): # 通过ProjectConstant类的属性获得对应的常量值 return self.get_cell_value(row, ProjectConstant.DEPEND_FIELD) # 声明一个方法获得用例执行需要的正则表达式 def get_case_regular_expression(self, row): # 通过ProjectConstant类的属性获得对应的常量值 return self.get_cell_value(row, ProjectConstant.REGULAR_EXPRESSION) # 声明一个方法或的用例执行需要的参数的key def get_case_parameters_key(self, row): # 通过ProjectConstant类的属性获得对应的常量值 return self.get_cell_value(row, ProjectConstant.REQUEST_PARAMETERS) # 声明一个方法或的用例执行的预期结果的key def get_case_expected_outcome_key(self, row): # 通过ProjectConstant类的属性获得对应的常量值 return self.get_cell_value(row, ProjectConstant.EXPECTED_OUTCOME) # 声明一个方法获得用例执行需要参数的值 def get_case_parameters_value(self, row): # 通过read_json方法获得指定json文件,然后根据key获得请求所需参数的值 if self.get_case_parameters_key(row): return read_json( self.params_data_path)[self.get_case_parameters_key(row)] # 声明一个方法获得用例执行的期望结果的值 def get_case_expected_outcome_value(self, row): # 通过read_json方法获得指定json文件,然后根据key获得期望结果的value if self.get_case_expected_outcome_key(row): return read_json(self.exception_data_path)[ self.get_case_expected_outcome_key(row)] # 声明一个方法获得用例执行的响应数据类型 def get_case_response_data_type(self, row): # print(self.get_cell_value(row,ProjectConstant.RESPONSE_DATA_TYPE)) return self.get_cell_value(row, ProjectConstant.RESPONSE_DATA_TYPE) # 声明一个方法 获得用例是否执行参数 def get_case_if_execute(self, row): return self.get_cell_value(row, ProjectConstant.CASE_IF_EXECUTE) # 声明一个方法获取excel的行数 def get_row_count(self): # 通过work_sheet对象的max_row属性 获得行数 return self.ws.max_row # 声明一个方法获取excel的列数 def get_column_count(self): # 通过work_sheet对象的max_column属性 获得列数 return self.ws.max_column
class useadd_test(unittest.TestCase): # succeed_add_user_data = read_excel_data( # r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\useradd_data.xlsx', 'useadd_success') # failed_add_user_data = read_excel_data( # r'C:\Users\Administrator\codes\test\project\ranzhi_project\data_config\useradd_data.xlsx', 'useadd_failed') # 获得用户添加的yaml文件 useadd_yaml_data = read_yaml_data(ReadIni().get_yaml_path()) # 实例化logging类,获得日志生成路径 日志名为当前用例执行时间 ttt = time.strftime('%Y-%m-%d-%H-%M-%S') current_test = 'useadd' current_logging = get_logging( ReadIni().get_logging_path() + 'logging-{}-{}.log'.format(current_test, ttt)) @classmethod def setUpClass(self): # 登录动作 实例化类 self.useadd_test = Useradd_page('Chrome') def setUp(self): self.useadd_test.login('admin', '123456') # def tearDown(self): # self.useadd_test.chick_out_useadd() def tearDownClass(self): self.useadd_test.quit() # @parameterized.expand(succeed_add_user_data) # 参数化数据格式化 # @parameterized.expand([('jakiro', '邱杰', '123456', '123456', '@qq.com', 'Jakiro')]) # 通过yaml_data进行数据驱动 @parameterized.expand(useadd_yaml_data['useadd_success']) def test_useadd_succeed(self, username, realname, password, confirm_password, email, expectation, case_number, current_test_module): ''' :param username: 用户名称 :param realname: 用户真实姓名 :param password: 用户密码 :param confirm_password:再次确认密码 :param email: 用户邮箱 :param expectation: 期望用户名 :return: ''' try: # 添加成功动作 self.useadd_test.useradd(username, realname, password, confirm_password, email) # 断言动作 获取最后一个数据的用户姓名文本 actual_text = self.useadd_test.get_user_text() # 断言 实际用户姓名文本与输出用户姓名文本对比 self.assertEqual(expectation, actual_text, '实际用户姓名与期望用户姓名不一致') except: tt = time.strftime('%Y-%m-%d-%H:%M:%S') self.useadd_test.get_screenshot_as_file( ReadIni().get_screen_shot_path() + "screenshot—{}-{}-{}.png".format(current_test_module, case_number, tt)) # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志 self.current_logging.error("{}第{}用例出现错误,请排查".format( current_test_module, case_number)) raise AssertionError('{}}第{}条用例出错了快去查看'.format( current_test_module, case_number)) # 通过yaml文件进行数据驱动 key值为useadd_failed @parameterized.expand(useadd_yaml_data['useadd_failed']) def test_useadd_failed(self, username, realname, password, confirm_password, email, expectation, prompt_selector, case_number, current_test_module): try: # 添加失败动作 self.useadd_test.useradd(username, realname, password, confirm_password, email) # 断言动作 获取弹出的提示窗的文本 actual_prompt_text = self.useadd_test.get_text(prompt_selector, wait=30) # 断言 实际提示窗文本与期望文本对比 self.assertTrue(expectation == actual_prompt_text, '实际提示窗文本与期望文本不相等') except: tt = time.strftime('%Y-%m-%d-%H:%M:%S') self.useadd_test.get_screenshot_as_file( ReadIni().get_screen_shot_path() + "screenshot—-{}-{}-{}.png".format(current_test_module, case_number, tt)) # 错误时,通过实例化日志对象的.error方法,将后面的的message信息打印进日志,打印日志,并保存日志 self.current_logging.error("{}第{}用例出现错误,请排查".format( current_test_module, case_number)) raise AssertionError('{}第{}条用例出错了快去查看'.format( current_test_module, case_number)) finally: self.useadd_test.chick_out_useadd()
if type(sheets) == str: sheet_seq = [sheets] elif type(sheets) == list or type(sheets) == tuple: if sheets: sheet_seq = sheets else: sheet_seq = excel_data.sheetnames else: raise TypeError("输入的sheets不是可迭代对象,请输入字符串或列表或元组") for sheet in sheet_seq: get_sheet = excel_data[sheet] row_list = [] header_filter = True for row_tuple in get_sheet: if header_filter: header_filter = False continue row_list.append([str(cell.value) for cell in row_tuple]) # json_dict[sheet+'1'] = row_list json_dict[sheet] = row_list dict_to_json(json_path, json_dict) else: with open(json_path, mode='w', encoding='utf8') as fi: pass excel_to_json(excel_path, json_path) if __name__ == '__main__': json_path = 'testcase_data.json' excel_to_json(ReadIni().case_excel_abspath(), json_path)
# coding=utf-8 # @Time : 2019/9/6 14:38 # @Author : Mandy import os import shutil from datetime import datetime import requests import conftest from common.read_ini import ReadIni read = ReadIni(conftest.env_dir) url = read.get_value('download_url', 'app') filename = os.path.basename(url) filename = filename.split('?')[0] new_name = read.get_value('app_name', 'app') apk_path = os.path.join(conftest.apk_dir, filename) # def Schedule(a,b,c): # ''''' # a:已经下载的数据块 # b:数据块的大小 # c:远程文件的大小 # ''' # per = 100.0 * a * b / c # if per > 100: # per = 100 # print('%.2f%%' % per) # def run(): # # local = url.split('/')[-1] # local = os.path.join('/testapp', 'Python-2.7.5.tar.bz2')