def autoRun(): reportname = pathutil( ).rootPath + "/Output/Report/Test Report_Build" + time.strftime( '%Y%m%d', time.localtime(time.time())) + ".html" log = Logger(level="debug").logger log.info('\n========================' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '========================') tset_suite = unittest.TestLoader().loadTestsFromTestCase(Case) with open(reportname, "wb") as report: runner = HTMLTestRunner(stream=report, title=u"测试报告", description=u"用例测试情况") runner.run(tset_suite)
class ToConsleLogger(object): # 定义常量 module_path = path.pathutil().rootPath logpath = module_path + '\\Output\\Log\\RunLog' + time.strftime( '%Y%m%d', time.localtime(time.time())) + '.log' # 日志级别关系映射 level_relations = { "debug": logging.DEBUG, "info": logging.INFO, "warning": logging.WARNING, "error": logging.ERROR, "critical": logging.CRITICAL } streamHandler = logging.StreamHandler() def __init__(self, filename=logpath, level="info", fmt="%(message)s"): format_str = logging.Formatter(fmt) self.logger = logging.getLogger(filename) # 设置日志输出文件 self.streamHandler.setFormatter(format_str) self.logger.addHandler(self.streamHandler) # 设置日志级别 self.logger.setLevel(self.level_relations.get(level)) def debug(self, message): self.fontColor('\033[32m%s\033[0m') self.logger.debug(message) def info(self, message): self.fontColor('\033[34m%s\033[0m') self.logger.info(message) def warning(self, message): self.fontColor('\033[37m%s\033[0m') self.logger.warning(message) def error(self, message): self.fontColor('\033[31m%s\033[0m') self.logger.error(message) def critical(self, message): self.fontColor('\033[35m%s\033[0m') self.logger.critical(message) def fontColor(self, color): # 不同的日志输出不同的颜色 formatter = logging.Formatter(color % '%(message)s') self.streamHandler.setFormatter(formatter) self.logger.addHandler(self.streamHandler)
def testcase(self, data): text = '' log().info(str(data[list(data.keys())[0]]) + "-开始") if data["操作类型"] == "等待": time.sleep(int(data["输入数据"])) else: text = self.action.pre_do(data) if data["操作类型"] == "断言": log().info("断言:"+ str(data[list(data.keys())[0]])) if text != data["输入数据"]: log().info("断言截图:" + str(data[list(data.keys())[0]])) self.action.driver.save_png(path.pathutil().rootPath + '/Output/Resources/'+data['用例编号']+'.jpg') self.assertEqual(text, data["输入数据"]) log().info(str(data[list(data.keys())[0]]) + "-结束")
def do_action(self, data): try: Positioning_type = GAD().checkIfExists( self.datatypemenu[0], data["操作元素"])[0].split("By.") Positioning_value = GAD().checkIfExists(self.datatypemenu[0], data["操作元素"])[1] input_data = GAD().checkIfExists(self.datatypemenu[1], data["输入数据"]) if data["操作类型"] == "断言": text = self.driver.get_element(Positioning_type + '=>' + Positioning_value).text return text if data["操作类型"] == "打开": self.driver.open(input_data) if data["操作类型"] == "点击": self.driver.click(Positioning_type + '=>' + Positioning_value) if data["操作类型"] == "清除": self.driver.clear(Positioning_type + '=>' + Positioning_value) # if data["动作"] == "等待": # self.driver.wait(int(data["输入值"])) if data["操作类型"] == "输入": self.driver.type(Positioning_type + '=>' + Positioning_value, input_data) if data["操作类型"] == "滚动条下拉": self.driver.js("var q=document.body.scrollTop=" + input_data + ";") if data["操作类型"] == "等待元素": self.driver.element_wait( Positioning_type + '=>' + Positioning_value, 10) if data["操作类型"] == "最大化": self.driver.max_window() if data["操作类型"] == "关闭浏览器": self.driver.close() except Exception as e: log().error("异常截图-" + data["操作类型"] + str(e)) self.driver.save_png(path.pathutil().rootPath + '/Output/Resources/' + data['用例编号'] + '.jpg')
@Modify Time | @Author |@Version --------------------|--------------|-------- 2020/5/26 0026-20:35| GeminiJayson | V0.0.1 """ import os import xlrd import xlutils from xlutils.copy import copy import Src.BasicRef.pathUtil as path # 定义常量 module_path = path.pathutil().rootPath config_excel_path = '/Config/testCFG.xls' def setOutCell(outSheet, col, row, value): """ :param outSheet: :param col: :param row: :param value: :func : Change cell value without changing formatting. :return: """ def _getOutCell(outSheet, colIndex, rowIndex): """ HACK: Extract the internal xlwt cell representation. """
class runTestCase(object): log = Logger(level="debug").logger toFileLog = Logger(level="debug") module_path = path.pathutil().rootPath imagepath = '' datatypemenu = ['ElementsInfo', 'InputData', 'OutputData'] browser = webdriver.Chrome() urlReg = re.compile( r'^(?:http|ftp)s?://' # http:// or https:// r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain... r'localhost|' # localhost... r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip r'(?::\d+)?' # optional port r'(?:/?|[/?]\S+)$', re.IGNORECASE) def __init__(self): self.switch = { "打开": lambda casedealinfoDic, ifrerun: self.test_open( casedealinfoDic, ifrerun), "点击": lambda casedealinfoDic, ifrerun: self.test_click( casedealinfoDic, ifrerun), "输入": lambda casedealinfoDic, ifrerun: self.test_input( casedealinfoDic, ifrerun), "清除": lambda casedealinfoDic, ifrerun: self.test_clear( casedealinfoDic, ifrerun), "等待": lambda casedealinfoDic, ifrerun: self.test_wait( casedealinfoDic, ifrerun), "断言": lambda casedealinfoDic, ifrerun: self.test_assertion( casedealinfoDic, ifrerun), "引入": lambda casedealinfoDic, ifrerun: self.test_introduce( casedealinfoDic, ifrerun), "最大化": lambda casedealinfoDic, ifrerun: self.test_maximize( casedealinfoDic, ifrerun) } # 定义一个保存截图函数 def save_img(self, img_name): self.imagepath = self.module_path + '/Output/Resources/' + img_name + '.png' self.browser.get_screenshot_as_file(self.imagepath) # 启动函数,每个用例测试前,都会执行该函数 def setUp(self, url): self.starttime = parse( time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) self.browser.set_window_size(1920, 1080) print("开始测试时间:", self.starttime) self.browser.get(url) #time.sleep(3) # 结束函数,每个用例测试结束后,都会执行该函数 def tearDown(self): #time.sleep(3) self.browser.quit() self.endtime = parse( time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) print("测试结束时间:", self.endtime) totaltime = (self.endtime - self.starttime).total_seconds() print("总时长:", totaltime, "秒") def switchRun(self, casedealinfoDic): ifrerun = False if casedealinfoDic[1][0] is not None: if self.urlReg.match(DPD.getAllData().checkIfExists( self.datatypemenu[1], casedealinfoDic[1][0])): ifrerun = True try: self.switch[casedealinfoDic[1][2]](casedealinfoDic, ifrerun) except KeyError as e: self.log(e) def test_open(self, casedealinfoDic, ifrerun): if ifrerun == True: self.setUp(DPD.getAllData().checkIfExists(self.datatypemenu[1], casedealinfoDic[1][0])) self.save_img(casedealinfoDic[0]) self.tearDown() def test_click(self, casedealinfoDic, ifrerun): pass def test_input(self, casedealinfoDic, ifrerun): pass def test_clear(self, casedealinfoDic, ifrerun): pass def test_wait(self, casedealinfoDic, ifrerun): pass def test_assertion(self, casedealinfoDic, ifrerun): pass def test_introduce(self, casedealinfoDic, ifrerun): pass def test_maximize(self, casedealinfoDic, ifrerun): pass
class Logger(object): # 定义常量 module_path = path.pathutil().rootPath logpath = module_path + '\\Output\\Log\\RunLog' + time.strftime( '%Y%m%d', time.localtime(time.time())) + '.log' # 日志级别关系映射 level_relations = { "debug": logging.DEBUG, "info": logging.INFO, "warning": logging.WARNING, "error": logging.ERROR, "critical": logging.CRITICAL } streamHandler = logging.StreamHandler() def __init__(self, filename=logpath, level="info", when="D", backupCount=3, fmt="%(message)s"): # 设置日志输出格式 format_str = logging.Formatter(fmt) # 设置日志输出文件 self.logger = logging.getLogger(filename) if not self.logger.handlers: # 设置控制台中输出日志格式 self.streamHandler.setFormatter(format_str) # 设置日志输出到文件(指定间隔时间自动生成文件的处理器 --按日生成) # filename:日志文件名,interval:时间间隔,when:间隔的时间单位, backupCount:备份文件个数,若超过这个数就会自动删除 fileHandler = handlers.TimedRotatingFileHandler( filename=filename, when=when, backupCount=backupCount, encoding="utf-8") # 设置日志文件中的输出格式 fileHandler.setFormatter(format_str) # 设置日志级别 self.logger.setLevel(self.level_relations.get(level)) self.logger.addHandler(fileHandler) self.logger.addHandler(self.streamHandler) def M_info(self, i_line, str_actualResult, str_examinedField, str_expected_value, str_actualValue, str_stepResult, str_scriptNote): self.logger.info('【' + str(i_line) + '】===>' + str_actualResult) self.logger.info(str_examinedField) self.logger.info(str_expected_value) self.logger.info(str_actualValue) self.logger.info(str_stepResult) self.logger.info('#script_note#' + str_scriptNote) def debug(self, message): self.fontColor('\033[32m%s\033[0m') self.logger.debug(message) def info(self, message): """ :rtype: object """ self.fontColor('\033[34m%s\033[0m') self.logger.info(message) def warning(self, message): self.fontColor('\033[37m%s\033[0m') self.logger.warning(message) def error(self, message): self.fontColor('\033[31m%s\033[0m') self.logger.error(message) def critical(self, message): self.fontColor('\033[35m%s\033[0m') self.logger.critical(message) def fontColor(self, color): # 不同的日志输出不同的颜色 formatter = logging.Formatter(color % '%(message)s') self.streamHandler.setFormatter(formatter) self.logger.addHandler(self.streamHandler)