def runCases(): reader = Reader() writer = Writer() http = HTTP(writer) reader.open_excle('../lib/cases/HTTP接口用例.xls') writer.copy_open('../lib/cases/HTTP接口用例.xls', '../lib/results/result-HTTP接口用例.xls') sheetname = writer.get_sheets() sheetname = reader.get_sheets() for sheet in sheetname: # 设置当前读写都是当前sheet页面 reader.set_sheet(sheet) writer.set_sheet(sheet) # 默认都写在第7列 writer.clo = 7 # 遍历读取所有的sheet页面的内容 for i in range(reader.rows): line = reader.readine() # 如果第一列或者第二列有内容,就是分组信息,不运行 if len(line[0]) > 0 or len(line[1]) > 0: pass else: print(line) writer.row = i func = getfunc(line, http) lenargs = getargs(func) run(func, lenargs, line) writer.save_close()
def getparams(self, path): # open_excel方法已有容错处理 r = Reader() r.open_excel(path) tup = self.__getpassrate(r) # logger.debug(tup) #获取总用例数 sum = tup[1] #获取通过率 passrate = tup[0] #获取测试结果 result = self.__getresult(passrate) self.sumarry['casecount'] = str(sum) self.sumarry['passrate'] = passrate self.sumarry['status'] = result return self.sumarry
def get_res(self, result_path): self.sumarry.clear() status = 'Fail' # 标志是否有 flag = True # 总用例数 totalcount = 0 # 总通过数 totalpass = 0 reader = Reader() reader.open_excel(result_path) for n in reader.get_sheets(): reader.set_sheet(n) row = reader.rows reader.r = 1 for i in range(1, row): line = reader.readline() logger.info(line) if not (line[0] == '' and line[1] == ''): pass else: if len(line) < 7 or line[7] == '': flag = False print('1' + str(flag)) else: totalcount = totalcount + 1 if line[7] == 'PASS': totalpass += 1 else: flag = False print('2' + str(flag)) if flag: status = 'PASS' try: p = int(totalpass * 10000 / totalcount) passrate = p / 100 except Exception as e: passrate = 0.0 logger.exception(e) self.sumarry['casecount'] = str(totalcount) self.sumarry['passrate'] = str(passrate) self.sumarry['status'] = status return self.sumarry
def runCase(): global casepath, resultpath r = Reader() w = Writer() r.open_excel(casepath) #打开表,默认为第一个sheet w.copy_open(casepath, resultpath) sheetname = r.get_sheets() #根据表格的配置,创建不同的对象,例如表中第2行第2个字段为WEB,即创建WEB()对象 way = r.getparameter('1', '1') if way == 'APP': obj = APP(None) elif way == 'HTTP': obj = HTTP(w) elif way == 'SOAP': obj = SOAP(w) elif way == 'WEB': obj = WEB() w.set_sheet(sheetname[0]) w.write(2, 3, str( datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) # StartTime for sheet in sheetname: #设置读写都是当前的sheet页面 r.set_sheet(sheet) w.set_sheet(sheet) w.clo = 7 #写入的列数以固定,所以设置列数为第8列,!第一列为0 for i in range(r.rows): line = r.readline() w.row = i #读到第几行就写入第几行 print(line) if len(line[0]) > 0 or len(line[1]) > 0: continue else: # 接口类型设置2 func = get_func(obj, line) L = get_args(func) run(func, L, line) w.set_sheet(sheetname[0]) w.write(2, 4, str( datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) #EndTime w.save_close()
def runCases(): http = HTTP() reader = Reader() # writer = Writer() reader.open_excel('../lib/cases/HTTP接口用例.xls') # writer.copy_open('../lib/cases/HTTP接口用例.xls', '../lib/results/result-HTTP接口用例.xls') sheetname = reader.get_sheets() for sheet in sheetname: reader.set_sheet(sheet) for i in range(reader.rows): line = reader.readline() print(line) # 如果第一列或第二列不为空,则不是测试用例 if len(line[0]) > 0 or len(line[1]) > 0: pass else: print(line) func = getfunc(line, http) lenargs = getargs(func) run(func, lenargs, line)
elif len(params) == 3: func(line[4], line[5], line[6]) else: print('暂时不支持超过3个参数的关键字') # 读配置文件 config.get_config('./conf/conf.properties') logger.info(config.config) # 初始化数据库 mysql = Mysql() mysql.init_mysql('./conf/userinfo.sql') # 逐行读取excel reader = Reader() casename = 'Web' reader.open_excel('./lib/%s.xls' % casename) writer = Writer() writer.copy_open('./lib/%s.xls' % casename, './lib/result-%s.xls' % casename) sheetname = reader.get_sheets() writer.set_sheet(sheetname[0]) starttime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) writer.write(1, 3, starttime) reader.readline() casetype = reader.readline()[1] # 执行用例的关键字库对象 obj = None if casetype == 'HTTP' or casetype == '': # 执行http接口自动化
# -*- coding: UTF-8 -*- import inspect, sys, datetime from common.Excel import Reader, Writer reader = Reader() writer = Writer() alllist = [] runtype = 'WEB' # 反射获取关键字 def geffunc(line, http): func = None try: func = getattr(http, line[0]) except Exception as e: print(e) return func # 反射获取参数 def getargs(func): if func: args = inspect.getfullargspec(func).__str__() args = args[args.find('args=') + 5:args.find(', varargs')] args = eval(args) args.remove('self') l = len(args) return l else:
def get_res(self, result_path): #用于记录执行结果,逻辑行为,只要分组中出现一个失败,则认为改分组结果失败 self.sumarry.clear() status = 'Fail' #标识是否有失败 flag = True #统计测试用例的用例总数 totalcount = 0 #统计所有用例中通过用例的条数 totalpass = 0 reader = Reader() reader.open_excel(result_path) #获取所有sheet页面 sheetname = reader.get_sheets() for n in sheetname: #从第一个页面开始解析 reader.set_sheet(n) #获取当前sheeet的总行数,用来遍历 row = reader.rows #设置从第二行开始读 reader.r = 1 #遍历sheet里面所有用例 for i in range(1, row): line = reader.readline() #查找记录了分组信息的行 #如果第一列(分组信息)和第二列(类名或者用例名)不同时为空,则不是用例,执行非用例操作 # if not (line[0] == '' and line[1] == ''): if len(line[0]) > 0 or len(line[1]) > 0: pass #非用例行判断借宿 #第一列信息和第二列信息均为空的行,这时开始进行用例数、通过数、状态的统计 else: #判断执行结果列,如果为空,将flag置为false,是为改行有误,不纳入用例数量计算 if len(line) < 6 or len(line[7]) == '': flag = False #执行结果不为空,则将用例统计数自增 else: totalcount += 1 #如果通过,则通过数和总通过数均自增 if line[7] == 'PASS': totalpass += 1 else: #出现了用例执行结果不是pass的情况,则视为当前分组执行失败 flag = False #for循环结束 #所有用例执行概况 #计算执行通过率 #如果flag = True if flag: status = 'Pass' #计算通过率 try: p = int(totalpass * 10000 / totalcount) passrate = p / 100 except Exception as e: passrate = 0.0 logger.exception(e) #设置默认第一个sheet,用来读取runtype,title,StartTime,EndTime reader.set_sheet(sheetname[0]) self.sumarry['runtype'] = str(reader.getparameter('1', '1')) #请求方式 self.sumarry['title'] = str(reader.getparameter('1', '2')) #标题 self.sumarry['StartTime'] = str(reader.getparameter('2', '3')) #开始时间 self.sumarry['EndTime'] = str(reader.getparameter('2', '4')) # 结束时间 self.sumarry['casecount'] = str(totalcount) #用例总数 self.sumarry['passrate'] = str(passrate) + '%' #通过率 self.sumarry['status'] = status #结果 return self.sumarry
return if line[3] == 'gettext': func.gettext(line[4]) return if line[3] == 'assertequals': func.assertequals(line[4], line[5]) return if line[3] == 'intoiframe': func.intoiframe(line[4]) return if line[3] == 'outiframe': func.outiframe() return reader = Reader() func = Web() reader.open_excel('./lib/Web.xls') sheetname = reader.get_sheets() for sheet in sheetname: # 设置当前读取的sheet页面 reader.set_sheet(sheet) for i in range(reader.rows): line = reader.readline() print(line) runcase(line, func)
else: logger.warn("waring:框架暂时只支持3个参数!") if __name__ == "__main__": logger.info("整个框架使用该入口执行") #运行用例之前,初始化配置,初始化数据库 casename = 'XLSHTTP接口用例.xls' config.get_config('./lib/conf.properties') mysql = Mysql() mysql.init_mysql('./lib/userinfo.sql') #开始读取用例 reader = Reader() # http = HTTP() # reader.open_excel('./lib/HTTP接口用例.xls') reader.open_excel('./lib/' + casename) sheetname = reader.get_sheets() logger.info(sheetname) writer = Writer() # writer.copy_open('./lib/HTTP接口用例.xls', './lib/result-HTTP接口用例.xls') writer.copy_open('./lib/' + casename, './lib/result-' + casename) # sheetname = writer.get_sheets() #获取开始时间 t = str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) #设置shet页 writer.set_sheet(sheetname[0])
def get_groups(self, result_path): # 用于记录执行结果,逻辑为,只要分组中出现一个失败用例,则认为该分组执行失败,与flag联合使用。 #统计分组信息用的list self.groups.clear() # 每一个分组统计信息为列表,记录每一行的分组信息 groupinfo = [] status = "Fail" # 标识是否有失败 flag = True # 统计每一个分组的用例总条数 totalcount = 0 # 统计分组用例中通过用例的条数数 totalpass = 0 reader = Reader() reader.open_excel(result_path) # 获取所有sheet页面 for n in reader.get_sheets(): # logger.info(n) # 从第一个页面开始解析 reader.set_sheet(n) # 获取sheet的行数,用来遍历 row = reader.rows # 设置从第二行开始读 reader.r = 1 # 标识一个分组是否统计完, #每一个sheet进来的时候标识为True(整个整个sheet的统计,为0的时候保存分组信息名称) gflag = True # 遍历sheet里面所有用例 for i in range(1, row): #这里已经读取一行 line = reader.readline() # logger.info(line) # 查找记录了分组信息的行 # 如果第一列(分组信息,不等于空) if not line[0] == '': # 先保存上一步信息 # 如果不是sheet最开始(第一行),就保存上一个分组统计的全部信息 #已经读取一行了,所以为flase,sheet没有内容了为true if not gflag: # 标识是否有失败(flag),如果这一组统计完以后状态是pass,或者就是失败 if flag: status = 'pass' else: status = 'fail' # groupinfo 分组下面的每一行 groupinfo.append(totalcount) groupinfo.append(totalpass) groupinfo.append(status) self.groups.append(groupinfo) # 重置下一个分组的统计信息 # 每一个分组统计信息为列表 groupinfo = [] status = "Fail" # 标识是否有失败.重新置为true进入循环 flag = True # 统计每一个分组的用例总条数 totalcount = 0 # 统计分组用例中通过用例的条数数 totalpass = 0 # 保存分组名字 groupinfo.append(line[0]) # 表示当前分组未统计完 gflag = False # 第二列(类别或用例名)不同时为空,则不是用例,执行非用例的操作(去掉功能模块一列) elif not line[1] == '': # 不做统计 pass # 非用例行判断结束 # 第一列信息和第二列信息均为空的行,即用例行,这时开始进行用例数、通过数、状态的统计。 else: # 判断执行结果列,如果为空,将flag置为false,视为该行有误,不纳入用例数量计算 if len(line) < 7 or line[7] == '': flag = False # 执行结果不为空,则将用例统计数自增 else: totalcount = totalcount + 1 # logger.info(line) # 如果通过,则通过数和总通过数均自增 if line[7] == "PASS": totalpass += 1 else: # 出现了用例执行结果不是PASS的情况,则视为当前分组执行失败。 flag = False # 当一个sheet统计完成后,保存上一次统计的结果 if flag: status = 'pass' else: status = 'fail' groupinfo.append(totalcount) groupinfo.append(totalpass) groupinfo.append(status) self.groups.append(groupinfo) # 重置下一个分组的统计信息 # 每一个分组统计信息为列表,第二次的时候全部初始为空 groupinfo = [] # 标识是否有失败 flag = True # 统计每一个分组的用例总条数 totalcount = 0 # 统计分组用例中通过用例的条数数 totalpass = 0 return self.groups
# -*- coding: UTF-8 -*- import inspect, sys, datetime from common.Excel import Reader, Writer from common import logger import threading reader = Reader() writer = Writer() alllist = [] runtype = 'WEB' title ='' lock = threading.Lock() # 反射获取关键字 def geffunc(line, http): func = None try: func = getattr(http, line[0]) except Exception as e: print(e) return func # 反射获取参数 def getargs(func): if func: args = inspect.getfullargspec(func).__str__() args = args[args.find('args=') + 5:args.find(', varargs')] args = eval(args) args.remove('self') l = len(args)
def runCases(): global casepath, resultpath reader = Reader() writer = Writer() web = Web(writer) reader.open_excel(casepath) # 第一行 reader.readline() # 第二行 line = reader.readline() runtype = line[1] print(runtype) if runtype == 'WEB': obj = Web(writer) if runtype == 'HTTP': obj = HTTP(writer) writer.copy_open(casepath, resultpath) sheetname = reader.get_sheets() writer.set_sheet(sheetname[0]) writer.write(1, 3, str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) for sheet in sheetname: # 设置当前读写的sheet页面 reader.set_sheet(sheet) writer.set_sheet(sheet) # 默认写第7列 writer.clo = 7 for i in range(reader.rows): line = reader.readline() # 如果第一列或者第二列有内容,就是分组信息,不运行 if len(line[0]) > 0 or len(line[1]) > 0: pass else: # 从excel读取的每行数据 # logger.info(line) writer.row = i func = geffunc(line, obj) lenargs = getargs(func) run(func, lenargs, line) writer.set_sheet(sheetname[0]) writer.write(1, 4, str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) writer.save_close()
def get_res(self, result_path): self.sumarry.clear() status = 'Fail' # 标记是够有失败 flag = True # 测试用例总条数目 totalcount = 0 # 统计通过用例数 totalpass = 0 reader = Reader() reader.open_excel(result_path) reader.readline() line = reader.readline() self.sumarry['runtype'] = line[1] self.sumarry['title'] = line[2] self.sumarry['starttime'] = line[3] self.sumarry['endtime'] = line[4] for n in reader.get_sheets(): reader.set_sheet(n) row = reader.rows reader.r = 1 for i in range(1, row): line = reader.readline() if not (line[0] == '' and line[1] == ''): pass else: if len(line) < 7 or line[7] == '': flag = False else: totalcount = totalcount + 1 if line[7] == 'PASS': totalpass += 1 else: flag = False if flag: status = "Pass" try: p = int(totalpass * 10000 / totalcount) passrate = p / 100 except Exception as e: passrate = 0.0 logger.exception(e) self.sumarry["casecount"] = str(totalcount) # 通过率 self.sumarry["passrate"] = str(passrate) + '%' self.sumarry['status'] = status return self.sumarry
def get_res(self, result_path): # 用于记录执行结果,逻辑为,只要分组中出现一个失败用例,则认为该分组执行失败,与flag联合使用。 self.sumarry.clear() status = "Fail" # 标识是否有失败 flag = True # 统计测试用例集的用例总条数 totalcount = 0 # 统计所有用例中通过用例的条数数 totalpass = 0 reader = Reader() reader.open_excel(result_path) reader.readline() line = reader.readline() self.sumarry['runtype'] = line[1] self.sumarry['title'] = line[2] self.sumarry['starttime'] = line[3] self.sumarry['endtime'] = line[4] # 获取所有sheet页面 for n in reader.get_sheets(): # logger.info(n) # 从第一个页面开始解析 reader.set_sheet(n) # 获取sheet的行数,用来遍历 row = reader.rows # 设置从第二行开始读 reader.r = 1 # 遍历sheet里面所有用例 for i in range(1, row): line = reader.readline() # logger.info(line) # 查找记录了分组信息的行 # 如果第一列(分组信息)和第二列(类别或用例名)不同时为空,则不是用例,执行非用例的操作 if not (line[0] == '' and line[1] == ''): pass # 非用例行判断结束 # 第一列信息和第二列信息均为空的行,即用例行,这时开始进行用例数、通过数、状态的统计。 else: # 判断执行结果列,如果为空,将flag置为false,视为该行有误,不纳入用例数量计算 if len(line) < 7 or line[7] == '': flag = False # 执行结果不为空,则将用例统计数自增 else: totalcount = totalcount + 1 # logger.info(line) # 如果通过,则通过数和总通过数均自增 if line[7] == "PASS": totalpass += 1 else: # 出现了用例执行结果不是PASS的情况,则视为当前分组执行失败。 flag = False # for循环结束 # 所有用例执行概况 # logger.info(totalpass) # 计算执行通过率 if flag: status = "Pass" # 计算通过率 try: p = int(totalpass * 10000 / totalcount) passrate = p / 100 except Exception as e: passrate = 0.0 logger.exception(e) # 用例总数 self.sumarry["casecount"] = str(totalcount) # 通过率 self.sumarry["passrate"] = str(passrate) self.sumarry['status'] = status # logger.info(self.sumarry) return self.sumarry
def get_groups(self, result_path): # 用于记录执行结果,逻辑为,只要分组中出现一个失败用例,则认为该分组执行失败,与flag联合使用。 self.groups.clear() # 每一个分组统计信息为列表 groupinfo = [] status = "Fail" # 标识是否有失败 flag = True # 统计每一个分组的用例总条数 totalcount = 0 # 统计分组用例中通过用例的条数数 totalpass = 0 reader = Reader() reader.open_excel(result_path) # 获取所有sheet页面 for n in reader.get_sheets(): # logger.info(n) # 从第一个页面开始解析 reader.set_sheet(n) # 获取sheet的行数,用来遍历 row = reader.rows # 设置从第二行开始读 reader.r = 1 # 标识一个分组是否统计完 gflag = True # 遍历sheet里面所有用例 for i in range(1, row): line = reader.readline() # logger.info(line) # 查找记录了分组信息的行 # 如果第一列(分组信息) if not line[0] == '': # 先保存上一步信息 # 如果不是sheet最开始,就保存上一个分组统计的全部信息 if not gflag: if flag: status = 'pass' else: status = 'fail' groupinfo.append(totalcount) groupinfo.append(totalpass) groupinfo.append(status) self.groups.append(groupinfo) # 重置下一个分组的统计信息 # 每一个分组统计信息为列表 groupinfo = [] status = "Fail" # 标识是否有失败 flag = True # 统计每一个分组的用例总条数 totalcount = 0 # 统计分组用例中通过用例的条数数 totalpass = 0 # 保存分组名字 groupinfo.append(line[0]) # 表示当前分组未统计完 gflag = False # 第二列(类别或用例名)不同时为空,则不是用例,执行非用例的操作 elif not line[1] == '': # 不做统计 pass # 非用例行判断结束 # 第一列信息和第二列信息均为空的行,即用例行,这时开始进行用例数、通过数、状态的统计。 else: # 判断执行结果列,如果为空,将flag置为false,视为该行有误,不纳入用例数量计算 if len(line) < 7 or line[7] == '': flag = False # 执行结果不为空,则将用例统计数自增 else: totalcount = totalcount + 1 # logger.info(line) # 如果通过,则通过数和总通过数均自增 if line[7] == "PASS": totalpass += 1 else: # 出现了用例执行结果不是PASS的情况,则视为当前分组执行失败。 flag = False # 当一个sheet统计完成后,保存上一次统计的结果 if flag: status = 'pass' else: status = 'fail' groupinfo.append(totalcount) groupinfo.append(totalpass) groupinfo.append(status) self.groups.append(groupinfo) # 重置下一个分组的统计信息 # 每一个分组统计信息为列表 groupinfo = [] status = "Fail" # 标识是否有失败 flag = True # 统计每一个分组的用例总条数 totalcount = 0 # 统计分组用例中通过用例的条数数 totalpass = 0 return self.groups
func() return if len(args) == 1: func(line[4]) return if len(args) == 2: func(line[4], line[5]) return if len(args) == 3: func(line[4], line[5], line[6]) return print("warning: 目前仅支持三个以内的参数") casename = "SOAP" reader = Reader() reader.open_excel("./lib/cases/" + casename + ".xls") writer = Writer() writer.copy_open('./lib/cases/' + casename + '.xls', './lib/results/' + casename + '-result.xls') sheetnames = writer.get_sheets() reader.readline() caseType = reader.readline()[1] http = None if caseType == 'HTTP': http = HTTP(writer) elif caseType == 'SOAP': http = SOAP(writer) #开始执行时间