# -*- coding: utf-8 -*- import sys,os,time reload(sys) sys.setdefaultencoding('utf-8') from utils.test_task import * from utils.platform_Util import * from sat_environment import * from utils import * from core.process_sync import * import shutil,json from runner import runner_sender class ResultTool(ProcessSync): Result_DIR = getResultDir() Result_DETAIL = "detail" Result_Total_XSL = r"config/all-result.xsl" Result_Detail_XSL = r"config/case_result_detail.xsl" Python_Home = sys.prefix Action_DetailResult = "detail_result" Action_CaseResult = "case_result" Key_CaseName = "case_name" Key_CaseResult = "case_result" Key_ItemName = "item_name" Key_ItemResult = "item_result" Key_ItemScreen = "item_screen" Key_ItemLog = "item_log" File_Name = "unknown" def __init__(self, resultxml = "all-result.xml"): print "Init ResultTool" ProcessSync.__init__(self) ResultTool.updateBaseDir(getResultDir()) self.Result_XMLFile = ResultTool.Result_DIR + "/" +resultxml self.task = xml_util.parseAllResult(self.Result_XMLFile) self.Case_Result = "NotExcuted" self.detailItemIndex = 0 self.caseName = "" def continueNextItem(self, itemName, itemDesc="None"): self.detailItemIndex += 1 runner_sender.sendActionStart(self.tc.name, self.detailItemIndex, itemName, itemDesc) def setNextItem(self, itemName, itemIndex, itemDesc="None"): self.detailItemIndex = itemIndex runner_sender.sendActionStart(self.tc.name, self.detailItemIndex, itemName, itemDesc) # 通过Script_Activity告诉ResultTool,当前脚本名,用于拼接结果文件保存路径 @staticmethod def setFileName(fileName): ResultTool.File_Name = fileName @staticmethod def checkResultDIR(): ResultTool.mkCHdir(ResultTool.Result_DIR) ResultTool.mkCHdir(ResultTool.Result_DIR_DETAIL) ResultTool.mkCHdir(ResultTool.Result_DIR_LOG) ResultTool.mkCHdir(ResultTool.Result_DIR_SCREEN) ResultTool.mkCHdir(ResultTool.Result_DIR_SCRIPTS) @staticmethod def mkCHdir(dir): #print "mkCHdir,dir=", dir if (os.path.exists(dir)): return #例如:D:/SAT/result_schedule_id_schedule_name_task_number//detail #os.path.splite结果:('D:/SAT/result_schedule_id_schedule_name_task_number', 'detail') #过滤//多个分割符的情况 preDir = os.path.split(dir)[0] #print "mkdir,preDir=", preDir if (not os.path.exists(preDir)): ResultTool.mkCHdir(preDir) #防止目录字符串最后带有/的情况,会出现两次创建同一个目录 #例如: D:/SAT/。会创建D:/SAT和D:/SAT/ if (not os.path.exists(dir)): os.mkdir(dir) @staticmethod def copyInitFile(): Result_Total_XSL_Path = ResultTool.Python_Home + Environment.SDK_Relative_Path + ResultTool.Result_Total_XSL Result_Detail_XSL_Path = ResultTool.Python_Home + Environment.SDK_Relative_Path + ResultTool.Result_Detail_XSL shutil.copyfile(Result_Total_XSL_Path, ResultTool.Result_DIR + "/all-result.xsl") shutil.copyfile(Result_Detail_XSL_Path, ResultTool.Result_DIR_DETAIL + "/case_result_detail.xsl") @staticmethod def updateBaseDir(dir): print "updateBaseDir,dir=",dir ResultTool.Result_DIR = unicode(dir) ResultTool.Result_DIR_DETAIL = ResultTool.Result_DIR + "/" + ResultTool.Result_DETAIL ResultTool.Result_DIR_LOG = ResultTool.Result_DIR + "/adb_log/" + ResultTool.File_Name ResultTool.Result_DIR_SCREEN = ResultTool.Result_DIR + "/screen/" + ResultTool.File_Name ResultTool.Result_DIR_SCRIPTS = ResultTool.Result_DIR + "/scripts/" + ResultTool.File_Name ResultTool.checkResultDIR() ResultTool.copyInitFile() @staticmethod def setBaseDir(dir): setResultDir(dir) def getBaseDir(self): return ResultTool.Result_DIR def getDetailDir(self): return ResultTool.Result_DIR_DETAIL def getLogDir(self): return ResultTool.Result_DIR_LOG def getScreenDir(self): return ResultTool.Result_DIR_SCREEN def addTestCase(self, caseName): tcase = self.task.getCaseByName(caseName) if (tcase == None): self.tc = TestCase() self.tc.name = caseName self.task.addTestCase(self.tc) else: self.tc = tcase return self.tc def getItemByName(self, itemlist, itemname): for item in itemlist: if (item.name == itemname): return item return None def addItemPicture(self, casename, picpath): # print "addItemPicture,",casename, picpath destPicDir = os.path.join(self.getScreenDir(), casename) self.mkCHdir(destPicDir) destPicPath = os.path.join(destPicDir,os.path.basename(picpath)) if os.path.isdir(destPicPath): print u"图片路径为空" return "" try: shutil.copy(picpath,destPicPath) except IOError, e: print u"拷贝图片失败" print e return casename + "/" + os.path.basename(picpath), os.path.basename(picpath) def saveDetailResult2(self, destxml, itemname, result, picNameList, logName, data="",remark=""): print "saveDetailResult2,picNameList:", picNameList print "saveDetailResult:",destxml itemList = xml_util.parseDetailResult(destxml.decode('utf-8')) item = self.getItemByName(itemList,itemname) if (item == None): item = Item() item.name = itemname itemList.append(item) item.result = result del item.screenPathList[:] for picName in picNameList: item.screenPathList.append("../screen/" + picName) if logName <> "": item.logPath = "../log/" + logName item.data =data item.remark = remark xml_util.saveDetailResult(destxml.decode('utf-8'), itemList) """ picpathList:图片路径数组.最多存储6张图片 """ def saveDetailResult(self, xmlName, itemname, result, picpathList, logpath="", data="", remark=""): xmlPath = ResultTool.Result_DIR_DETAIL + "/"+ xmlName # print "saveDetailResult,xmlPath=", xmlPath # print "saveDetailResult,picpathList:", picpathList if (result == "Fail"): self.Case_Result = result #兼容之前的参数字符串定义 picList = [] if (type(picpathList) == type("") and picpathList <> "")\ or (type(picpathList) == type(u"") and picpathList <> u""): # print u"screen字符串" picList.append(picpathList) else: picList = picpathList # print "saveDetailResult,picList:", picList rePicNameList = [] picNameList = [] for picpath in picList: if picpath.__len__() < 5: break rePicName, picName = self.addItemPicture(self.tc.name, picpath) rePicNameList.append(rePicName) picNameList.append(picName) logname = os.path.basename(logpath) self.saveDetailResult2(xmlPath, itemname, result,rePicNameList, logname, data, remark) destPicDir = os.path.join(self.getScreenDir(), self.tc.name) runner_sender.sendActionResult(self.tc.name, self.detailItemIndex, itemname, "", result, remark, destPicDir,"", picNameList,"",data) def saveCaseResult2(self, result, detailFilePath): self.tc.result = result self.tc.rdetail = detailFilePath #print "saveCaseResult2,Result_XMLFile=", self.Result_XMLFile xml_util.saveAllResult(self.task, self.Result_XMLFile.decode('utf-8')) #Packet case result #兼容制定测试用例名,和不指定测试用例的情况 def saveCaseResult(self,result, detailFileName): #detailFilePath = ResultTool.Result_DIR + detailFileName detailFilePath = ResultTool.Result_DETAIL + "/"+detailFileName self.Case_Result = result self.saveCaseResult2(self.Case_Result, detailFilePath) runner_sender.sendCaseResult(self.tc.name, self.detailItemIndex, result, "", "", "") if __name__ == "__main__": # Result_XMLFile = "all-result.xml" # detailXml = "test-result.xml" # # ResultTool.setBaseDir(u"D:/SAT/中文测试/") # reTool = ResultTool(Result_XMLFile) # reTool.addTestCase("中文测试") # reTool.saveDetailResult(detailXml, "测试", "Pass", "item2.png&item3.png", "log.txt") # reTool.saveCaseResult("Fail", detailXml) destxml = r"E:\SAT\results\detail\source_select_result.xml" itemList = xml_util.parseDetailResult(destxml.decode('utf-8')) print "itemList:",itemList for item in itemList: print "item.name:",item.name print "item.data:",item.data print "item.remark:",item.remark print "item.result:",item.result,type(item.result) print "item.screenPathList:",item.screenPathList # itemScreenPathList = item.screenPathList # imageName = print "item.logPath:",item.logPath